Dónde modificar código Array en vba Excel para hacer que tome datos desde una fila específica para un Listbox

Encontré un código que me ayudó mucho para ingresar más de 10 columnas a un listbox, aquí el código:

Sub CargarArray()
Dim MyArray() As Variant
Dim f As Long, c As Long
Dim fMax As Long, cMax As Long
Dim n As Long
n = 1
fMax = nReg(Hoja1, 1, 1) - 1 'ESTO ME SIRVE PARA HALLAR LA ÚLTIMA FILA
cMax = 14
ReDim MyArray(1 To n, 1 To cMax)
    For f = 1 To fMax 
        For c = 1 To cMax
            MyArray(n, c) = Hoja1.Cells(f, c)
        Next c
            If n = fMax Then Exit For
                        ReDim Preserve MyArray(1 To n, 1 To cMax)
                        MyArray = Application.WorksheetFunction.Transpose(MyArray)
                        n = n + 1
                        ReDim Preserve MyArray(1 To cMax, 1 To n)
                        MyArray = Application.WorksheetFunction.Transpose(MyArray)
    Next f
    UserForm1.Lst_database.List = MyArray
End Sub

Cuando modifico en la parte "For f = 1 To fMax " por "For f = 2 To fMax" me deja al final una fila vacía en el Listbox, de tal manera:

Quiero editar el código de tal forma que me permita que me liste desde la fila 2 y no me arroje una fila vacía en el Listbox.

Respuesta
2

Si quieres cargar desde A2 hasta N y hasta la última fila con datos, puede ser:

Private Sub UserForm_Initialize()
  UserForm1.Lst_database.List = Hoja1.Range("A2:N" & Hoja1.Range("A" & Rows.Count).End(3).Row).Value
End Sub

Muchas gracias por tu ayuda Dante nuevamente, ¿hay alguna posibilidad de incluir datos como cabecera teniendo en cuenta que es un Listbox con más de 10 columnas sin que se produzca un error en excel y se reinicie?

Para poner encabezados, debes utilizar la propiedad rowsource y también te permite cargar más de 10 columnas.

Private Sub UserForm_Initialize()
  With Lst_database
    .ColumnHeads = True
    .RowSource = Hoja1.Range("A2:N" & Hoja1.Range("A" & Rows.Count).End(3).Row).Address(external:=True)
  End With
End Sub

Dante, con el código solo me muestra la primera columna:

Tienes que cambiar la propiedad del listbox de ColumnCount al número de columnas que desees.

Ahora si me lista correctamente, pero de igual modo se sigue reiniciando:

El error menciona un range y el único Set que usé es el siguiente que me sirve para guardar los datos del formulario a la hoja de excel:

Sub guardar()
Dim sh As Worksheet
Dim ufila As Long
Set sh = ThisWorkbook.Sheets("Database")
ufila = nReg(sh, 1, 1)
With sh
.Cells(ufila, 1) = UserForm1.Txt_id.Text
.Cells(ufila, 2) = UserForm1.Txt_nombres.Text
.Cells(ufila, 3) = UserForm1.Txt_dni.Text
.Cells(ufila, 4) = UserForm1.Txt_celular.Text
.Cells(ufila, 5) = UserForm1.Txt_email.Text
.Cells(ufila, 6) = UserForm1.ComboBox1.Text
.Cells(ufila, 7) = UserForm1.Txt_razonsocial.Text
.Cells(ufila, 8) = UserForm1.Txt_ruc.Text
.Cells(ufila, 9) = UserForm1.Txt_usuariosol.Text
.Cells(ufila, 10) = UserForm1.Txt_clavesol.Text
.Cells(ufila, 11) = UserForm1.Txt_usuarioafp.Text
.Cells(ufila, 12) = UserForm1.Txt_claveafp.Text
.Cells(ufila, 13) = Application.UserName
.Cells(ufila, 14) = [Text(Now(),"dd-mm-yyy hh:mm:ss")]
End With
End Sub

¿Ves algún problema el método de guardar los datos?

Tal vez tu hoja tiene un daño.

Te recomiendo que selecciones únicamente los datos, no te lleves la hoja, ni te lleves la tabla, copies los datos y los pegues en un nuevo libro en una nueva hoja.

Después copia tus formularios y módulos al nuevo libro.

Prueba nuevamente.

2 respuestas más de otros expertos

Respuesta

Se puede hacer de dos maneras y con mucho menos código del que estas usando este es el primer ejemplo cuando es una tabla simple, el resultado esta en la imagen que sigue al código

Private Sub UserForm_Initialize()
With Range("b2").CurrentRegion
    filas = .Rows.Count
    col = .Columns.Count
End With
With Range("b2").Rows(2)
    matriz = .Resize(filas - 1, col)
End With
With ListBox1
    .List = matriz
    .ColumnCount = col
End With
End Sub

Y este es el ejemplo cuando es una tabla insertada junto con la imagen del resultado

Private Sub UserForm_Initialize()
matriz = Range("tabla2")
With ListBox1
    .List = matriz
    .ColumnCount = Range("tabla2").Columns.Count
End With
End Sub

Muchas gracias por ayudarme, ¿hay alguna forma de editar el código para que permita agregar los títulos como cabecera?

Que aparezcan los títulos en donde señalé con rojo.

Checa la imagen en amarillo están los encabezados que serán colocados en el listbox que en este caso es de más de 20 columnas

y este es el codigo

Private Sub UserForm_Initialize()
With Range("b1").CurrentRegion
    filas = .Rows.Count
    col = .Columns.Count
End With
With ListBox1
    .RowSource = Range("b1").Rows(2).Resize(filas - 1, col).Address
    .ColumnCount = col
    .ColumnHeads = True
End With
End Sub

Muchas gracias; sin embargo al utilizar este código y al agregar un nuevo item a la hoja de excel se reinicia el excel(motivo por el cual intenté hacer la carga de datos con el Array). 

Con tus 2 ejemplos anteriores no ocurría este problema de reinicia de excel.

¿Podrá mejorarse en algo para que no ocurra el problema?

El problema no esta en el código que te pase el problema esta en que tienes declarado en alguna parte un set xxxx=range(nombre) que no encuentra y aparte tienes un programa llamado call reset que lo más probable es que te este sacando del sistema

Respuesta

Es posible te aporte algo más

https://youtu.be/Jl0rmytjDZY

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas