2013-04-12 27 views
0

我有一列名稱,日期和標題,我嘗試輸出到文本框。我期待的輸出格式有以下「列」:基於字符串的當前長度將可變字符數添加到字符串

名稱|日期|標題|索引號

由於這只是一個文本框,我不得不使用製表符[chr(9)]來維護此表的「列」的間距。但是,由於人們有不同的長度名稱,我需要能夠輸入不同數量的選項卡,以便每個「列」正確排列。 (問題只在名稱和日期之間,其他「列」間距正確)

我試過下面的代碼,它假設(很可能不正確)該tab = 7個空格(我試過其他數字)。它試圖將日期與最初的Date標題標題一致,這是從左邊緣起的4個選項卡。作爲我的符號的註釋,爲了簡單起見,我用括號中的[文本框]和[名稱]替換了複雜的文本框和名稱路徑。在一個循環中運行如下:

[Text Box].Text = "Name" & Chr(9) & Chr(9) & Chr(9) & Chr(9) & "Date" & Chr(9) & "Reason" & Chr(9) & "Index#" & Chr(10) 

[[Begin Loop]] 

[Text Box].Text = [Text Box].Text & [Name] 

If Len([Name]) >= 0 And Len([Name]) < 7 Then 
    [Text Box].Text = [Text Box].Text & Chr(9) & Chr(9) & Chr(9) & Chr(9) 
ElseIf Len([Name])>= 7 And Len([Name]) < 14 Then 
    [Text Box].Text = [Text Box].Text & Chr(9) & Chr(9) & Chr(9) 
ElseIf Len([Name]) >= 14 And Len([Name]) < 21 Then 
    [Text Box].Text = [Text Box].Text & Chr(9) & Chr(9) 
ElseIf Len([Name]) >= 21 And Len([Name]) < 28 Then 
    [Text Box].Text = [Text Box].Text & Chr(9) 
End If 

NOTE: I found that names that were an exact multiple of 7 were one tab too short, thus I added: 

If Len([Name]) = 7 Or Len([Name]) = 14 Or Len([Name]) = 21 Then 
    [Text Box].Text = [Text Box].Text & Chr(9) 
End If 

[[End Loop]] 

大多數100+線在文本框中的正確一字排開,但似乎有些名(不是全部)已LEN = 14有一個額外的標籤。當我刪除添加7的倍數的額外選項卡的代碼時,len = 14的名稱中的一些(不是全部)名稱沒有足夠的標籤。

有沒有人有解決這個問題?或者我可以用另一種方式表示這些數據(即不是文本框)?

+1

您可以使用固定寬度的字體(如Courier)作爲文本框(如@NickSlash所示),只需填充空格而不是使用製表符。更容易設置,但固定寬度的字體通常不會很好看...... –

+0

重新閱讀您的問題,「有另一種方式嗎?」是!你可以使用列表框,因爲它們支持列 – NickSlash

回答

1

如果你只是爲了視覺對齊而做,而不需要將內容複製+粘貼到excel或其他東西(如CSV等),那麼你在做什麼是幾乎正確的。

您將需要進行兩次通過,第一次通過確定每個列的最大長度,第二次通過使用第一次的信息寫入,以使對齊正確。

除非您使用固定寬度的字體,否則它可能會更具挑戰性,因爲它可能使用寬度而不是字符數來確定標籤如何移動。 (不是100%肯定這個)

更新

我在做的東西去,將工作表轉換爲空間中被對齊字符串,也許你想要做什麼:)

Const TABSIZE = 3 

Public Function Main2(Optional ByVal SheetName As String = "Sheet1") As String 
Dim Sheet As Worksheet: Set Sheet = ThisWorkbook.Worksheets(SheetName) 
Dim Data As Variant 
Dim Index, Row, Column As Long 
Dim Max() As Integer 
Data = Sheet.UsedRange.Value2 
ReDim Max(LBound(Data, 2) To UBound(Data, 2)) 
' configure the Max() array with default values 
For Index = LBound(Max) To UBound(Max) 
    Max(Index) = 0 
Next Index 
' populate the Max() array with the maximum width 
For Index = LBound(Data, 1) To UBound(Data, 1) 
    For Column = LBound(Data, 2) To UBound(Data, 2) 
     If Len(Data(Index, Column)) > Max(Column) Then 
      Max(Column) = Len(Data(Index, Column)) 
     End If 
    Next Column 
Next Index 
' add the tabsize to the max (add a gap between columns) 
' note: the loop below is not required, has been rolled into the output loop 
'For Index = LBound(Max) To UBound(Max) 
' Max(Index) = Max(Index) + TABSIZE 
'Next Index 
' output the data! 
For Row = LBound(Data, 1) To UBound(Data, 1) 
    For Column = LBound(Data, 2) To UBound(Data, 2) 
     'Result = Result & Pad(Data(Row, Column), Max(Column)) 
     Result = Result & Pad(Data(Row, Column), Max(Column) + TABSIZE) 
    Next Column 
    Result = Result & vbCrLf 
Next Row 
' return it 
Main2 = Result 
End Function 

' pad text to length with spaces 
Public Function Pad(ByVal Text As String, ByVal Length As Long) As String 
Pad = Text & Space(Length - Len(Text)) 
End Function 
+0

我決定只是使用固定的字體,並使用或多或少我上面的相同的代碼。如果我將來遇到問題,儘管@ NickSlash的答案將是解決方案。 – user1825257