我是Excel VBA的新手,已经编写了Vba代码来遍历单元格并获取它们的值。之后进行一些处理,如果匹配某个条件,则将它们附加到带换行符的列表中。 执行此操作直到完成所有行。这完全正常,最终结果如下图所示:
问题是我希望格式看起来整洁,所以有一种方法,文本之间的差距在所有行上是相同的,所以它看起来很整洁。 我添加行的方式是:
Dim tmpLine
tmpLine = line & " " & dateVal
mainMessage = mainMessage & tmpLine & vbNewLine
不确定它是否完美,但这就是我所知道的......
答案 0 :(得分:12)
我得到了这个,也许它会解决你的问题:
Sub msgBoxTest()
MsgBox "inininegefedf" & vbTab & "1234" & vbCr & _
"asdcainininegefedf" & vbTab & "1234" & vbCr & _
"inininegefedf" & vbTab & "1234afsad", vbCritical
End Sub
结果如下:
答案 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
中使用的字体:对我有用的东西,因为我使用立即窗格来获取快速结果,并以等宽字体显示(其中所有字符的宽度相同)。
我建议您使用固定宽度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将电子表格中的一系列单元格用作列表框的数据源。