Jump to content
giordancisco

Salto de linea desde listbox a celda

Recommended Posts

Qué tal?

tengo dos problemas con un creador de etiquetas que estoy tratando de armar, el primero tiene que ver con lo que indicia el titulo: Desde un listbox envío la información de 4 columnas correspondientes a cada fila del mismo listbox hacia una celda de una hoja de calculo. esa información esta concatenada con un salto de linea, de manera que una celda forma la etiqueta con la información de toda una fila del listbox. Cual es el problema?

El problema viene cuando quiero asignarle a cada salto de linea un formato correspondiente, ya que al terminar de ejecutarse la macro, en la hoja los saltos de linea si bien se visualizan en la celda, no se reconocen correctamente en la función Characters que utilizo para detectar la ubicación del texto que le asignara un formato especifico (estilo negrita, color rojo) y el mismo termina desfasado 2 caracteres antes, que se corresponden a los 2 caracteres de los saltos de paginas enviados desde el listbox. PERO! si hago DOBLE CLIC en la celda y luego clic en cualquier otra, esta se actualiza y ahi si reconoce bien los saltos de pagina y el estilo del texto se acomoda finalmente como tiene que ser. 

Posiblemente me este complicando al querer armar una etiqueta con varia información en una sola celda pudiendo armar un grupo de celdas para cada linea de datos.

el segundo problema viene con la estructura doble for next que estoy utilizando, creo que no esta bien resuelta ya que se torna muy lento el proceso de generación de cada etiqueta. 

Desde ya muchas gracias y a continuación adjunto el código y los archivos.

En rojo dejo marcado donde arrancaría la parte mas conflictiva.

Private Sub generar_Click()
If Me.ListBox1.ListCount = 0 Then
MsgBox "Debe ingresar al menos un producto para generar la etiqueta. Haga clic en el botón ""Buscar Prodcuto"".", , "Creador de Etiquetas - CHACO SANITARIOS"
Exit Sub
End If

Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim nFila, nColumna, Fin

With Sheets("ETIQUETAS").Cells
.Clear
'.Font.Bold = False
.Font.Name = "Calibri Light"
.Font.Size = 8
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlVAlignCenter

'.VerticalAlignment = xlCenter

.RowHeight = 58
.ColumnWidth = 23
'.Columns.AutoFit
'.WrapText = True
End With

'CONFIGURACIONES DE HOJA

'Application.PrintCommunication = True
'With Sheets("ETIQUETAS").PageSetup
'.PaperSize = xlPaperA4

'.Orientation = xlLandscape

'.RightMargin = Application.InchesToPoints(0.4)
'.LeftMargin = Application.InchesToPoints(0.4)
'.TopMargin = Application.InchesToPoints(0.4)
'.BottomMargin = Application.InchesToPoints(0.4)
'.HeaderMargin = Application.InchesToPoints(0.4)
'.FooterMargin = Application.InchesToPoints(0.4)

'.PrintArea = "$A$1:$F$" & uf + 1
' .PrintTitleRows = "$1:$2"
'.FitToPagesWide = 1
'.FitToPagesTall = 1
'.CenterHeader = "Página " & "&P" & " de " & "&N"
'"Página " & "&Z&P&#" & "de" & "&Z&#"
'End With

Fin = Me.ListBox1.ListCount
nfila2 = 0

For nFila = 0 To Int((Fin - 1) / 4)

    For nColumna = 0 To 3
     
   
Dim join As String
    join = "CP: " & ListBox1.List(nfila2, 0) _
    & vbCrLf & ListBox1.List(nfila2, 1) & vbCrLf & ListBox1.List(nfila2, 2) & vbCrLf & ListBox1.List(nfila2, 3)
        
    Sheets("ETIQUETAS").Cells((1 * nFila) + 1, (1 * nColumna) + 1) = join '"CP: " & ListBox1.List(nfila2, 0) _
    & vbCrLf & ListBox1.List(nfila2, 1) & vbCrLf & ListBox1.List(nfila2, 2) & vbCrLf & ListBox1.List(nfila2, 3)
       
    
    Dim starpre As Integer
    Dim longpre As Integer
    starpre = Len(ListBox1.List(nfila2, 0)) + 5 + Len(ListBox1.List(nfila2, 1)) + 1
    longpre = Len(ListBox1.List(nfila2, 2)) + 1
             
          
        With Sheets("ETIQUETAS").Cells((1 * nFila) + 1, (1 * nColumna) + 1).Characters(starpre, longpre)
           .Font.Size = 10
           .Font.Bold = True
           .Font.ColorIndex = 3
        End With

       
       Sheets("ETIQUETAS").Cells((1 * nFila) + 1, (1 * nColumna) + 1).BorderAround _
       ColorIndex:=0, Weight:=xlThick
       
       nfila2 = nfila2 + 1
     
     If nfila2 = Fin And Fin = 1 Then
     
     MsgBox "Se creó " & Fin & " Etiqueta", , "Creador de Etiquetas - CHACO SANITARIOS"
     
     Sheets("ETIQUETAS").Select
     
     Application.ScreenUpdating = True
     Application.DisplayAlerts = True
     
     End
     End If
     
     If nfila2 = Fin And Fin > 1 Then
     MsgBox "Se crearon " & Fin & " Etiquetas", , "Creador de Etiquetas - CHACO SANITARIOS"
     
      Sheets("ETIQUETAS").Select
      
      Application.ScreenUpdating = True
      Application.DisplayAlerts = True
      
      End
      End If
      
        
    Next nColumna
    
Next nFila
 
 nfila2 = 0
 
End Sub

 

 

Adjunto Link ya que supera el peso permitido para adjuntar. https://drive.google.com/drive/folders/1xgdyPVbxT-T_yajZ2GAJrPhep-t_M6vz?usp=sharing 

Son 2 archivos un excel que contiene el formulario, se llama "etiquetas" y el otro corresponde a una base de datos acces donde se alojan los productos que se deberán buscar desde el formulario excel para finalmente generar las etiquetas.
El usuario se llama ADMIN y la contraseña es: 1234 

Adjunto ademas una imagen  en la misma se visualizan las etiquetas, en la primera se hizo doble clic y sola se actualizo y corrigió, las demás están tal cual finalizo el código. Notar que el precio a partir de la coma no tiene el formato asignado, son los dos caracteres del salto de pagina.

Si no me he expresado lo suficiente y/o necesitan que modifique los archivos para que sea mas fácil y claro por favor hacérmelo saber. Nuevamente muchas gracias por leer y disculpen las molestias, un abrazo

problema.jpg

Share this post


Link to post
Share on other sites

Acabo de encontrar la solución para el problema del salto de pagina: reemplacar "vbCrLf " por "Chr(10)" lo soluciona. Ahora solo quedaría que me den alguna sugerencia para poder agilizar la velocidad de generación de etiquetas. Gracias

Share this post


Link to post
Share on other sites
Hace 7 horas, giordancisco dijo:

Ahora solo quedaría que me den alguna sugerencia para poder agilizar la velocidad de generación de etiquetas. Gracias

Para reducir el tiempo por más de la mitad es solo quitar de tu código esto:

With Sheets("ETIQUETAS").Cells
.Clear
'.Font.Bold = False
.Font.Name = "Calibri Light"
.Font.Size = 8
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlVAlignCenter

'.VerticalAlignment = xlCenter

.RowHeight = 58
.ColumnWidth = 23
'.Columns.AutoFit
'.WrapText = True
End With

Ya que como le dices a Excel que TODAS las celdas de la Hoja tengan esas características por eso se tarda. Es mejor preparar la hoja para ese tipo de Etiquetas. Y si tienes diferentes Tamaños y estilos es mejor preparar una hoja para cada tipo de etiqueta o SOLO EL RANGO A USAR.

 

Saludos.

Share this post


Link to post
Share on other sites
Hace 2 horas, Leopoldo Blancas dijo:

Para reducir el tiempo por más de la mitad es solo quitar de tu código esto:


With Sheets("ETIQUETAS").Cells
.Clear
'.Font.Bold = False
.Font.Name = "Calibri Light"
.Font.Size = 8
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlVAlignCenter

'.VerticalAlignment = xlCenter

.RowHeight = 58
.ColumnWidth = 23
'.Columns.AutoFit
'.WrapText = True
End With

Ya que como le dices a Excel que TODAS las celdas de la Hoja tengan esas características por eso se tarda. Es mejor preparar la hoja para ese tipo de Etiquetas. Y si tienes diferentes Tamaños y estilos es mejor preparar una hoja para cada tipo de etiqueta o SOLO EL RANGO A USAR.

 

Saludos.

Gracias señor Leopoldo, tal como usted dice lo he comprobado al agregar un barra de carga, tarda como 3 segundos hasta iniciar el primer bucle for next. 
Lo había dejado así porque la idea era que en principio la hoja no existiese, se creace, llenase, se exporte a pdf y luego se elimine. Pero viendo lo que tarda seguramente conviene como usted muy bien indica.

Ahora Tengo mis dudas sobre 

El doble ciclo for next que estoy usando, seria posible otra alternativa combinándolo con un do while?. 

Usar el listbox para ir almacenando los datos es lo que puede hacer mas lento el bucle? seria mas rapido almacenarlos en una hoja de calculo?.

Desde ya muchas gracias por contestar. Saludos

Share this post


Link to post
Share on other sites
Hace 13 minutos , giordancisco dijo:

El doble ciclo for next que estoy usando, seria posible otra alternativa combinándolo con un do while?. 

No es necesario.

Hace 13 minutos , giordancisco dijo:

Usar el listbox para ir almacenando los datos es lo que puede hacer mas lento el bucle? seria mas rapido almacenarlos en una hoja de calculo?.

