Pregunta para Dante Amor. MsgBox (datos alineados)

Hola. Me creaste esta Macro que fue de mucha ayuda. Si te fijas los nombres aparecen alineados, pero no los valores. Estos están apegados al largo del nombre. Le he dado espacios, pero no consigo lo que quiero. Que estos aparezcan así tal cual lo muestra el excel. Un formato ordenado con los valores justificado hacia la derecha.

Sub men()
    rango = "A1:B10"
    For i = 1 To 10
        m = m & Cells(i, "A") & " " & Format(Cells(i, "B"), "$ #,##0.00") & vbCr
    Next
    MsgBox m
End Sub

1 Respuesta

Respuesta
2

Lo que pides lo hace esta macro, aumenta el número de espacios de acuerdo al nombre más largo y pone tabuladores para alinear el importe.

Sub men()
'Por.DAM
    rango = "A1:A10"
    largo = Evaluate("=MAX(LEN(" & "A1:A10" & "))")
    veces = Int(largo / 10)
    For i = 1 To 10
        nlargo = Len(Cells(i, "A"))
        If nlargo < largo Then
            espacios = largo - nlargo
            For j = 1 To espacios
                cad = cad & "  "
            Next
            For k = 1 To veces
                cad = cad & vbTab
            Next
        Else
            For k = 1 To veces
                cad = cad & "   " & vbTab
            Next
        End If
        m = m & Cells(i, "A") & cad & Format(Cells(i, "B"), "$ #,##0.00") & vbCr
        cad = ""
    Next
    MsgBox m
End Sub

Pero el resultado es algo como esto:

Entre los nombres y el importe existe el mismo número de espacios. El problema es que el tamaño de las letras y de los espacios no es el mismo, esto es debido al tipo de letra, por ejemplo una "m" no es del mismo tamaño que una "i", es por eso que no se logra que la columna de importe quede alineada.

Además el tabulador es algo inestable y también es debido al tamaño de los caracteres. Y por último no se podría lograr que los números se justifiquen a la derecha.

Para lograr algo más dinámico, tendría que ser con un userform, quedaría algo como esto:

El código para el formulario sería algo como esto

Private Sub CommandButton1_Click()
'Por.DAM
    Unload Me
End Sub
Private Sub UserForm_Activate()
'Por.DAM
    ListBox1.Enabled = False
    ListBox2.Enabled = False
    a = ListBox1.Width
    largo = Evaluate("=MAX(LEN(" & "A1:A10" & "))")
    ListBox1.Width = (largo * 7.47) + (3 * 7.47)
    ListBox2.Left = (largo * 7.47)
    CommandButton1.Left = (largo * 7.47)
    Me.Width = ListBox1.Width + ListBox2.Width + 3
    Me.Caption = "Lista de nombres e importes"
    For i = 1 To 10
        ListBox1.AddItem Cells(i, "A")
        ListBox2.AddItem Format(Cells(i, "B"), "$ #,##0.00")
    Next
End Sub

Tendrás que crear un formulario: "userform1", con 2 listbox: "listbox1" y "listbox2" y commandbutton: "commandbutton1".

Si quieres, puedo crear el formulario en tu libro, envíame tu archivo para adaptar el formulario.

Gracias Dante Amor

Como tú dices me resulta mgsbox tal como dices y va depender del tamaño de la letra.

La otro a través de Userfor. Lo pegue tal cual, pero me arroja un error. ( El archivo no es más de lo que ves en el Excel. En realidad es la base para lo que quiero armar. Mi idea es reemplazar los comentarios en las celdas, por eso pedía lo de Msgbox. En realidad los de userform se ve mucho mejor.

El error te aparece porque no creaste el listbox1, como te dije tienes que crear 2 listbox y commandbutton, pero dentro del userform.

Si tienes problemas para crear el userform envíame tu archivo para adaptarlo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas