プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になっております
下記のコードのListBoxへの読み込み
早くやる方法おしえてくれませんでしょうか

50行5列ですが、ユーザーフォーム開いた時
リストボックスに表示させるのですが、
瞬時ではなくてもいいのですが
おしえてくれませんでしょうか

Application.ScreenUpdateingとか
検索してみたら、listbox 非表示にしてから
読み込んでから表示にする方法も確認しましたが、
イマイチおそいんです。

With Me.ListBox2
Dim i As Long
For i = 4 To Cells(Rows.Count, "B").End(xlUp).Row

.AddItem ""
.List(.ListCount - 1, 0) = Cells(i, 2).Value
.List(.ListCount - 1, 1) = Cells(i, 3).Value
.List(.ListCount - 1, 2) = Cells(i, 4).Value
.List(.ListCount - 1, 3) = Cells(i, 5).Value
.List(.ListCount - 1, 4) = Cells(i, 6).Value
Next
End With

質問者からの補足コメント

  • うーん・・・

    いつも有難うございます。
    いろいろ入っています。
    With ListBox5
    .AddItem "男"
    .AddItem "女"
    .ListIndex = -1
    End With
    UFが開いた時のコードは上記だけです。
    いろいろサイト拝見しましたら、
    lastRow = .Cells(Rows.Count, 1).End(xlUp).Row
    ReDim myData2(1 To lastRow, 1 To 3)
    For i = LBound(myData) To UBound(myData)
    If myData(i, 2) Like "*" & ListBox5.Value Then
    myData2(cn, 1) = myData(i, 1)
    myData2(cn, 2) = myData(i, 2)
    End If
    Next i
    これをListboxにアレンジできるのでしょぅか。

    No.2の回答に寄せられた補足コメントです。 補足日時:2020/08/15 21:30
  • うーん・・・

    下記のコードでObjectがないとエラーでます。
    Private Sub UserForm_Initialize()
    ListBox2.Visible = False
    Dim i As Long, LastRow As Long
    Dim myData2
    LastRow = Cells(Rows.Count, "B").End(xlUp).Row
    myData = Range(Cells(4, 4), Cells(LastRow, 7)).Value
    ReDim myData2(1 To LastRow, 1 To 6)
    For ii = LBound(myData) To UBound(myData)
    2回にわけます。

      補足日時:2020/08/15 21:49
  • うーん・・・

    With Me.ListBox2
    .AddItem ""
    .List(.ListCount - 1, 0) = myData2(ii, 2).Value
    .List(.ListCount - 1, 1) = myData2(ii, 3).Value
    .List(.ListCount - 1, 2) = myData2(ii, 4).Value
    .List(.ListCount - 1, 3) = myData2(ii, 5).Value
    .List(.ListCount - 1, 4) = myData2(ii, 6).Value
    ListBox2.Visible = True
    End With
    Next
    どこが間違っているところおしえてくれませんでしょうか

      補足日時:2020/08/15 21:50

A 回答 (5件)

#4です


>.List(.ListCount - 1, 0) = myData2(ii, 2).Value
の追記です。不具合のところだけ書いてしまったのですが、
.List(.ListCount - 1, 0) = myData2(ii, 2)方法も分かりますが、
配列やレンジで登録するなら、
(たぶんRange(Cells(4,4)がタイプミスとして想定)

Dim myData
LastRow = Cells(Rows.Count, "B").End(xlUp).Row
myData = Range(Cells(4, "B"), Cells(LastRow, "G")).Value
With Me.ListBox2
.ColumnCount = UBound(myData, 2)
ListBox2.List = myData
End With

一度しかアクセスしないので配列を使う必要があるかは、分かりませんが、
こんな感じでどうでしょう。
    • good
    • 0
この回答へのお礼

Dim myData
LastRow = Cells(Rows.Count, "B").End(xlUp).Row
myData = Range(Cells(4, "B"), Cells(LastRow, "G")).Value
With Me.ListBox2
.ColumnCount = UBound(myData, 2)
ListBox2.List = myData
End With
思い通りです
しかも列が多いとかの方が良いです
ありがとうございます

お礼日時:2020/08/16 08:13

#5ごめんなさい。


ListBox2.List = myData 動くけど
.List = myData ですね。

.Visible = Trueも・・・
    • good
    • 0
この回答へのお礼

いつも有難うございます。

お礼日時:2020/08/16 20:43

こんばんは、


どの位のタイムラグか分かりませんが、
ListBoxへ50行5列データの読み込みがインスタンス遅延の原因になる可能性は低いのではないかと思いますが、
UserFormを含むすべてのオブジェクトのデフォルト(プロパティウインドウで設定されている)設定を
検証してみてはいかがでしょう。(フォントやカラー、表示、、などなど)

ListBoxへのデータ登録については、
.RowSourceも良いとは思いますが、後に内容を変更する時に不具合が発生する可能性があったような記憶をしています。


>下記のコードでObjectがないとエラーでます。

これの原因は、配列に対して.Valueを使用している為です。

ただ、示されているコードを見ると?がいくつかあります。(表組みが見えないのであくまでロジックで)
例えば、LastRow = Cells(Rows.Count, "B").End(xlUp).Row これは、B列を対象にしていますが、
使われる場所がD~G列となっていますので、不具合を防ぐ為対象列範囲の確実な列を指定するべきかと思います。

ReDim myData2(1 To LastRow, 1 To 6)でmyData2はリセットされます。
また、2つの配列がありますが、myData2に値が入るコードがない様な?
実際には、1つのmyDataで良いように思います。
myData2(ii, 2)なぜmyData2(ii, 1)が無いのか?必要が無ければ元々作成する必要がなくなるのでは、、、と
さらに列方向の数も合わないような、、、この辺りは、他にロジックがあるのかも知れませんね。

参考まで
    • good
    • 0
この回答へのお礼

いつも有難うございます。

お礼日時:2020/08/16 20:43

こうかな?



With Me.ListBox2
.RowSource = "B4:F" & Cells(Rows.Count, "B").End(xlUp).Row
End With
    • good
    • 0
この回答へのお礼

いつも有難うございます。

お礼日時:2020/08/16 20:43

このコードだけで検証しても再現はされませんでしたね。


UFが開いたときにはすべての値が入ってました。

初級者なので見落としがあるのでしょうかね。
他のコントロールとの兼ね合いなど。
この回答への補足あり
    • good
    • 0
この回答へのお礼

いつも有難うございます。

お礼日時:2020/08/16 20:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!