VbTab对齐问题

时间:2012-09-25 17:24:17

标签: excel-vba vba excel

我在VBA Excel应用程序中有一个列表框,它在其中读取三个不同的列并在一行中列出它们的内容。但是列中每个项目的宽度会有所不同。因此,当我使用“vbtab”在列表框中显示它时,它没有正确对齐下一个项目。例如,当第一个项目有4个字符时,它会将第二个项目拉近,而如果第一个项目有8个字符,则它会将第二个项目推得太远。知道如何解决这个问题吗?

以下是我正在使用的代码。

Private Sub UserForm_Activate()
With ThisWorkbook.Sheets("Sheet1").Range("a1:a50")
MySearch = Array("Tba")
For i = LBound(MySearch) To UBound(MySearch)
Set rng = .Find(what:=MySearch(i), _
After:=.Cells(.Cells.Count), _
LookIn:=xlFormulas, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False)

firstaddress = rng.Address


Do
j = 1
drovedate = rng.Offset(0, j)
j= j + 1
drivenby = rng.Offset(0, j)
j = j + 6
reason = rng.Offset(0, j)
x = x + 1
Dim LineOfText As String

CPHlsttheeba.AddItem (x & "   " & drovedate & vbTab() & vbTab & drivenby & vbTab & vbTab & reason)


Set rng = .FindNext(rng)
Loop While Not rng Is Nothing And rng.Address <> firstaddress
Next i
End With
End Sub

3 个答案:

答案 0 :(得分:2)

如果您的文字宽度已知,则可以使用.ColumnWidths的{​​{1}}来预定义列宽。这将确保数据正确对齐。如果文本宽度未知,那么您可以将ListBox1设置为您认为可以容纳所有单词的内容。在下面的示例中,我将其设置为.ColumnWidths

另一个技巧是不将数据循环添加到50,而是将其存储在数组中,然后将ListBox1的{​​{1}}属性设置为该数组。这将确保代码的执行更快。

这是一个例子。我在这里手动填充数组。您可以在.List

中填充数组

<强> CODE

ListBox1

<强> SCREENSHOT

enter image description here

<强>后续

  

抱歉,我不确定如何使用我的编码来处理数组和   列出他们..你能帮我一点.. - user1697952   1小时前

尝试此操作(未经测试

Do While Loop

答案 1 :(得分:2)

我认为Siddharth的方法更好,但是因为你问过......

而不是:

CPHlsttheeba.AddItem  x & "   " & drovedate & vbTab() & vbTab & _
                      drivenby & vbTab & vbTab & reason

你可以这样做:

CPHlsttheeba.AddItem RPad(x & "   " & drovedate, 20) & _
                     RPad(drivenby, 20) & reason




'pad a string "s" on the right with spaces to total length "num"
Function RPad(s, num)
    RPad = Left(s & String(num," "), num)
End Function

您可能需要根据字符串的长度调整填充量。 如果您使用固定字体格式化列表框,那么您的“列”应排成一行。

答案 2 :(得分:0)

我有类似的情况在MsgBox中创建一个表。我开始时:

第1项,标签,第2项,标签,第3项。

但有时第1项或第2项太长,需要2个标签才能保持排列。立即窗口中的一些简单测试向我显示默认的vbTab是8个字符宽。所以这就是我在循环中所做的,然后MsgBox在循环后显示:

strMsg = strMsg & ary(1, m) & vbTab & IIf(Len(ary(1, m)) < 8, vbTab, "") & IIf(Len(ary(1, m)) < 16, vbTab, "") & ary(2, m) & vbTab & IIf(Len(ary(2, m)) < 8, vbTab, "") & ary(3, m) & vbCr

如果前一个结果的长度很小,这实际上会在结果之间放置2或3个选项卡。