格式化消息框中的文本excel Vba

时间:2013-08-29 23:24:01

标签: vba excel-vba excel

我是Excel VBA的新手,已经编写了Vba代码来遍历单元格并获取它们的值。之后进行一些处理,如果匹配某个条件,则将它们附加到带换行符的列表中。 执行此操作直到完成所有行。这完全正常,最终结果如下图所示:

enter image description here

问题是我希望格式看起来整洁,所以有一种方法,文本之间的差距在所有行上是相同的,所以它看起来很整洁。 我添加行的方式是:

          Dim tmpLine
          tmpLine = line & "      " & dateVal
          mainMessage = mainMessage & tmpLine & vbNewLine

不确定它是否完美,但这就是我所知道的......

4 个答案:

答案 0 :(得分:12)

我得到了这个,也许它会解决你的问题:

Sub msgBoxTest()

    MsgBox "inininegefedf" & vbTab & "1234" & vbCr & _
            "asdcainininegefedf" & vbTab & "1234" & vbCr & _
            "inininegefedf" & vbTab & "1234afsad", vbCritical

End Sub

结果如下:

Result

答案 1 :(得分:3)

我已经为此实现了尽可能完整的解决方案,并为此付出了相当大的努力。从FmsgBox.xlsm工作簿中传输 clsFmsgBox frmFmsgBox modFmsgBox 时,以下代码导致this kind of message box可能会被管理相对较少的努力。上面的工作簿也提供了编码示例。

 With cFmsgBox
    .Title = "Message Box supporting formatted text. Example 1"
    .Msg = "This is the first " & _
     .b("Test ") & "message spanning over several lines and paragraphs. The default margins, spaces, and font size had been used. " & _
                   "No need to say that the form width had been adjusted manually in order to have an optimum appearance." & _
     .Lf & _
     .Lf & "The formats " & _
     .b("bold") & ", " & _
     .u("underline") & ", and " & _
     .i("italic ") & "and may be combined with any of the colours " & _
     .b(.i(.u(.red("red")))) & ", " & _
     .b(.i(.u(.blue("blue")))) & ", and " & _
     .b(.i(.u(.green("green")))) & "." & _
     .Lf & .Lf & _
           "5 different links may be included in the message text, either in the full form like " & _
     .link("www.google.com") & " or with a friendly name like " & .link("www.google.com", "google.com") & ", which masks the url behind it." & _
     .Lf & _
     .Lf & _
        "Also it shows 2 of the 6 possible reply buttons and that they may contain any text. Since the number of lines is maximized to 3 their width will be adjusted " & _
        "automatically - but will remain the same for all buttons. The string returned by the display call is identical with the string of the clicked reply button."

    .Reply1 = "Click this reply to continue with the next example"
    .Reply2 = "Click this reply to finish with the Message Box solution's features"
    .Dsply 318

    If .Reply = .Reply1 Then Example2
End With

消息显示在专用的用户窗体中,为每个格式化文本字符串动态创建标签,并动态创建(最多6个)命令按钮。格式化消息的关键是格式属性.b(“xxx”)表示粗体,.i(“xxx”)表示斜体等等,它们都可以嵌套,如.b(.i(“xxx”))例如,获得一个斜体,粗体文本。

或者,代替串联字符串,消息文本可以与RTF / HTML一样提供,例如格式化标签,其中打开/关闭标签字符默认为{}但也可以改为<>。例如:“{b}粗体{/ b){i}斜体{/ i}。”将显示:粗体 斜体

答案 2 :(得分:1)

实现string.Format() - 对于这一个msgbox来说有点过分,但可重用性是无穷无尽的:

Implementing String.Format() in VB6

msg = StringFormat("{0}\n{1,-10}{2:cMM/DD/YYYY}", msg, line, dateVal)之类的东西应该有用。

或者,重点关注实施的这一部分:

alignmentPadding = Abs(CInt(alignmentSpecifier))
If CInt(alignmentSpecifier) < 0 Then
    'negative: left-justified alignment
    If alignmentPadding - Len(formattedValue) > 0 Then _
        formattedValue = formattedValue & _
            String$(alignmentPadding - Len(formattedValue), PADDING_CHAR)
Else
    'positive: right-justified alignment
    If alignmentPadding - Len(formattedValue) > 0 Then _
        formattedValue = String$(alignmentPadding - Len(formattedValue), PADDING_CHAR) & formattedValue
End If

PADDING_CHAR将是一个“”空格,alignmentSpecifier是您需要的填充量。

换句话说,将line填充到20个字符,然后附加日期:

tmpLine = line & String$(20 - Len(line), " ") & dateVal & vbNewline

..适合我:

?"'abc12" & string$(20-len("'abc12"), " ") & "12/12/2004"
'abc12              12/12/2004
?"'abc1234" & string$(20-len("'abc1234"), " ") & "12/12/2004"
'abc1234            12/12/2004
?"'abc1234456" & string$(20-len("'abc1234456"), " ") & "12/12/2004"
'abc1234456         12/12/2004

<强>更新

似乎问题不在于消息字符串本身,而是因为MsgBox中使用的字体:对我有用的东西,因为我使用立即窗格来获取快速结果,并以等宽字体显示(其中所有字符的宽度相同)。

msgbox

我建议您使用固定宽度Label创建一个使用“Courier New”或“Consolas”等字体的快速表单...或者只显示可变长度部分前面的日期。

答案 3 :(得分:0)

我建议使用“userform”。在VBA编辑器中的VBA项目下,右键单击并选择“insert / userform”(或使用顶部菜单“insert / userform”)

从那里,您将在“工具箱”(或单击“视图/工具箱”)中看到许多ActiveX控件,它们可以帮助您构建您所追求的内容:听起来就像您在“列表框”之后,您应该在工具箱中找到(将鼠标悬停在项目上,“列表框”将显示为工具提示)

选择列表框后,您可以在“属性”窗口中设置列数加上列宽(如果看不到,请单击“视图/属性窗口”)

了解如何使用VBA用户表和列表框上的大量有关信息,或者很乐意回答任何其他问题。

干杯,Si

[编辑]只是想到了一些应该让你入门的代码(从我编写的一个小工具转向Office 2003引用到Office 2003引用):在我的主代码模块中我刚刚得到:

Sub FixReferences() 'Ctrl-Shift-F

    ufWorkbooks.Show

    If ufWorkbooks.blCancel = False Then
        With ufWorkbooks.lbWorkbooks
            For intindex = 0 To .ListCount - 1
                If .Selected(intindex) Then
                    SwapReferences Workbooks(.List(intindex))
                End If
            Next
        End With
    End If
End Sub

这会在ufWorkbooks.Show行中加载我的userform(称为ufWorkbooks)。此时执行传递给该表单:当执行返回时,检查表单中的变量以查看是否已按下cancel,然后您可以看到我在列表框的每个项目上运行了一个函数“lbWorkbooks”。我的用户窗体中的代码如下所示:

Public blCancel As Boolean

Private Sub cbCancel_Click()
    blCancel = True
    Me.Hide
End Sub

Private Sub cbOK_Click()
    Me.Hide
End Sub

Private Sub UserForm_Activate()
    blCancel = False

    FillWorkbooks
End Sub

Sub FillWorkbooks()
    Dim wbBook As Workbook

    lbWorkbooks.Clear

    For Each wbBook In Workbooks
        lbWorkbooks.AddItem wbBook.Name
    Next

End Sub

在这里你可以看到我正在使用不同的“事件”来触发某些代码。在底部你可以看到我的“FillWorkbooks”子程序首先清除我的列表框(我已经命名为lbWorkbooks)然后我正在添加项目。这适用于一个列列表框。在您的情况下,您可能希望使用.AddItem然后.List(0,1)=“whatever”(列表框中的第0行,第1列)。我不记得AddItem是否会在顶部添加一个空白行供您使用.List(0 ...或者如果你需要添加一个计数器.AddItem然后.List(i ...

或者,您可以使用Listbox.ListFillRange将电子表格中的一系列单元格用作列表框的数据源。