Error 1004 insertando datos a una hoja de excel

No encuentro el error de acuerdo al código para comenzar en la fila 31 lo hace sin problemas pero a la hora de cerrar el formulario y abrirlo de n nuevo con los datos insertados genera el error toca borrar y comenzar de la fila 31 de nuevo y ese no es el caso es para que queden insertados como una base de datos gracias y mas error me da si deseo cambiar y comenzar de la fila A2 que es lo va a quedar la fila A31 eran solo pruebas de conocimiento
gracias mundiales...

Option Explicit
Dim a, c, b As Variant    'Al inicio del código
Sub FilterData()
  Dim txt1 As String, txt2 As String, txt3 As String
  Dim b As Variant
  Dim i As Long, j As Long, k As Long
  '
  ReDim b(1 To UBound(a, 1), 1 To UBound(a, 2))
  listcargaproductos.Clear
  For i = 1 To UBound(a, 1)   'linea que mellega al ultimo registro
    If txtbuscapro.Value = "" Then txt1 = a(i, 1) Else txt1 = txtbuscapro.Value
    If LCase(a(i, 2)) Like "*" & LCase(txt1) & "*" Then 'linea que me lleva a la columna requerida
      j = j + 1
      For k = 1 To UBound(a, 2) ''2
        b(j, k) = a(i, k)
             If k = 5 Then
                b(j, k) = Format(b(j, k), "$ #,##0.00")
             End If
          If k = 6 Then
            b(j, k) = Format(b(j, k), "$ #,##0.00")
          End If
      Next
    End If
  Next i
  If j > 0 Then listcargaproductos.List = b
End Sub
Private Sub userform_initialize()
'esta parte es donde se detiene y genera el error
  'Ajusta columna "K" para la última columna con datos
  'Ajusta celda "A2" con la celda de inicio de datos
  'Ajusta Hoja1 con el nombre de tu hoja
  'El filtro funciona buscando los datos en la columna "A"
  b = Sheets("Hoja11").Range("A2:K" & Sheets("Hoja11").Range("A" & Rows.Count).End(3)).Value
  listcargaproductos.ColumnCount = UBound(b, 2)
End Sub
Private Sub cmdregproducto_Click()
Dim lr As Long, i As Long, fin As Long, cont As Long, n As Long
  Dim pre As String
  '
  'Validaciones
  If ComboBox1 = "" Or ComboBox1.ListIndex = -1 Then
    MsgBox ("Se requiere que seleccione un nombre para insertar un codigo"), vbCritical, "AVISO"
    ComboBox1.SetFocus
    Exit Sub
  End If
  If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilterMode = False
  'Range (Range("A & ActiveCell.Row), Range (1 & ActiveCell.Row).End(xlToLeft)).Select
  'Proceso
  lr = Range("A" & Rows.Count).End(3).Row + 2
  'a = Range("A" & lr)
  a = Range("A31:A" & lr)
  Select Case lr
    Case Is < 31: fin = 0
    Case 31:      fin = 1
    Case Else:    fin = UBound(a)
  End Select
  n = 1
  pre = Split(ComboBox1.Value, "-")(0)
  For i = 1 To fin
    If Left(a(i, 1), Len(pre)) = pre Then
      n = n + 1
    End If
  Next
 Dim X As Integer
'Recoge variable de número de datos
    X = WorksheetFunction.CountA(Range("A2:A10000"))
'Da de alta cada campo ya que tdos los txt estan rellenos
'Variable X solo por mayor comodidad al escribir código
    X = X + 2 'X recoge el valor del número de asientos más el número de línea
            'donde empiezan
    'Alta artículo
        Cells(X, 1) = ComboBox1.Text
        Cells(X, 2) = txtpro.Text
        Cells(X, 3) = txttipopro.Text
        Cells(X, 4) = txtprove.Text
        Cells(X, 5) = txtprecio1.Text
        Cells(X, 6) = txtprecio2.Text
End Sub
Respuesta
2

Más allá de que Dante te revise el resto de los códigos, te comento cuál es el motivo del mensaje de Error 1004 en el evento Initialize del Userform.

Private Sub userform_initialize()
  'esta parte es donde se detiene y genera el error
       'Ajusta columna "K" para la última columna con datos
       'Ajusta celda "A2" con la celda de inicio de datos
       'Ajusta Hoja1 con el nombre de tu hoja
       'El filtro funciona buscando los datos en la columna "A"
  b = Sheets("Hoja11").Range("A2:K" & Sheets("Hoja11").Range("A" & Rows.Count).End(3)).Value
  listcargaproductos.ColumnCount = UBound(b, 2)
End Sub

La sintaxis correcta es:

b = Sheets("Hoja11").Range("A2:K" & Sheets("Hoja11").Range("A" & Rows.Count).End(3).Row)

¡Gracias! 

La instrucción anterior te guarda un rango... pero como parece que guardas una matriz sería:

b = Sheets("Hoja11").Range("A2:K" & Sheets("Hoja11").Range("A" & Rows.Count).End(3).Row).Value

Desconozco cómo siguen los procesos, pero el error 1004 desaparece con este ajuste ;)

Sdos!

1 respuesta más de otro experto

Respuesta
2

Envíame tu archivo y te ayudo con el código.

Mi correo:

[email protected]

Cuando ejecutas el código y te aparece el mensaje de error:

Presiona el botón "Depurar". Eso te lleva al código y podrás ver cuál es la línea del código con el error:

La línea de amarillo es la que tiene el error.

---

La variable global de esa matriz es la letra 'a', debe ser así:

a = Sheets("Hoja11").Range("A2:K" & Sheets("Hoja11").Range("A" & Rows.Count).End(3).Row).Value

La variable 'b' se utiliza para el resultado del filtro.

Te paso el código completo y corregido:

Option Explicit
Dim a As Variant    'Al inicio del código
Sub FilterData()
  Dim txt1 As String
  Dim i As Long, j As Long, k As Long
  '
  ReDim b(1 To UBound(a, 1), 1 To UBound(a, 2))
  listcargaproductos.Clear
  For i = 1 To UBound(a, 1)   'linea que mellega al ultimo registro
    If txtbuscapro.Value = "" Then txt1 = a(i, 1) Else txt1 = txtbuscapro.Value
    If LCase(a(i, 2)) Like "*" & LCase(txt1) & "*" Then 'linea que me lleva a la columna requerida
      j = j + 1
      For k = 1 To UBound(a, 2)
        b(j, k) = a(i, k)
        If k = 5 Or k = 6 Then
          b(j, k) = Format(b(j, k), "$ #,##0.00")
        End If
      Next
    End If
  Next i
  If j > 0 Then listcargaproductos.List = b
End Sub
Private Sub txtbuscapro_Change()
 Call FilterData
End Sub
Private Sub txtprecio1_Change()
  txtprecio1 = Format(txtprecio1, "$#")
  If Not IsNumeric(txtprecio1.Text) And _
    txtprecio1.Text <> "" Then
    Beep
    MsgBox "El dato Precio  es Numerico"
    txtprecio1.Text = ""
    txtprecio1.SetFocus
  End If
End Sub
Private Sub txtprecio2_Change()
  txtprecio2 = Format(txtprecio2, "$#")
  If Not IsNumeric(txtprecio2.Text) And _
  txtprecio2.Text <> "" Then
  Beep
  MsgBox "El dato Precio  es Numerico"
  txtprecio2.Text = ""
  txtprecio1.SetFocus
  End If
End Sub
Private Sub UserForm_Activate()
  Call FilterData
  ComboBox1.AddItem ("fru-00")
  ComboBox1.AddItem ("ver-00")
  ComboBox1.AddItem ("lac-00")
End Sub
Private Sub userform_initialize()
  a = Sheets("Hoja11").Range("A2:K" & Sheets("Hoja11").Range("A" & Rows.Count).End(3).Row).Value
  listcargaproductos.ColumnCount = UBound(a, 2)
End Sub
Private Sub cmdregproducto_Click()
  Dim lr As Long
  'Validaciones
  If ComboBox1 = "" Or ComboBox1.ListIndex = -1 Then
    MsgBox ("Se requiere que seleccione un nombre para insertar un codigo"), vbCritical, "AVISO"
    ComboBox1.SetFocus
    Exit Sub
  End If
  If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilterMode = False
  'Alta artículo
  With Sheets("Hoja11")
    lr = .Range("A" & Rows.Count).End(3).Row + 1
    .Cells(lr, 1) = ComboBox1.Text
    .Cells(lr, 2) = txtpro.Text
    .Cells(lr, 3) = txttipopro.Text
    .Cells(lr, 4) = txtprove.Text
    .Cells(lr, 5) = txtprecio1.Text
    .Cells(lr, 6) = txtprecio2.Text
  End With
  '
  ComboBox1 = ""
  txtpro = ""
  txttipopro = ""
  txtprove = ""
  txtprecio1 = ""
  txtprecio2 = ""
End Sub
Private Sub listcargaproductos_Click()
  Me.txtpro.Value = listcargaproductos.List(listcargaproductos.ListIndex, 0)
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas