[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ListView1読み込みスピードアップするには』(nobu)
読み込みデータの容量が多いのか読み込みに時間がかかります。
読み込み時間を短縮させる方法は、ありませんか?
アドバイス よろしくお願いします。
以下マクロです
Private Sub UserForm_Activate()
Dim WB As Excel.Workbook Dim sh As Excel.Worksheet Application.ScreenUpdating = False
Dim selIdx As Long selIdx = Val(Range("Y1")) If selIdx = 0 Then selIdx = 4
Dim DBpath As String Dim i As Long With ListView1 .View = lvwReport ''表示 .LabelEdit = lvwManual ''ラベル編集 .HideSelection = False ''選択の自動解除 .AllowColumnReorder = True ''列幅の変更許可 .FullRowSelect = True ''行全体選択 .Gridlines = True ''グリッド ''列見出し .ColumnHeaders.Add , "_hinichi", "月日", 75 .ColumnHeaders.Add , "_siire", "取引先", 100 .ColumnHeaders.Add , "_genba", "件名", 110 .ColumnHeaders.Add , "_tyuuban", "注番", 60 .ColumnHeaders.Add , "_siharai", "金額", 90 .ColumnHeaders.Add , "_sousatu", "相殺金額", 70 .ColumnHeaders.Add , "_tekiou", "適応", 200 .ColumnHeaders.Add , "_tuuti", "通知", 40 End With
DBpath = "D:\Office\Item\支払台帳\支払台帳2020.xlsm"
If Not m_ShownFlag Then Set WB = Workbooks.Open(DBpath) Set sh = WB.Worksheets("台帳") With ListView1 For i = 4 To Range("A" & Rows.Count).End(xlUp).Row
With .ListItems.Add(Text:=Cells(i, 1).Value) .SubItems(1) = Cells(i, 2).Value .SubItems(2) = Cells(i, 3).Value .SubItems(3) = Cells(i, 5).Value .SubItems(4) = Format(Cells(i, 9).Value, "#,##0") .SubItems(5) = Format(Cells(i, 14).Value, "#,##0") .SubItems(6) = Cells(i, 16).Value .SubItems(7) = Cells(i, 15).Value End With ListView1.ColumnHeaders.Item(2).Alignment = lvwColumnLeft ListView1.ColumnHeaders.Item(3).Alignment = lvwColumnLeft ListView1.ColumnHeaders.Item(4).Alignment = lvwColumnCenter ListView1.ColumnHeaders.Item(5).Alignment = lvwColumnRight ListView1.ColumnHeaders.Item(6).Alignment = lvwColumnRight ListView1.ColumnHeaders.Item(7).Alignment = lvwColumnLeft ListView1.ColumnHeaders.Item(8).Alignment = lvwColumnCenter Next '年月日の部分は初めから降順にする .SortKey = .ColumnHeaders("_hinichi").INDEX - 1 .SortOrder = lvwDescending .Sorted = True WB.Close False If .ListItems.Count >= selIdx Then .ListItems(selIdx).Selected = True ListView1.SetFocus End If End With Application.ScreenUpdating = True End If End Sub
< 使用 Excel:Excel2019、使用 OS:Windows10 >
なお、別件ですが、気づきましたので。
支払台帳2020.xlsmの操作にあたって、シートの指定がされていませんが、
シートを指定した形で、セルの値を取得したほうがよいかと思います。
アクティブシートのままだと、気持ちが悪いです。
(今はシートが一つしかなくても、今後は保証できませんし。)
(γ) 2020/11/18(水) 20:44
データが何行あるのかわかりませんが、 ブックを開くのに時間がかかっているならどうしようもないと思います。
それでも、細々時間を削ろうとするなら、
ListView1.ColumnHeaders.Item(2).Alignment = lvwColumnLeft これら一連のステートメントは、For Nextループの中にある必要はないと思います。
Cellにいちいちアクセスしないで、配列に読み出しておいてから 配列からListViewに値をセットした方が、早くなります。
多分ボトルネックは、ファイルを開くところだと思うので、 UserForm_Activate だと頻繁に読み出すことになるので、 UserForm_Initialize で一回だけで済むようにしたり、
ファイルを開いたときに同時に"支払台帳2020.xlsm"を開いて 隠しシートに必要なデータをコピーしておく
などが考えられると思います。 (´・ω・`) 2020/11/18(水) 22:43
(´・ω・`) さん
ありがとうございます。
以下のご指摘ですがもう少し詳しく
サンプルマクロなど、お願いできますか?
マクロ苦手なので・・・
> ListView1.ColumnHeaders.Item(2).Alignment = lvwColumnLeft
> これら一連のステートメントは、For Nextループの中にある必要はないと思います。
> Cellにいちいちアクセスしないで、配列に読み出しておいてから
> 配列からListViewに値をセットした方が、早くなります。
(nobu) 2020/11/19(木) 04:19
Alignment をセットしているステートメントは For Next ループの外にだしてもいいですね? ColumnHeaders.Add している With の中にあってもよいと思います。
配列については http://officetanaka.net/excel/vba/speed/s11.htm を参考にしてください。 読み込みだけなので、速度向上は微々たるものだと思います。 (´・ω・`) 2020/11/19(木) 09:34
前にも書いてますが > 多分ボトルネックは、ファイルを開くところだと思うので、 と思います。
本気でやるなら、時間を計測してみたらどうでしょう。 データをコピーしておいて、いちいち別ファイルを開かないようにするのがいいと思います。
更新のタイミングがよく分かりませんが。 (´・ω・`) 2020/11/19(木) 17:06
データをコピーしておいて、いちいち別ファイルを開かないようにするのがいいと思います。 (nobu) 2020/11/19(木) 19:58
運用がわからないので、ほんとに早くなるかどうかは、不確かですが、
UserFormを開くたびに 支払台帳2020.xlsm を開いているので、 UserFormを表示したり閉じたりを繰り返す場合は、 ・UserForm_Initialize で ListViewを初期設定する。 ・UserFormを閉じるときは Unlooad しないで、Hideするだけにする。 のが有効だと思います。
また、支払台帳2020.xlsm と同じデータを、自分のシートに持てば、 支払台帳2020.xlsm を開く必要がなくなるので、その分のオーバーヘッドがなくなると思いますが、 データの整合性をどう保つかが問題になります。 それは、これらの2つのブックをどう運用しているかを知らないと判断できないので、 私にはわかりません。 ご自分で考えないといけない課題だと思います。
提示された UserForm_Activate だけを見る限り、 技術的には部分的な速度向上は、見込みが少ないので、 全体的な運用を見直さないと無理ですねという話をしています。 ちょいちょいっと、サンプルコードがかけるようなことではありません。 (´・ω・`) 2020/11/20(金) 09:13
昔は一瞬で開いたのが今は1秒かかる なのか 昔は1秒で開けたのが今は10秒かかる なのか 昔は10秒で開けたのが今は1分かかる なのか。
速度のチューニングの話なのに、現状も目標も妥協ラインも明示されて無いため、欲しい回答は得られないと思います。
もし1分→10秒が狙いなのに、1秒→一瞬を目的としたチューニング方法は全く効果がないですからね。
また、「容量が多いのか」については、数件しかないデータを用意して速度を計測して、
100件のとき何秒かかる 10000件のとき何秒かかる だから、「容量が増えたので遅くなった」といえます。
ソースコードを途中からバッサリ切り落として、どこまでなら早く、どこから先は遅いのか、1行づつ増やして試してみれば、遅くしている原因のプログラムは分かります。
遅くなっている原因を特定するところから、初めてはどうでしょう。
(通りすがり) 2020/11/20(金) 09:44
(通りすがり)さん
ありがとうございました。
こつこつやってみます。
(nobu) 2020/11/20(金) 13:11
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.