error 380 no se puede configurar value

02/09/2007 - 03:18 por Ivan | Informe spam
hola a todos,

a ver si podeis ayudarme porque me estoy volviendo majara.(si es que consigo explicarme)

1º tengo una lista en una hoja [Hoja2] con 9 columnas, de las cuales la 1º (numerica) es una clave unica, la 2ª es la
concatenacion de las 3 siguientes[c,d,e] que son nombre y apellidos, la siguiente [f] es nº (edad), y las restantes
texto

2º tengo un formulario con:

a) 8 combos que se rellenan con los registros unicos de otros tantos campos de la lista (todos menos B que la cargo
en un label)
b) 1 listbox de 6 columnas que se carga con las columnas a, b, f,g,h,i [de inicio con todos los registros y despues
segun las coincidencias al cambiar algun combo, previo filtro avanzado]
c) diversos botones, de los cuales los que interesan son,
.- uno que se encarga de poner el listindex de todos los combos a -1, borra el list y establece la propiedad
style de los combos en 0 para poder editarlos
.- otro que se encarga de lo contrario, es decir, renueva los combos, carga el listbox, 'sincroniza' (ahora
comento como) los combos y el listbox y establece la prop. style de los combos a 2 para impedir la edicion

3º el funcionamiento mas o menos es:

.-al cargar el form se cargan los combos y el listbox, y se sincronizan todos los combos con el 1er item del list,
es decir muestran su campo correspondiente de dicho registro
.- despues si pej. se selecciona otro item del list se actualizan los combos, o si se selecciona cualquier otro item
en un combo se actualiza el list solo con las coincidencias y se cargan/sincronizan los restantes combos con el [nuevo]
primer item del list

todo esto parece funcionar sin problemas. Este aparece cuando, tras borrar el list y poner los combos a -1 y
volverlos editables con style hago las modificaciones pertinenete y le doy al boton ' Ver todo' que vuelve a cargar el
list y sincronizar los combos y a inhabilitarlos con style. Entonces, no solo no me carga el list, sino que al
selecionar un item en cualquiera de los combos me da el error 380 No se puede configurar la propiedad value. Valor de
propiedad no valido y me maraca la linea que indico del proc. sincronizar_combos

pero ademas hay 2 'curiosidades':

1º el error me da dentro del bucle que actualiza/sincroniza los combos, pero me da al llegar al 5, es decir, la edad
(numerico), da igual el combo que haya manipulado, ... y por mas que he mirado no consigo ver una diferencia con los
otros en ninguna propiedad, y sin embargo si me rellena los anteriores.

2º si elimino la manipulacion de style funciona sin problemas, pero claro, o los inhabilito con enabled o/y locked [que
no parecen ofrecerme la total disponibilidad de los datos del combo], o permito la edicion

bueno, disculpad el rollo y pongo de momento las partes de codigo que creo podrian estar en la pomada [es bastante, pero
espero que aclare algo]:

