Error definido por la aplicación o por el objeto?

Tengo un formulario de ingreso de datos a una hoja de excel, el formulario se compone de dos combobox dependientes (con esto no hay problema) y varios textbox y un boton de registrar, el ingreso de datos no me da ningún inconveniente, al dar en el botón REGISTRAR me genera el error 1004, error definido por la aplicación o por el objeto exactamente en la siguiente rutina:

Private Sub ComboBox1_Change()
ComboBox2.Clear

Sheets("Subcategorias").Select

columna1 = ComboBox1.ListIndex + 1

Cells(2, columna1).Select 'aqui me señala el error
UltimaFila = Columns("A:A").Range("A65536").End(xlUp).Row
For cont = 2 To UltimaFila

If Cells(cont, columna1) <> "" Then
ComboBox2.AddItem (Cells(cont, columna1))

End If

Next

Sheets("Menu").Select
End Sub

Considerando que no sea suficiente, envío a continuación el código completo, gracias mil.

Private Sub btn_Registrar_Click()
Dim Fila As Long
Dim Final As Long
Dim Titulo As String
Dim xControl As Control

Titulo = "Ágora KFB"
Application.ScreenUpdating = False
Application.DisplayAlerts = False

If Me.ComboBox1 = "" Then
Me.ComboBox1.BackColor = &HC0C0FF
MsgBox "Debe ingresar Categoría", vbExclamation, "Ágora KFB"
Me.ComboBox1.SetFocus
Exit Sub
ElseIf Me.ComboBox2 = "" Then
Me.ComboBox2.BackColor = &HC0C0FF
MsgBox "Debe ingresar Subcategoría", vbExclamation, "Ágora KFB"
Me.ComboBox2.SetFocus
Exit Sub
ElseIf Me.txt_Detalle = "" Then
Me.txt_Detalle.BackColor = &HC0C0FF
MsgBox "Debe ingresar el Detalle del Recibo de Gastos", vbExclamation, "Ágora KFB"
Me.txt_Detalle.SetFocus
Exit Sub
ElseIf Me.txt_Importe = "" Then
Me.txt_Importe.BackColor = &HC0C0FF
MsgBox "Debe ingresar el valor del Gasto", vbExclamation, "Ágora KFB"
Me.txt_Importe.SetFocus
Exit Sub

End If
'Determina el final del listado de Gastos
Final = GetNuevoR(Hoja19)
If MsgBox("Son correctos los datos?" + Chr(13) + "Desea proceder?", vbOKCancel + vbQuestion, "Ágora KFB") = vbOK Then
'Envía los datos a la hoja de Gastos
Me.ComboBox1.BackColor = &HFFFFFF
Hoja16.Cells(Final, 1) = Me.ComboBox1
Hoja16.Cells(Final, 2) = Me.ComboBox2
Hoja16.Cells(Final, 3) = Me.DTPicker1
Hoja16.Cells(Final, 4) = Me.txt_Detalle
Hoja16.Cells(Final, 5) = Me.txt_Importe.Value
Hoja16.Cells(Final, 6) = Hoja9.Range("G1") 'Usuario responsalbe de la operación
'-----------------------------------------------

'Limpia los controles
Me.ComboBox1 = ""
Me.ComboBox2 = ""
Me.txt_Detalle = ""
Me.txt_Importe = ""
Me.ComboBox1.SetFocus
Else
Exit Sub
End If

End Sub

Private Sub btn_Salir_Click()
Unload Me
End Sub

Private Sub ComboBox1_Change()
ComboBox2.Clear

Sheets("Subcategorias").Select

columna1 = ComboBox1.ListIndex + 1

Cells(2, columna1).Select
UltimaFila = Columns("A:A").Range("A65536").End(xlUp).Row
For cont = 2 To UltimaFila

If Cells(cont, columna1) <> "" Then
ComboBox2.AddItem (Cells(cont, columna1))

End If

Next

Sheets("Menu").Select
End Sub

Private Sub txt_Importe_Exit(ByVal Cancel As MSForms.ReturnBoolean)
txt_Importe = Format(txt_Importe, "currency")

End Sub

Private Sub UserForm_Activate()

Sheets("Categorias").Select

UltimaFila = Columns("A:A").Range("A65536").End(xlUp).Row
For cont = 2 To UltimaFila

If Cells(cont, 1) <> "" Then
ComboBox1.AddItem (Cells(cont, 1))

End If
Next

Sheets("Menu").Select
End Sub

1 respuesta

Respuesta
1

Después de esta línea:

ComboBox2. Clear

Agrega esta línea

If ComboBox1.ListIndex = -1 Then Exit Sub

Es para verificar si elegiste un dato del combo, si escribiste un texto, pero no corresponde a ninguno de los datos del combo, entonces listindex = -1, luego entonces, tienes esto:

columna1 = ComboBox1.ListIndex + 1

Como listindex = -1 + 1, entonces columna =  -1 + 1 = 0

Después tienes esto:

Cells(2, columna1).Select

Ahí te marca el error "1004".


Así quedaría el código completo:

Private Sub ComboBox1_Change()
    ComboBox2.Clear
    If ComboBox1.ListIndex = -1 Then Exit Sub
    Sheets("Subcategorias").Select
    columna1 = ComboBox1.ListIndex + 1
    Cells(2, columna1).Select
    UltimaFila = Columns("A:A").Range("A65536").End(xlUp).Row
    For cont = 2 To UltimaFila
        If Cells(cont, columna1) <> "" Then
            ComboBox2.AddItem (Cells(cont, columna1))
        End If
    Next
    Sheets("Menu").Select
End Sub

Para hacer más eficiente el código, sin necesidad de cambiar de hoja. También localiza la última fila de la columna correspondiente a la categoría:

Private Sub ComboBox1_Change()
    ComboBox2.Clear
    If ComboBox1.ListIndex = -1 Then Exit Sub
    '
    Set h2 = Sheets("Subcategorias")
    columna1 = ComboBox1.ListIndex + 1
    'ultima fila pero de la columna correspondiente
    UltimaFila = h2.Cells(Rows.Count, columna1).End(xlUp).Row
    For cont = 2 To UltimaFila
        ComboBox2.AddItem h2.Cells(cont, columna1)
    Next
End Sub

De esa forma, puedes permanecer en la hoja "menú", sin necesidad de cambiar de una hoja a otra.

¡Gracias! Agradezco inmensamente tu respuesta, pero todo el proyecto se me daño, no fue solo en esa rutina, tengo que reestructurar mi proyecto y empezarlo de nuevo, quien sabe qué fue lo que hice para que se dañaran todas las macros, y corregir es mas tedioso que volver a hacer, voy a cambiar la estructura del proyecto, empezar de cero, y estoy segura que por aquí estaré molestándote, muchas gracias por estar siempre atento a las consultas. Un beso.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas