Excel listcargaproductos.Clear error generado en esta línea -2147467259(8004005)

Siguiendo en el aprendizaje por medio de mi proyecto me esta generendo este error el cual de acuerdo a GOOGLE
me saca que es problemas de red y la verdad no entiendo pues trabajo es a nivel local me gustaría saber por que se da este error y como puedo repararlo para futuras proyecciones muchas gracias... Adjunto todo el código del formulario lo único nuevo fue colocar encabezados al
listbox

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 '---> linea que se detiene al error
  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 = 4 Or k = 5 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
Respuesta
4

¿En alguna parte de tu formulario estás utilizando la propiedad rowsource?

Si, master se uso para colocar los encabezados del listbox

.RowSource = rng.Address(External:=True)

¿Por qué afecta esta condición todo un código?

No puedes utilizar rowsource y clear en el mismo listbox.

Si quieres conservar los encabezados debes pasar la matiz co en resultado de la búsqueda a una hola y luego cargar con rowsource nuevamente el listbox. Porque tampoco podrías utilizar .list y conservar los encabezados.

¡Gracias!  master voy a validar código buscando terminar el error 

Te preparo el código, pero en este momento estoy desde mi celular.

¡Gracias! ¿Usted me dirá si lo envío?

Te paso el código completo.

- Primero debes crear una hoja llamada "TEMP", la hoja puede estar oculta si así lo deseas (pero antes de que la ocultes, realiza las pruebas y una vez que veas el funcionamiento, la puedes ocultar).

- El código carga los datos con RowSource para conservar los encabezados.

- Filtra los datos y pone el resultado en la hoja "TEMP", después pasa los datos de la hoja "TEMP" al listbox.

- El filtrado se hace con matrices en memoria, para que sea bastante rápido.

- Debes copiar TODO el código, incluyendo las variables globales.

- Debes copiar TODO el código, porque en el evento UserForm_Initialize, cambié la forma de cargar el listbox y te agregué la rutina para ajustar el ancho de la columnas del listbox.

Option Explicit
'
Dim a     As Variant
Dim tmp   As Worksheet
'
Sub FilterData()
  Dim txt1 As String
  Dim i As Long, j As Long, k As Long
  Dim rng As Range
  '
  ReDim b(1 To UBound(a, 1), 1 To UBound(a, 2)) 'matriz con el resultado del filtro
  For i = 1 To UBound(a, 1)   'linea que me lleva al ultimo registro
    If txtbuscapro.Value = "" Then txt1 = a(i, 1) Else txt1 = txtbuscapro.Value
    If LCase(a(i, 2)) Like "*" & LCase(txt1) & "*" Then 'compara la columna 2 contra el textbox
      'si coinciden, entonces llena la matriz con el resultado
      j = j + 1
      For k = 1 To UBound(a, 2)
        b(j, k) = a(i, k)
        If k = 4 Or k = 5 Then
          b(j, k) = Format(b(j, k), "$ #,##0.00")
        End If
      Next
    End If
  Next i
  '
  'limpia la hoja temporal
  tmp.Rows("2:" & Rows.Count).ClearContents
  If j > 0 Then
    'pasa la matriz con el resultado a la hoja temporal
    tmp.Range("A2").Resize(j, UBound(b, 2)).Value = b
    'establece el rango de la hoja temporal
    Set rng = tmp.Range("A2:K" & tmp.Range("A" & Rows.Count).End(3).Row)
    'pasa los datos de la hoja a listbox
    listcargaproductos.RowSource = rng.Address(External:=True)
  End If
End Sub
'
Private Sub txtbuscapro_Change()
  Call FilterData
End Sub
'
Private Sub UserForm_Initialize()
  Dim rng As Range
  Dim ancho As String
  Dim i As Long
  '
  Set tmp = Sheets("TEMP")
  Hoja3.Cells.Copy tmp.Range("A1")
  Set rng = tmp.Range("A2:K" & tmp.Range("A" & Rows.Count).End(3).Row)
  a = rng.Value
  tmp.Cells.EntireColumn.AutoFit
  For i = 1 To tmp.Cells(1, Columns.Count).End(1).Column
    ancho = ancho & Int(tmp.Cells(1, i).Width + 3) & ";"
  Next
  '
  With listcargaproductos
    .ColumnHeads = True
    .ColumnCount = rng.Columns.Count
    .RowSource = rng.Address(External:=True)
    .ColumnWidths = ancho
  End With
End Sub

1 respuesta más de otro experto

Respuesta
3

Si utilizas RowSource no puedes hacer algunas cosas, como por ejemplo limpiarlo con Clear.

Lo que se hace en ese caso es primero vaciar la propiedad RowSource y luego volver a asignarle el rango que le corresponde. Por ejemplo:

Private Sub CommandButton3_Click()
    'ListBox1.Clear
ListBox1.RowSource = ""
ListBox1.RowSource = "=Empresas!A2:C10"
End Sub

También puedes utilizarlo para enviar datos a otros campos u hoja, con List... por ejemplo:

Pero no podrás quitar ni agregar registros desde los textbox a la lista, si utilizas RowSource.

Entonces, si tu tarea será del tipo ABC (altas, bajas y cambios) lo mejor es que utilices una lista para los títulos (de una sola fila) y luego la lista para los datos.

En este ejemplo hay 3 campos que alimentan a la lista mayor... pero los títulos se colocaron en una lista de 3 columnas en este caso sin bordes ;)

Espero te sirvan los ejemplos para darle un cambio a tu modelo... cualquier duda comenta cuál es la idea de tu formulario, qué procesos piensas ejecutar desde allí.

Sdos.

Elsa

http://aplicaexcel.com/manuales

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas