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
Leer las respuestas