1

VBA Excel アプリケーションにリストボックスがあり、3 つの異なる列を読み取り、その内容を 1 行に一覧表示します。ただし、列内の各項目の幅は異なります。したがって、「vbtab」を使用してリストボックスに表示すると、次のアイテムが正しく配置されません。たとえば、最初のアイテムが 4 文字の場合、2 番目のアイテムは近くに引き寄せられますが、最初のアイテムが 8 文字の場合、2 番目のアイテムは少し遠すぎます。これを修正する方法はありますか?

以下は私が使用しているコードです。

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
4

3 に答える 3

2

シッダールスのアプローチの方が良いと思いますが、あなたが尋ねたので...

これの代わりに:

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

文字列の長さによっては、パディングの量を調整する必要がある場合があります。固定フォントを使用してリストボックスをフォーマットすると、「列」が揃うはずです。

于 2012-09-27T00:30:19.830 に答える
2

テキスト幅がわかっている場合は、.ColumnWidthsのを使用しListBox1て列幅を事前定義できます。これにより、データが適切に配置されます。テキストの幅がわからない場合は、.ColumnWidthsすべての単語が収まると思われる幅に を設定できます。以下の例では、私はそれを設定しました50

もう 1 つのトリックは、ループ内のデータを に追加するのではなく、配列に格納してから、 のプロパティをその配列ListBox1に設定することです。これにより、コードの実行が高速になります。.ListListBox1

ここに例があります。ここで配列を手動で埋めています。あなたはあなたの配列を埋めることができますDo While Loop

コード:

Private Sub UserForm_Activate()
    Dim Myarray(1 To 2, 1 To 4) As String

    Myarray(1, 1) = "Sid"
    Myarray(1, 2) = "Apple"
    Myarray(1, 3) = "Banana"
    Myarray(1, 4) = "Mumbai"
    Myarray(2, 1) = "New Delhi"
    Myarray(2, 2) = "New York"
    Myarray(2, 3) = "Japan"
    Myarray(2, 4) = "asdfghjkl"

    With Me.ListBox1
        .Clear
        .ColumnHeads = False
        .ColumnCount = 4

        .List = Myarray

        '~~> Change 50 to 8 in your application
        .ColumnWidths = "50;50;50;50"
        .TopIndex = 0
    End With
End Sub

スクリーンショット:

ここに画像の説明を入力

ファローアップ

申し訳ありませんが、コーディングを配列に合わせてリストする方法がわかりません..少し手伝っていただけませんか.. – user1697952 1時間前

これを試してください(未テスト

Private Sub UserForm_Activate()
    Dim n As Long

    With CPHlsttheeba
        .ColumnHeads = False
        .ColumnCount = 4
        .ColumnWidths = "8;8;8;8"
    End With

    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 "Test" & n, n
                CPHlsttheeba .List(n, 0) = drovedate
                CPHlsttheeba .List(n, 1) = drivenby
                CPHlsttheeba .List(n, 2) = reason

                n = n + 1

                Set rng = .FindNext(rng)
            Loop While Not rng Is Nothing And _
            rng.Address <> firstaddress
        Next i
    End With
End Sub
于 2012-09-25T17:49:15.680 に答える
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 つのタブが挿入されます。

于 2013-05-01T02:28:49.090 に答える