Sería el mismo tiempo.

NOTA: Lo que aligeraría un poco es quitar las sentencias de celdas como estas:       

 With Sheets("ETIQUETAS").Cells((1 * nFila) + 1, (1 * nColumna) + 1).Characters(starpre, longpre)
           .Font.Size = 10
           .Font.Bold = True
           .Font.ColorIndex = 3
        End With

Saludos.

P.D.: PARA MI SE MANEJA RÁPIDO, A NO SER QUE SEA UNA BASE DE DATOS MUY GRANDE LA REAL, O TU MÁQUINA SEA CHIQUITA.

Share this post


Link to post
Share on other sites
Hace 3 minutos , Leopoldo Blancas dijo:

No es necesario.

Sería el mismo tiempo.

NOTA: Lo que aligeraría un poco es quitar las sentencias de celdas como estas:       


 With Sheets("ETIQUETAS").Cells((1 * nFila) + 1, (1 * nColumna) + 1).Characters(starpre, longpre)
           .Font.Size = 10
           .Font.Bold = True
           .Font.ColorIndex = 3
        End With

Saludos.

P.D.: PARA MI SE MANEJA RÁPIDO, A NO SER QUE SEA UNA BASE DE DATOS MUY GRANDE LA REAL, O TU MÁQUINA SEA CHIQUITA.

Gracias señor Leopoldo, la maquina que estoy manejando ya es vieja, es un i7 3770k, de todos modos lo que estoy haciendo esta destinado para maquinas aun mas lentas.

Ahora bien la sentencia que usted indica es la que selecciona una parte del texto de la celda y la da formato para que la etiqueta sea mas clara. Ese formato no lo puedo dejar preparado de antemano ya que solo puedo hacerlo con todo el contenido del texto de la celda correspondiente. Hay una sentencia mejor para conseguir el mismo resultado?

Share this post


Link to post
Share on other sites
Hace 2 minutos , Leopoldo Blancas dijo:

No, esta bien entonces.

Lo que pasa es que en mi máquina que es una de doble núcleo 4GB RAM, ni a i3 llega, es rápido lo que hace.

Si se tarda un segundo es mucho.

Saludos.

Pudiste descargar el archivo que subí y lo probaste? si es así intenta crear 50 etiquetas o 100.
Ahora re subo en todo caso el archivo, estoy declarando todas las variables 

Share this post


Link to post
Share on other sites
Hace 28 minutos , Leopoldo Blancas dijo:

Ya hice 100 etiquetas y NO SE TARDA NI UN SEGUNDO, lo hace en 2 hojas.

REVISA TU MÁQUINA, LO DEBERÍA DE HACER EN MENOS TIEMPO QUE EL MIO.

Sin título.png

Señor Leopoldo me estoy preocupando, adjunto la ultima versión por favor dígame si la velocidad ahora es mas lenta o mas rápida. Voy a pasar el ccleaner y reiniciar la maquina para ver si puedo dar con el problema. Desde ya muchas gracias

https://drive.google.com/file/d/1ztHCMAwRzcY4DUIY1TvTVPpNsu2QBEBA/view?usp=sharing

Share this post


Link to post
Share on other sites
Hace 8 minutos , Leopoldo Blancas dijo:

Ni un segundo con tu nuevo archivo.

Saludos.

NOTA: CCLEANER Y UN ANTIVIRUS.

Recién acabo de pasar ccleaner, reiniciar y de paso moví el archivo fuera de la carpeta de dropbox por las dudas, y tal cual como usted lo comprobó se ejecuto en menos de un segundo! muchas gracias señor Leopoldo le aprecio mucho por acompañar este proceso. Un abrazo!

Share this post


Link to post
Share on other sites
Hace 9 minutos , giordancisco dijo:

Recién acabo de pasar ccleaner, reiniciar y de paso moví el archivo fuera de la carpeta de dropbox por las dudas

Jajaja si por la nube es más lento....Recuerda que se tiene que actualizar en la nube para que todos lo puedan "ver"...

Saludos.

Share this post


Link to post
Share on other sites
Hace 3 minutos , Leopoldo Blancas dijo:

Jajaja si por la nube es más lento....Recuerda que se tiene que actualizar en la nube para que todos lo puedan "ver"...

Saludos.

Si efectivamente el problema era abrir el archivo desde la carpeta compartida de DROPBOX. Yo pensaba que al estar en mi pc es como si estuviera en cualquier ubicación de mi computadora por mas que la sincronización este pausada. Pareciera ser que dropbox no se lleva muy bien con excel voy a probar con Google drive. 
Muchas gracias por todo, el tema si les parece se puede dar como finalizado.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

×
×
  • Create New...

Important Information

Privacy Policy

Ayuda Excel - Madrid, Madrid, ES - Valorada por 5112 personas - Aprender Excel - Total: 4.7 / 5