OBTENER MAYOR VELOCIDAD EN CARGA DE LISTBOX
Publicado por Juan (184 intervenciones) el 14/11/2022 15:50:57
Hola a todos.
Tengo un archivo que trabaja con varios ListBox y funciona de la siguiente manera:
Para activar el Userform1 con registros en tres ListBox; Click en celda ("Cuenta") de la hoja Resumen Cart-Cli para activar UserForm1. Después haciendo click en cualquiera de las celdas de Cuenta en la columna (“A5:A57”) cargar de registros al UserForm1(3 ListBox).
Seleccionar doble click un ítem (Vencimiento y Monto) del UserForm1.ListBox Fact1 y buscar en una Hoja Cartola Cli y si lo encuentra llena de registros a otro UserForm2.ListBox Detalle_Factura con condición adicional que correspondan solo a Clase de Documento DF (Cta Cliente-ClaseDoc-Referencia-Monto-Vencimiento-Texto).
Todo eso funciona muy bien, pero el inconveniente que tengo es que la carga de registro al UserForm1 es algo lento ya que mi archivo original contiene un promedio de 300.000 filas y necesito más velocidad.
¿Sera posible la modificación al código que se encuentra en la Hoja Resumen Cart-Cli para que adquiera mayor velocidad en la carga de registros?
Adjunto Archivo.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Cuenta As Variant
Dim WS1 As Worksheet
Dim WS2 As Worksheet
If ActiveCell.FormulaR1C1 = "Cuenta" Then
UserForm1.Show
End If
If Not Intersect(Target, Range("A:A")) Is Nothing And Selection.Count = 1 And _
ActiveCell.FormulaR1C1 <> "Cuenta" Then
Set WS1 = Worksheets("Cartola Cli")
Cuenta = Intersect(Target, Range("A:A"))
filas = WS1.Range("Q1").CurrentRegion.Rows.Count
Mayor_Mes = 0
Menor_Mes = 0
NC_Total = 0
Transacc_Total = 0
UserForm1.Fact1.Clear
UserForm1.NotaCredit.Clear
UserForm1.Transacc.Clear
UserForm1.Menor_Mes.Text = Empty
UserForm1.Mayor_Mes.Text = Empty
UserForm1.NC_Total.Text = Empty
UserForm1.Transacc_Total.Text = Empty
UserForm1.Fact_Total.Text = Empty
UserForm1.Monto_Total.Text = Empty
For I = 2 To filas
If WS1.Cells(I, 17).Value Like Cuenta Then
If UCase(WS1.Cells(I, 3).Value) Like "DF" And WS1.Cells(I, 22).Value <> "Vigente" Then
UserForm1.Fact1.AddItem WS1.Cells(I, 9) 'Vencimiento
UserForm1.Fact1.List(UserForm1.Fact1.ListCount - 1, 1) = WS1.Cells(I, 10) 'Monto
UserForm1.Cuenta.Caption = WS1.Cells(I, 17) 'Cuenta
UserForm1.RazonSocial.Caption = WS1.Cells(I, 20) 'Razon Social
If LCase(WS1.Cells(I, 22).Value) Like "0 a 30" Then
Menor_Mes = Menor_Mes + WS1.Cells(I, 10).Value
ElseIf WS1.Cells(I, 21).Value > 30 Then
Mayor_Mes = Mayor_Mes + WS1.Cells(I, 10).Value
End If
ElseIf UCase(WS1.Cells(I, 3).Value) Like "DN" Then
UserForm1.NotaCredit.AddItem WS1.Cells(I, 9) 'Vencimiento
UserForm1.NotaCredit.List(UserForm1.NotaCredit.ListCount - 1, 1) = WS1.Cells(I, 10) 'Monto
UserForm1.Cuenta.Caption = WS1.Cells(I, 17) 'Cuenta
UserForm1.RazonSocial.Caption = WS1.Cells(I, 20) 'Razon Social
NC_Total = NC_Total + WS1.Cells(I, 10).Value
ElseIf UCase(WS1.Cells(I, 3).Value) Like "DZ" Or UCase(WS1.Cells(I, 3).Value) Like "AB" Or _
UCase(WS1.Cells(I, 3).Value) Like "DD" Then
UserForm1.Transacc.AddItem WS1.Cells(I, 9) 'Vencimiento
UserForm1.Transacc.List(UserForm1.Transacc.ListCount - 1, 1) = WS1.Cells(I, 10) 'Monto
UserForm1.Cuenta.Caption = WS1.Cells(I, 17) 'Cuenta
UserForm1.RazonSocial.Caption = WS1.Cells(I, 20) 'Razon Social
Transacc_Total = Transacc_Total + WS1.Cells(I, 10).Value
End If
End If
UserForm1.Menor_Mes.Text = Menor_Mes
UserForm1.Mayor_Mes.Text = Mayor_Mes
UserForm1.NC_Total.Text = NC_Total
UserForm1.Transacc_Total.Text = Transacc_Total
UserForm1.Fact_Total.Text = Menor_Mes + Mayor_Mes
UserForm1.Monto_Total.Text = Menor_Mes + Mayor_Mes + NC_Total + Transacc_Total
Next I
End If
End Sub
Tengo un archivo que trabaja con varios ListBox y funciona de la siguiente manera:
Para activar el Userform1 con registros en tres ListBox; Click en celda ("Cuenta") de la hoja Resumen Cart-Cli para activar UserForm1. Después haciendo click en cualquiera de las celdas de Cuenta en la columna (“A5:A57”) cargar de registros al UserForm1(3 ListBox).
Seleccionar doble click un ítem (Vencimiento y Monto) del UserForm1.ListBox Fact1 y buscar en una Hoja Cartola Cli y si lo encuentra llena de registros a otro UserForm2.ListBox Detalle_Factura con condición adicional que correspondan solo a Clase de Documento DF (Cta Cliente-ClaseDoc-Referencia-Monto-Vencimiento-Texto).
Todo eso funciona muy bien, pero el inconveniente que tengo es que la carga de registro al UserForm1 es algo lento ya que mi archivo original contiene un promedio de 300.000 filas y necesito más velocidad.
¿Sera posible la modificación al código que se encuentra en la Hoja Resumen Cart-Cli para que adquiera mayor velocidad en la carga de registros?
Adjunto Archivo.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Cuenta As Variant
Dim WS1 As Worksheet
Dim WS2 As Worksheet
If ActiveCell.FormulaR1C1 = "Cuenta" Then
UserForm1.Show
End If
If Not Intersect(Target, Range("A:A")) Is Nothing And Selection.Count = 1 And _
ActiveCell.FormulaR1C1 <> "Cuenta" Then
Set WS1 = Worksheets("Cartola Cli")
Cuenta = Intersect(Target, Range("A:A"))
filas = WS1.Range("Q1").CurrentRegion.Rows.Count
Mayor_Mes = 0
Menor_Mes = 0
NC_Total = 0
Transacc_Total = 0
UserForm1.Fact1.Clear
UserForm1.NotaCredit.Clear
UserForm1.Transacc.Clear
UserForm1.Menor_Mes.Text = Empty
UserForm1.Mayor_Mes.Text = Empty
UserForm1.NC_Total.Text = Empty
UserForm1.Transacc_Total.Text = Empty
UserForm1.Fact_Total.Text = Empty
UserForm1.Monto_Total.Text = Empty
For I = 2 To filas
If WS1.Cells(I, 17).Value Like Cuenta Then
If UCase(WS1.Cells(I, 3).Value) Like "DF" And WS1.Cells(I, 22).Value <> "Vigente" Then
UserForm1.Fact1.AddItem WS1.Cells(I, 9) 'Vencimiento
UserForm1.Fact1.List(UserForm1.Fact1.ListCount - 1, 1) = WS1.Cells(I, 10) 'Monto
UserForm1.Cuenta.Caption = WS1.Cells(I, 17) 'Cuenta
UserForm1.RazonSocial.Caption = WS1.Cells(I, 20) 'Razon Social
If LCase(WS1.Cells(I, 22).Value) Like "0 a 30" Then
Menor_Mes = Menor_Mes + WS1.Cells(I, 10).Value
ElseIf WS1.Cells(I, 21).Value > 30 Then
Mayor_Mes = Mayor_Mes + WS1.Cells(I, 10).Value
End If
ElseIf UCase(WS1.Cells(I, 3).Value) Like "DN" Then
UserForm1.NotaCredit.AddItem WS1.Cells(I, 9) 'Vencimiento
UserForm1.NotaCredit.List(UserForm1.NotaCredit.ListCount - 1, 1) = WS1.Cells(I, 10) 'Monto
UserForm1.Cuenta.Caption = WS1.Cells(I, 17) 'Cuenta
UserForm1.RazonSocial.Caption = WS1.Cells(I, 20) 'Razon Social
NC_Total = NC_Total + WS1.Cells(I, 10).Value
ElseIf UCase(WS1.Cells(I, 3).Value) Like "DZ" Or UCase(WS1.Cells(I, 3).Value) Like "AB" Or _
UCase(WS1.Cells(I, 3).Value) Like "DD" Then
UserForm1.Transacc.AddItem WS1.Cells(I, 9) 'Vencimiento
UserForm1.Transacc.List(UserForm1.Transacc.ListCount - 1, 1) = WS1.Cells(I, 10) 'Monto
UserForm1.Cuenta.Caption = WS1.Cells(I, 17) 'Cuenta
UserForm1.RazonSocial.Caption = WS1.Cells(I, 20) 'Razon Social
Transacc_Total = Transacc_Total + WS1.Cells(I, 10).Value
End If
End If
UserForm1.Menor_Mes.Text = Menor_Mes
UserForm1.Mayor_Mes.Text = Mayor_Mes
UserForm1.NC_Total.Text = NC_Total
UserForm1.Transacc_Total.Text = Transacc_Total
UserForm1.Fact_Total.Text = Menor_Mes + Mayor_Mes
UserForm1.Monto_Total.Text = Menor_Mes + Mayor_Mes + NC_Total + Transacc_Total
Next I
End If
End Sub
Valora esta pregunta
0