'*********
' para evitar que se disparen los eventos [seguramente serian unificables pero de momento..]
Dim SinEventos As Boolean, Modificando As Boolean
'--
' ej. de uno de los combos (el jod...o 5). todos son igual
Private Sub ComboBox5_Change()
If Not Modificando Then _
If Not SinEventos Then CargarListbox ComboBox5: SincronizarCombos
End Sub
'-
' en estos botones el orden de los proc. y variables ya no lo tengo nada claro, pues les he dado 1000 vueltas
'boton deseleccionar/borrar/habilitar combos
Private Sub CommandButton1_Click()
If Not Modificando Then
Modificando = True
BorrarCombos
Hoja3.[m:r].Clear
End If
BloquearCombos False
ComboBox1 = Application.Max(Hoja2.Range("a2:a" & Hoja2.[a65536].End(xlUp).Row)) + 1
End Sub
'-
' boton ver todos/sincronizar/inhabilitar
Private Sub CommandButton9_Click()
Cargar_Combos
Modificando = False
ComboBox1.ListIndex = 0
CargarListbox
SincronizarCombos
BloquearCombos True
End Sub
'--
' el de la discordia. el error me marca exactamente esta parte:
' "Controls("ComboBox" & n) = celda.Offset(, n) Else"
Sub SincronizarCombos()
Dim celda As Range, n As Byte, clave As Long
SinEventos = True
BorrarCombos
With ListBox1
If .ListCount < 1 Then Exit Sub
If .ListIndex < 0 Then .ListIndex = 0
Label9 = .Value
clave = DatoValido(.Text)
End With
With Hoja2
Set celda = .Range(.[a1], .[a65536].End(xlUp)).Find(clave, _
.[a1], xlValues, xlWhole)
If Not celda Is Nothing Then
For n = 1 To 8
If n > 1 Then Controls("ComboBox" & n) = celda.Offset(, n) _
Else ComboBox1 = celda
Next
Set celda = Nothing
End If
End With
SinEventos = False
End Sub
'--
' cambia style de los combos
Sub BloquearCombos(Bloquear As Boolean)
Dim n As Byte
For n = 2 To 8
Controls("ComboBox" & n).Style = -2 * Bloquear
Next
End Sub
'-
' deselecciona los combos
Sub BorrarCombos()
Dim n As Byte
For n = 1 To 8
Controls("ComboBox" & n).ListIndex = -1
Next
End Sub
' --
' para cargar el listbox
Sub CargarListbox(Optional Combo As MSForms.ComboBox = Nothing)
Dim utF As Long
Application.ScreenUpdating = False
With Hoja2
On Error Resume Next: .ShowAllData: On Error GoTo 0
utF = .[a65536].End(xlUp).Row: .[k1:k2].ClearContents
If utF < 2 Then Exit Sub
SinEventos = True
Hoja3.[k:r].ClearContents
If Not Combo Is Nothing Then
If Combo = "" Then SinEventos = False: Exit Sub
Dim ref As String, c As Byte
c = CByte(Right(Combo.Name, 1))
If c > 1 Then c = c + 1
ref = .Cells(2, c).Address(0, 0)
.[k2].Formula = "=(" & ref & "=" & DatoValido(Combo) & ")"
.Range("a1:i" & utF).AdvancedFilter Action:=xlFilterInPlace, _
CriteriaRange:=.[k1:k2], Unique:=True
End If
.Range("a1:b" & utF & ",f1:i" & utF).SpecialCells(xlCellTypeVisible).Copy
Hoja3.[m1].PasteSpecial xlPasteValues
With Hoja3
utF = .[m65536].End(xlUp).Row
If utF > 1 Then
AjustarColumnasList .[m1:r1], ListBox1
With ListBox1: .ColumnHeads = True
.RowSource = "Oculta!m2:r" & utF: End With
End If
End With
SinEventos = False
Application.CutCopyMode = False
On Error Resume Next: .ShowAllData: On Error GoTo 0: .[k2].Clear
End With
End Sub
'
' para pasar el contenido de los controles a find, filtros etc ( no estoy seguro de hasta que punto esta bien, _
' ni es necesaria, pero tras las peleas con las fechas suelo usarla por si acaso)
Function DatoValido(ByVal dato As Variant) As Variant
If dato = "" Then
DatoValido = ""
ElseIf IsDate(dato) Then
DatoValido = CLng(CDate(dato))
ElseIf IsNumeric(dato) Then
DatoValido = Val(dato)
Else
DatoValido = """" & dato & """"
End If
End Function

bueno disculpad el rollo, y si conseguis ver el problema os lo agradezco

un saludo
Ivan

PD: se nombran algunos proc. que no he trascrito pero que no creo que influyan

Preguntas similare

Leer las respuestas

#1 Ivan
02/09/2007 - 05:34 | Informe spam
hola de nuevo,

de momento 'CASI' he conseguido salvar el problema incluyendo BloquearCombos al peincipio [false] y al final [true] en
los proc. cargarCombos (no esta en el mensaje) y sincronizar combos, y quitandolo de ver todo,

pero el casi es que ahora el contenido del combobox 5 no me lo muestra. Se rellena y me permite seleccionarlo, e incluso
hace su funcion, es decir, sincroniza combos y listbox, pero no se muestra el text.Todos los demas, anteriores y
posteriores, se sincronizan perfectamente

Le he vuelto a dar mil vueltas pero no consigo ver nada

si se os ocurre la propiedad o lo que sea que pueda haber tocado o haciendo mal [y no consigo ver] os lo agradezco

un saludo
Ivan
Respuesta Responder a este mensaje
#2 Héctor Miguel
02/09/2007 - 08:02 | Informe spam
hola, Ivan !

las dos variables que declaras al inicio de tus codigos [que al parecer pudiera necesitarse solo una de las dos]

' para evitar que se disparen los eventos [seguramente serian unificables pero de momento..]
Dim SinEventos As Boolean, Modificando As Boolean



1) son tan importantes que de su *estado* [true o false] depende la ejecucion de algunos eventos
[p.e.] el de los combos -como el jod...o 5 de la edad-

' ej. de uno de los combos (el jod...o 5). todos son igual
Private Sub ComboBox5_Change()
If Not Modificando Then _
If Not SinEventos Then CargarListbox ComboBox5: SincronizarCombos
End Sub



a) SOLO se ejecutan cuando Modificando Y SinEventos estan en estado de *false* [es decir]
cuando AMBAS variables estan en false, se ejecutan CargarListBox [con el listindex del combo] Y SincronizarCombos

b) si cualquiera de ellas esta en *True* [obviamente] el evento '_change' de cada combo NO SE DISPARA
[revisa si es *correcto* que solo cuando ambas sean *false* es que el evento *debiera* dispararse] -???-

2) el procedimiento *BorrarCombos*, lo unico que hace es *vaciar* la seleccion del combo poniendo su ListIndex en -1
*esto* DEBIERA ser un movimiento que puede *disparar* el evento '_change' de los combos...
-> habria que revisar cual es el *estado* -en ese momento- de AMBAS variables [requerido en False para ambas] -???-

3) el evento '_click' de los commandbutton 1 y 9 SOLO *administran* la variable *Modificando*... [y el estado de *la otra* es... ???]
los procedimientos *SincronizarCombos* y *CargarListbox* SOLO *administran* la variable *SinEventos*... [y *la otra* es... ???]

4) que es lo que hace el procedimiento *Cargar_Combos* que no expones ? [y cuales variables *administra* y como lo hace] -???-

[creo que +/- por lo anterior es por donde andan *los tiros*] -?-

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

__ la consulta original __
hola a todos,

a ver si podeis ayudarme porque me estoy volviendo majara.(si es que consigo explicarme)

1º tengo una lista en una hoja [Hoja2] con 9 columnas, de las cuales la 1º (numerica) es una clave unica
la 2ª es la concatenacion de las 3 siguientes[c,d,e] que son nombre y apellidos, la siguiente [f] es nº (edad)
y las restantes texto

2º tengo un formulario con:

a) 8 combos que se rellenan con los registros unicos de otros tantos campos de la lista (todos menos B que la cargo en un label)
b) 1 listbox de 6 columnas que se carga con las columnas a, b, f,g,h,i [de inicio con todos los registros
y despues segun las coincidencias al cambiar algun combo, previo filtro avanzado]
c) diversos botones, de los cuales los que interesan son,
.- uno que se encarga de poner el listindex de todos los combos a -1, borra el list
y establece la propiedad style de los combos en 0 para poder editarlos
.- otro que se encarga de lo contrario, es decir, renueva los combos, carga el listbox, 'sincroniza' (ahora comento como)
los combos y el listbox y establece la prop. style de los combos a 2 para impedir la edicion

3º el funcionamiento mas o menos es:

.-al cargar el form se cargan los combos y el listbox, y se sincronizan todos los combos con el 1er item del list
es decir muestran su campo correspondiente de dicho registro
.- despues si pej. se selecciona otro item del list se actualizan los combos, o si se selecciona cualquier otro item en un combo
se actualiza el list solo con las coincidencias y se cargan/sincronizan los restantes combos con el [nuevo] primer item del list

todo esto parece funcionar sin problemas. Este aparece cuando, tras borrar el list y poner los combos a -1
y volverlos editables con style hago las modificaciones pertinenete y le doy al boton ' Ver todo' que vuelve a cargar el list
y sincronizar los combos y a inhabilitarlos con style. Entonces, no solo no me carga el list, sino que al selecionar un item
en cualquiera de los combos me da el error 380 No se puede configurar la propiedad value. Valor de propiedad no valido
y me maraca la linea que indico del proc. sincronizar_combos

pero ademas hay 2 'curiosidades':

1º el error me da dentro del bucle que actualiza/sincroniza los combos, pero me da al llegar al 5, es decir, la edad (numerico)
da igual el combo que haya manipulado, ... y por mas que he mirado no consigo ver una diferencia con los otros en ninguna propiedad
y sin embargo si me rellena los anteriores.

2º si elimino la manipulacion de style funciona sin problemas, pero claro, o los inhabilito con enabled o/y locked [que no parecen ofrecerme la total disponibilidad de los datos del combo], o permito la edicion

... pongo de momento las partes de codigo que creo podrian estar en la pomada [es bastante, pero espero que aclare algo]:

'*********
' para evitar que se disparen los eventos [seguramente serian unificables pero de momento..]
Dim SinEventos As Boolean, Modificando As Boolean
'--
' ej. de uno de los combos (el jod...o 5). todos son igual
Private Sub ComboBox5_Change()
If Not Modificando Then _
If Not SinEventos Then CargarListbox ComboBox5: SincronizarCombos
End Sub
'-
' en estos botones el orden de los proc. y variables ya no lo tengo nada claro, pues les he dado 1000 vueltas
'boton deseleccionar/borrar/habilitar combos
Private Sub CommandButton1_Click()
If Not Modificando Then
Modificando = True
BorrarCombos
Hoja3.[m:r].Clear
End If
BloquearCombos False
ComboBox1 = Application.Max(Hoja2.Range("a2:a" & Hoja2.[a65536].End(xlUp).Row)) + 1
End Sub
'-
' boton ver todos/sincronizar/inhabilitar
Private Sub CommandButton9_Click()
Cargar_Combos
Modificando = False
ComboBox1.ListIndex = 0
CargarListbox
SincronizarCombos
BloquearCombos True
End Sub
'--
' el de la discordia. el error me marca exactamente esta parte:
' "Controls("ComboBox" & n) = celda.Offset(, n) Else"
Sub SincronizarCombos()
Dim celda As Range, n As Byte, clave As Long
SinEventos = True
BorrarCombos
With ListBox1
If .ListCount < 1 Then Exit Sub
If .ListIndex < 0 Then .ListIndex = 0
Label9 = .Value
clave = DatoValido(.Text)
End With
With Hoja2
Set celda = .Range(.[a1], .[a65536].End(xlUp)).Find(clave, _
.[a1], xlValues, xlWhole)
If Not celda Is Nothing Then
For n = 1 To 8
If n > 1 Then Controls("ComboBox" & n) = celda.Offset(, n) _
Else ComboBox1 = celda
Next
Set celda = Nothing
End If
End With
SinEventos = False
End Sub
'--
' cambia style de los combos
Sub BloquearCombos(Bloquear As Boolean)
Dim n As Byte
For n = 2 To 8
Controls("ComboBox" & n).Style = -2 * Bloquear
Next
End Sub
'-
' deselecciona los combos
Sub BorrarCombos()
Dim n As Byte
For n = 1 To 8
Controls("ComboBox" & n).ListIndex = -1
Next
End Sub
' --
' para cargar el listbox
Sub CargarListbox(Optional Combo As MSForms.ComboBox = Nothing)
Dim utF As Long
Application.ScreenUpdating = False
With Hoja2
On Error Resume Next: .ShowAllData: On Error GoTo 0
utF = .[a65536].End(xlUp).Row: .[k1:k2].ClearContents
If utF < 2 Then Exit Sub
SinEventos = True
Hoja3.[k:r].ClearContents
If Not Combo Is Nothing Then
If Combo = "" Then SinEventos = False: Exit Sub
Dim ref As String, c As Byte
c = CByte(Right(Combo.Name, 1))
If c > 1 Then c = c + 1
ref = .Cells(2, c).Address(0, 0)
.[k2].Formula = "=(" & ref & "=" & DatoValido(Combo) & ")"
.Range("a1:i" & utF).AdvancedFilter Action:=xlFilterInPlace, _
CriteriaRange:=.[k1:k2], Unique:=True
End If
.Range("a1:b" & utF & ",f1:i" & utF).SpecialCells(xlCellTypeVisible).Copy
Hoja3.[m1].PasteSpecial xlPasteValues
With Hoja3
utF = .[m65536].End(xlUp).Row
If utF > 1 Then
AjustarColumnasList .[m1:r1], ListBox1
With ListBox1: .ColumnHeads = True
.RowSource = "Oculta!m2:r" & utF: End With
End If
End With
SinEventos = False
Application.CutCopyMode = False
On Error Resume Next: .ShowAllData: On Error GoTo 0: .[k2].Clear
End With
End Sub
'
' para pasar el contenido de los controles a find, filtros etc (no estoy seguro de hasta que punto esta bien, _
' ni es necesaria, pero tras las peleas con las fechas suelo usarla por si acaso)
Function DatoValido(ByVal dato As Variant) As Variant
If dato = "" Then
DatoValido = ""
ElseIf IsDate(dato) Then
DatoValido = CLng(CDate(dato))
ElseIf IsNumeric(dato) Then
DatoValido = Val(dato)
Else
DatoValido = """" & dato & """"
End If
End Function

bueno disculpad el rollo, y si conseguis ver el problema os lo agradezco

un saludo
Ivan

PD: se nombran algunos proc. que no he trascrito pero que no creo que influyan
Respuesta Responder a este mensaje
#3 Héctor Miguel
02/09/2007 - 08:13 | Informe spam
hola [de nuevo], Ivan !

re-revisando tus codigos... revisa esta posibilidad...

' el de la discordia. el error me marca exactamente esta parte:
' "Controls("ComboBox" & n) = celda.Offset(, n) Else"
Sub SincronizarCombos()
Dim celda As Range, n As Byte, clave As Long [...]





a la variable *clave* le asignas un tipo de datos *Long* PERO... esta instruccion *manda a validar* el dato...

clave = DatoValido(.Text)





y... lo que *devuelve* la funcion que *valida* el dato para asignarlo a una variable de tipo Long es... -???-
[pero no dejes de *observar/analizar/...* cual es el estado de las otras variables cuando sucede algun evento] -?-

saludos,
hector.

' para pasar el contenido de los controles a find, filtros etc (no estoy seguro de hasta que punto esta bien, _
' ni es necesaria, pero tras las peleas con las fechas suelo usarla por si acaso)
Function DatoValido(ByVal dato As Variant) As Variant
If dato = "" Then
DatoValido = ""
ElseIf IsDate(dato) Then
DatoValido = CLng(CDate(dato))
ElseIf IsNumeric(dato) Then
DatoValido = Val(dato)
Else
DatoValido = """" & dato & """"
End If
End Function
Respuesta Responder a este mensaje
#4 Ivan
02/09/2007 - 13:51 | Informe spam
hola Hector,

muchas gracias de nuevo. Ahora tengo que salir pero esta tarde, en cuanto pueda le doy un repaso tranquilo (y
fresquito) a las variables a ver dode se me escapan.

entre tanto y por si pudiera influir te pongo el proc. CargarCombos Y AjustarColumnasList

Sub AjustarColumnasList(rango As Range, ListB As MSForms.ListBox)
Dim n As Byte, ColWidths As String
With rango
.EntireColumn.AutoFit
For n = 1 To .Columns.Count
If n > 1 Then ColWidths = ColWidths & ";" & .Cells(1, n).Width _
Else ColWidths = .Cells(1, n).Width
Next
ListB.Font.Size = .Cells(1).Font.Size
ListB.ColumnCount = .Columns.Count
End With
ListB.ColumnWidths = ColWidths
End Sub
Sub Cargar_Combos()
Dim n As Byte, c As Byte, ultF As Long
SinEventos = True
BloquearCombos False
With Hoja2
For n = 1 To 8
If n > 1 Then c = n + 1 Else c = 1
.[iv:iv].ClearContents
.Range(.Cells(1, c), .Cells(65536, c).End(xlUp)).AdvancedFilter _
Action:=xlFilterCopy, CriteriaRange:="", CopyToRange:=.[iv1], _
Unique:=True
ultF = .[iv65536].End(xlUp).Row
If ultF > 1 Then
If ultF > 2 Then
.Range("iv1:iv" & ultF).Sort Key1:=.[iv2], _
order1:=xlAscending, Header:=xlYes
Controls("ComboBox" & n).List = _
.Range("iv2:iv" & .[iv65536].End(xlUp).Row).Value
Else
Controls("ComboBox" & n).AddItem .[iv2].Value
End If
End If
If n = 1 Then ComboBox1.Text = .[iv2].Value
Next
.[iv:iv].Clear
End With
BloquearCombos True
SinEventos = False
End Sub


un saludo
Ivan
Respuesta Responder a este mensaje
#5 Ivan
03/09/2007 - 02:49 | Informe spam
hola Hector, muchas gracias de nuevo

primero te expongo la conclusion a la que he llegado, por si sabes la explicacion o si estoy equivocandome, y/o si hay
forma de evitar el problema, y luego te comento un poco tus respuestas

parece que el problema me lo esta dando en la combinacion =>> 'frmStyleDropDownList <-> dato NO de texto'

despues de una limpieza [que despues te comento] de los codigos y mas o menos controladas las posibles
contradicciones/repeteciones, el problema es que si bloqueo los combos con Style=2 y los datos en la hoja no son texto,
no reconoce la coincidencia del dato de la hoja en la lista del combo.

Si convierto a texto el dato en la hoja si me lo reconoce, pero con cstr no lo hace. Igualmente si dejo style en 0 si
reconoce nros y fechas sin problema

me imagino que estoy ante otra variante de los conflictos entre config. regional y vba-uscentric [¿o quizas sea otro
problema de 2002xp?], pero con la entrada de style en escena, no se por donde tirar. He probado infinidad de
combinaciones/coversiones sin resultado

bueno, si se te ocurre por donde va la cosa o lo que estoy haciendo mal te lo agradezco nuevamente

en cuanto a los codigos te comento un poco: se trata de unas pruebas con un archivo de un consultante [de otro foro] con
un formulario de introduccion de datos. La cosa en un principio es sencilla, pero como siempre acabo complicandome la
vida y yendome por la tangente

las dos variables que declaras al inicio de tus codigos [que al parecer pudiera necesitarse solo una de las dos]
1) son tan importantes que de su *estado* [true o false] depende la ejecucion de algunos eventos



en realidad venian de pruebas independientes pero, aun siendo +/- consciente de lo innecesario de la duplicidad mi
conservadurismo (llamale miedo) inicial en estos menesteres me hizo mantenerlas en un pincipio. Ya estan unificadas, y


[revisa si es *correcto* que solo cuando ambas sean *false* es que el evento *debiera* dispararse] -???-



[creo que] +/- revisado

3) el evento '_click' de los commandbutton 1 y 9 SOLO *administran* la variable *Modificando*... [y el estado de *la
otra* es... ???]
los procedimientos *SincronizarCombos* y *CargarListbox* SOLO *administran* la variable *SinEventos*... [y *la
otra* es... ???]



la variable 'modificando solo debia ser true en el momento en que los combos son editables para evitar que al introducir
nuevos datos se disparara ningun evento, mientras que sineventos [como ya habras visto] es para evitar que cada vez que
determinados procedimientos modifican el combo/listbox se disparen estos si no nos interesa

de momento se ha quedado solo SinEventos, que, aparte de ponerla a true en el boton 'Nuevo' (commandbutton 1) se
administra al principio y al final [true/false]de los procedimientos: CargarCombos, CargarListbox y SincronizarCombos

en cuanto al proc. DatoValido en realidad era (sobre todo) para pasar formulas a las celdas y usarlas como criterio,
pero ahi me lie y la meti.

4) que es lo que hace el procedimiento *Cargar_Combos* que no expones ? [y cuales variables *administra* y como lo
hace] -???-



te pongo todo el modulo [todavia faltan cosas, como la carga en la hoja, pero creo que te haras una idea] que no es
excesivo[al menos no mucho mas que el anterior mensaje], sobre todo, aparte de por si el error viniera de algo que yo no
veo, para que, aunque yo le he dado una cura de urgencia, si quieres, le 'apliques los tratamientos' que creas
oportunos. Siempre se agradecen las manos de un buen cirujano a la hora de operar.

los botones que no mencione antes, creo que son bastante evidentes (llevan su caption/uso en comentario):

'****************************************modulo formulario datos

Option Explicit
Dim SinEventos As Boolean
'--combos datos
Private Sub ComboBox1_Change() 'nº ficha
If Not SinEventos Then CargarListbox ComboBox1: SincronizarCombos
End Sub
Private Sub ComboBox2_Change() 'nombre
If Not SinEventos Then CargarListbox ComboBox2: SincronizarCombos
End Sub
Private Sub ComboBox3_Change() '1er apellido
If Not SinEventos Then CargarListbox ComboBox3: SincronizarCombos
End Sub
Private Sub ComboBox4_Change() '2º apellido
If Not SinEventos Then CargarListbox ComboBox4: SincronizarCombos
End Sub
Private Sub ComboBox5_Change() 'edad
If Not SinEventos Then CargarListbox ComboBox5: SincronizarCombos
End Sub
Private Sub ComboBox6_Change() 'sexo
If Not SinEventos Then CargarListbox ComboBox6: SincronizarCombos
End Sub
Private Sub ComboBox7_Change() 'profesion
If Not SinEventos Then CargarListbox ComboBox7: SincronizarCombos
End Sub
Private Sub ComboBox8_Change() 'localidad
If Not SinEventos Then CargarListbox ComboBox8: SincronizarCombos
End Sub
'--pone en modo edicion los combos
'boton 'nuevo' para agregar registros (le faltan los proc. de carga en hoja)
'debloquea los combos e inhabilita los eventos
Private Sub CommandButton1_Click()
SinEventos = True
BorrarCombos
BloquearCombos False
ComboBox1 = Application.Max(Hoja2.Range("a2:a" & _
Hoja2.[a65536].End(xlUp).Row)) + 1
End Sub
'botones para moverse por el listbox
Private Sub CommandButton2_Click() 'siguiente
With ListBox1: .ListIndex = .ListIndex + 1: End With
End Sub
Private Sub CommandButton3_Click() 'anterior
With ListBox1: .ListIndex = .ListIndex - 1: End With
End Sub
Private Sub CommandButton4_Click() 'primero
ListBox1.ListIndex = 0
End Sub
Private Sub CommandButton5_Click() 'ultimo
With ListBox1: .ListIndex = .ListCount - 1: End With
End Sub
'--salir
Private Sub CommandButton8_Click(): Unload Me: End Sub 'salir
'salir del modo edicion
'vuelve a cargar list y combos con todos los registros y los bloquea
Private Sub CommandButton9_Click()
Cargar_Combos
CargarListbox
SincronizarCombos
End Sub
'eventos del listbox
'habilita/deshabilita botones de moverse en listbox si solo 1, o 1º, o ult.
Private Sub ListBox1_Change()
HabilitarMoverse
End Sub
'sincronizar los combos y botones moverse
Private Sub ListBox1_Click()
If Not SinEventos Then SincronizarCombos
HabilitarMoverse
End Sub
'
Private Sub UserForm_Initialize()
Dim uF As Long
With Hoja2
ComboBox9.Column = .[a1:i1].Value
With ComboBox9
.AddItem "Automatico": .ListIndex = .ListCount - 1
End With
End With
Cargar_Combos
CargarListbox
SincronizarCombos
ComboBox1.SetFocus
End Sub
'-procedimientos
'si se llama sin argumento carga el listbox con todos los registros,
'pasandole un combo, carga las coincidencias de la seleccion en este
Sub CargarListbox(Optional Combo As MSForms.ComboBox = Nothing)
Dim utF As Long
Application.ScreenUpdating = False
With Hoja2
On Error Resume Next: .ShowAllData: On Error GoTo 0
utF = .[a65536].End(xlUp).Row
If utF < 2 Then Exit Sub
SinEventos = True: Hoja3.[m:r].Clear
If Not Combo Is Nothing Then
Dim ref As String, c As Byte
c = CByte(Right(Combo.Name, 1)): .[l1:l2].Clear
If c > 1 Then c = c + 1
ref = .Cells(2, c).Address(0, 0)
.[l2].Formula = "=(" & ref & "=" & DatoValido(Combo) & ")"
.Range("a1:i" & utF).AdvancedFilter Action:=xlFilterInPlace, _
CriteriaRange:=.[l1:l2], Unique:=True
End If
.Range("a1:b" & utF & ",f1:i" & utF).SpecialCells(xlCellTypeVisible).Copy
Hoja3.[m1].PasteSpecial xlPasteValues
With Hoja3
utF = .[m65536].End(xlUp).Row
If utF > 1 Then
AjustarColumnasList .[m2:r2], ListBox1
With ListBox1: .ColumnHeads = True
.RowSource = "Oculta!m2:r" & utF: End With
End If
End With
Application.CutCopyMode = False: SinEventos = False
On Error Resume Next: .ShowAllData: On Error GoTo 0: .[l2].Clear
End With
End Sub
'
'ajusta al contenido las columnas de un listbox [creo que para que sea efectivo totalmente??
' habria que igualar tamaño y tipo de letra, pero +/- hace un buen apaño]
Sub AjustarColumnasList(rango As Range, ListB As MSForms.ListBox)
Dim n As Byte, ColWidths As String
With rango
.EntireColumn.AutoFit
For n = 1 To .Columns.Count
If n > 1 Then ColWidths = ColWidths & ";" & .Cells(1, n).Width _
Else ColWidths = .Cells(1, n).Width
Next
ListB.ColumnCount = .Columns.Count
End With
ListB.ColumnWidths = ColWidths
End Sub
'
'carga los combos con los registros unicos del campo correspondiente
Sub Cargar_Combos()
Dim n As Byte, c As Byte, ultF As Long
Application.ScreenUpdating = False: SinEventos = True
With Hoja2
For n = 1 To 8
If n > 1 Then c = n + 1 Else c = 1
.[iv:iv].ClearContents
.Range(.Cells(1, c), .Cells(65536, c).End(xlUp)).AdvancedFilter _
Action:=xlFilterCopy, CriteriaRange:="", _
CopyToRange:=.[iv1], Unique:=True
ultF = .[iv65536].End(xlUp).Row
If ultF > 1 Then
If ultF > 2 Then
.Range("iv1:iv" & ultF).Sort Key1:=.[iv2], _
order1:=xlAscending, Header:=xlYes
Controls("ComboBox" & n).List = _
.Range("iv2:iv" & .[iv65536].End(xlUp).Row).Value
Else
Controls("ComboBox" & n).AddItem .[iv2].Value
End If
End If
Next
.[iv:iv].Clear
End With
SinEventos = False
End Sub
'
'desselecciona los combos
Sub BorrarCombos()
Dim n As Byte
For n = 1 To 8
Controls("ComboBox" & n) = ""
Next
End Sub
'
'sincroniza los combos y el listbox (la variable dato es para
' facilitar mis intentos de coversion para intentar salvar el error)
Sub SincronizarCombos()
Dim celda As Range, n As Byte, dato As String
SinEventos = True: BloquearCombos False
With ListBox1
If .ListIndex < 0 Then .ListIndex = 0
Label9 = .Value
End With
With Hoja2
Set celda = .Range(.[a1], .[a65536].End(xlUp)) _
.Find(ListBox1.Text, .[a1], xlFormulas, xlWhole)
If Not celda Is Nothing Then
For n = 2 To 8
dato = celda.Offset(, n).Value
Controls("ComboBox" & n).Text = dato
Next
ComboBox1 = celda: Set celda = Nothing
End If
End With
BloquearCombos True
SinEventos = False
End Sub
'
'habilita/inhabilita los botones Siguiente, anterior, primero y ultimo
'para moverse por el listbox si solo hay uno o ningun registro o si el
'seleccionado es el 1º o el ultimo
Sub HabilitarMoverse()
With ListBox1
CommandButton2.Enabled = .ListCount > 1 And .ListIndex < .ListCount - 1 _
And .Text <> ""
CommandButton3.Enabled = .ListCount > 1 And .ListIndex > 0
CommandButton4.Enabled = .ListCount > 1 And .ListIndex > 0
CommandButton5.Enabled = .ListCount > 1 And .ListIndex < .ListCount - 1 _
And .Text <> ""
End With
End Sub
'
'cambia la prop. Style de los combos para permitir o no la edicion
Sub BloquearCombos(Bloquear As Boolean)
Dim n As Byte
For n = 2 To 8
Controls("ComboBox" & n).Style = -2 * Bloquear
Next
End Sub
'
'para pasar formulas de hoja
Function DatoValido(dato As Variant)
If dato = "" Then
DatoValido = ""
ElseIf IsDate(dato) Then
DatoValido = CLng(CDate(dato))
ElseIf IsNumeric(dato) Then
DatoValido = CDbl(dato)
Else
DatoValido = """" & dato & """"
End If
End Function
'*************************

bueno disculpa el rollo y cualquier comentario se agradece

un saluod y hasta pronto
Ivan
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida