Insertar filas en formato dependiendo de registros en listbox

Para Dante Amor

Primero que todo mis más sinceras felicitaciones por la inmensa labor que desempeñas al compartir tus conocimientos con quienes necesitamos de ellos, durante los últimos años he aprendido muchisimo gracias a esa labor desinteresada e incondicinal con los usuarios de Todoexpertos, le considero mi maestro.

Ahora si al grano, espero que esta ves me pueda colaborar con la siguiente situación:

Tengo un aplicativo en excel que he venido desarrollando y para lo cual su apoyo ha sido invaluable, necesito que en un formato que se encuentra en la hoja de nombre Remisión (Hoja11) y que alimento con los datos contenidos en un listbox (Listbox2), cuando se supere 44 registros que son los que caben en el formato establecido (desde fila 12 a 56), se inserte por cada regsitro adicional en el listbox, una fila al formato sin eliminar los últimos campos de observaciones y firmas, esta es la imagen del formato

Espero haber sido claro con la explicacion de mi necesidad.

1 respuesta

Respuesta
1

Responde lo siguiente y en este orden:

1. ¿El listbox está en un userform?

2. Pon aquí el código que utilizas para pasar los datos del listbox a la hoja.

3. ¿Las celdas "B12H56" de la hoja "Remisión" están vacías antes de pasar los datos?

R/1. Si, el nombre del UF es salidas

R/2.

'Actualizo formato Remision
'Muestro la hoja que esta oculta
ActiveWorkbook.Unprotect "1717171"
Hoja11.Visible = xlSheetVisible 'Hoja Remision
'Elimino la informacion anterior
Set hrr = Sheets("Remision")
hrr.Select
For filo = 12 To Range("B11").End(xlDown).Row
Range("B12:I" & filo).ClearContents
Range("F" & filo).ClearContents
Next
Range("H9:I10").ClearContents
'elimina las filas que sobran
    Dim x As Byte
    For filo = 12 To Range("B11").End(xlDown).Row
    If filo < 57 Then filo = 57
    While x = 0
    If Range("B" & filo) <> "Observaciones:" Then
        Range("B" & filo).EntireRow.Delete Shift:=xlUp
        'filo = filo - 1
    Else
        x = 1
    End If
    Wend
Next
'Ingresar fecha del dia
    Range("H8") = "=TODAY()"
'Asignar consecutivo
    Range("I7") =   Application.WorksheetFunction.Max(Sheets("Relacion_Remisiones").Range("A:A")) + 1
'Paso la informacion al formato
For i = 12 To 70 'Indica desde que fila empieza a registrar 'Revisar este codigo
If Hoja11.Cells(i, 1) = "" Then  'Hoja Remision
    final = i
    Exit For
End If
Next
'Se recorre el listbox2
For i = 0 To ListBox2.ListCount - 1
    Hoja11.Cells(final, 2) = ListBox2.List(i, 1)  'cod
    Hoja11.Cells(final, 3) = ListBox2.List(i, 2)  'Descripcion
    Hoja11.Cells(final, 6) = ListBox2.List(i, 0)  'cant
    final = final + 1
    Next
'se busca Unidad y precio
  For filo = 12 To Range("B11").End(xlDown).Row
    Dim buscoit
    Set buscoit = Hoja5.Range("A:A").Find(Cells(filo, 2), LookIn:=xlValues, lookat:=xlWhole)
    If Not buscoit Is Nothing Then
'pasa unid y precio del item
            Cells(filo, 5) = buscoit.Offset(0, 3) 'Unidad de Medida
         '   Cells(filo, 6) = buscoit.Offset(0, 4) 'Precio
             Set buscoit = Nothing
        Else
            Range(Cells(filo, 5), Cells(filo, 6)) = ""
         Exit For
        End If
    Next
 'Asignar consecutivo
 '   Range("I7") = Application.WorksheetFunction.Max(Sheets("Relacion_Remisiones").Range("B:B")) + 1
 'Se oculta la Hoja Remision
  Hoja11.Visible = xlSheetVeryHidden

R/3.  Pues diría que si, porque dentro del código hay instrucciones para que si hay información se limpie antes de pasar la nueva información.

De antemano mil y mil gracias

Pon aquí el código, utiliza el icono para insertar código

'Actualizo formato Remision
'Muestro la hoja que esta oculta
ActiveWorkbook.Unprotect "1717171"
Hoja11.Visible = xlSheetVisible 'Hoja Remision
'Elimino la informacion anterior
Set hrr = Sheets("Remision")
hrr.Select
For filo = 12 To Range("B11").End(xlDown).Row
Range("B12:I" & filo).ClearContents
Range("F" & filo).ClearContents
Next
Range("H9:I10").ClearContents
'elimina las filas que sobran
    Dim x As Byte
    For filo = 12 To Range("B11").End(xlDown).Row
    If filo < 57 Then filo = 57
    While x = 0
    If Range("B" & filo) <> "Observaciones:" Then
        Range("B" & filo).EntireRow.Delete Shift:=xlUp
        'filo = filo - 1
    Else
        x = 1
    End If
    Wend
Next
'Ingresar fecha del dia
    Range("H8") = "=TODAY()"
'Asignar consecutivo
    Range("I7") = Application.WorksheetFunction.Max(Sheets("Relacion_Remisiones").Range("A:A")) + 1
'Paso la informacion al formato
For i = 12 To 70 'Indica desde que fila empieza a registrar
If Hoja11.Cells(i, 1) = "" Then  'Hoja Remision
    final = i
    Exit For
End If
Next
'Se recorre el listbox2
For i = 0 To ListBox2.ListCount - 1
    Hoja11.Cells(final, 2) = ListBox2.List(i, 1)  'cod
    Hoja11.Cells(final, 3) = ListBox2.List(i, 2)  'Descripcion
    Hoja11.Cells(final, 6) = ListBox2.List(i, 0)  'cant
    final = final + 1
    Next
'se busca Unidad y precio
  For filo = 12 To Range("B11").End(xlDown).Row
    Dim buscoit
    Set buscoit = Hoja5.Range("A:A").Find(Cells(filo, 2), LookIn:=xlValues, lookat:=xlWhole)
    If Not buscoit Is Nothing Then
'pasa unid y precio del item
            Cells(filo, 5) = buscoit.Offset(0, 3) 'Unidad de Medida
         '   Cells(filo, 6) = buscoit.Offset(0, 4) 'Precio
            Set buscoit = Nothing
        Else
            Range(Cells(filo, 5), Cells(filo, 6)) = ""
         Exit For
        End If
    Next
 'Asignar consecutivo
 '   Range("I7") = Application.WorksheetFunction.Max(Sheets("Relacion_Remisiones").Range("B:B")) + 1
    'Se oculta la Hoja Remision
  Hoja11.Visible = xlSheetVeryHidden
  

Que pena, no sabia que el código se debe insertar por esa opción

Que pena, no sabia que el código se debe insertar por esa opción

Poner el código de esa manera, permite leerlo de mejor manera y es más fácil de copiar.


Algunos tips:

- Cuando estableces una variable para la hoja, debes utilizarla como referencia en todas las instrucciones que utilicen esa hoja, por ejemplo:

  Set sh = Sheets("Remision")
  'Actualizar datos
  sh.Range("H8") = "=TODAY()"
  'Eliminar la informacion anterior
  Sh. Range("H9:I10"). ClearContents

De esa manera no es necesario seleccionar la hoja, incluso, tampoco es necesario hacer visible la hoja.

- Puse solamente un ciclo For, pone la información en la hoja y al mismo tiempo busca la Unidad de Medida.

- Para limpiar el formato: Elimino las filas, borro la información y por último inserto solamente las filas necesarias para recibir la información del listbox.


Prueba el siguiente código

Private Sub CommandButton1_Click()
'Actualizo formato Remision
  Dim f As Range, sh As Worksheet
  Dim i As Long, j As Long
  Application.ScreenUpdating = False
  '
  Set sh = Sheets("Remision")
  'Actualizar datos
  sh.Range("H8") = "=TODAY()"
  sh.Range("I7") = Application.WorksheetFunction.Max(Sheets("Relacion_Remisiones").Range("A:A")) + 1
  'Eliminar la informacion anterior
  sh.Range("H9:I10").ClearContents
  sh.Range("B12:I13").ClearContents
  Set f = sh.Range("B:I").Find("OBSERVACIONES", , xlValues, xlPart, , xlPrevious, False)
  If Not f Is Nothing Then
    If f.Row > 14 Then sh.Range("B14:B" & f.Row - 1).EntireRow.Delete
  End If
  With ListBox2
    j = .ListCount
    If j > 2 Then
      sh.Rows(12).Copy
      sh.Rows("13:" & 13 + j - 3).Insert Shift:=xlDown
    End If
  'Pasar la informacion al formato
    j = 12
    For i = 0 To .ListCount - 1
      sh.Cells(j, 2) = .List(i, 1)      'cod
      sh.Cells(j, 3) = .List(i, 2)      'Descripcion
      sh.Cells(j, 6) = .List(i, 0)      'cant
      '
      Set f = Hoja5.Range("A:A").Find(.List(i, 2), , xlValues, xlWhole)
      If Not f Is Nothing Then
        sh.Cells(j, 5) = f.Offset(, 3)  'u medida
      End If
      j = j + 1
    Next
  End With
  Application.ScreenUpdating = True
  Application.CutCopyMode = False
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas