[[20210427014111]] 『表示速度をあげるには』(kawai) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『表示速度をあげるには』(kawai)

ユーザーフォームのListViewの表示速度を上げる方法が
あればご教授お願いします。
読み込むデータが同一book内ならば瞬時に表示できるのですが
別bookで読み込んだ場合ユーザーフォームが表示されてから
データが表示されるのに少々時間が掛かります。この解決策は
ないでしょうか?

同位置book内マクロ
別book内マクロ 2通り下記に貼ってみます
確認よろしくお願いします。
Private Sub UserForm_Activate()

    Dim sh As Excel.Worksheet
    Dim selIdx As Long
    Dim i As Long

    selIdx = Val(Worksheets("sheet1").Range("AA1"))
    If selIdx = 0 Then selIdx = 4

    Set sh = Worksheets("概要")
    With ListView1
        ''プロパティ
        .View = lvwReport           ''表示
        .LabelEdit = lvwManual      ''ラベルの編集
        .HideSelection = False      ''選択の自動解除
        .AllowColumnReorder = True  ''列幅の変更を許可
        .FullRowSelect = True       ''行全体を選択
        .Gridlines = True           ''グリッド線
        .ColumnHeaders.Add , "_ban", "番", 30
        .ColumnHeaders.Add , "_simei", "氏名", 100
 End With
    If Not m_ShownFlag Then
        With ListView1
            For i = 3 To sh.Range("O" & Rows.Count).End(xlUp).Row
            With .ListItems.Add(Text:=sh.Cells(i, 15).Value)
                .SubItems(1) = sh.Cells(i, 16).Value
            End With

            ListView1.ColumnHeaders.Item(1).Alignment = lvwColumnLeft
            Next
        If .ListItems.Count >= selIdx Then
            .ListItems(selIdx).Selected = True
            ListView1.SetFocus
                End If
        End With
        m_ShownFlag = True
    End If
End Sub
’==================================

Private Sub UserForm_Activate()

    Dim WB As Excel.Workbook
    Dim Sh As Excel.Worksheet
    Dim DBpath As String
    Dim i As Long
    Dim selIdx As Long

   DBpath = "C:\pack\名簿.xlsm"
   Application.ScreenUpdating = False
    With ListView1
        .View = lvwReport           ''表示
        .LabelEdit = lvwManual      ''ラベルの編集
        .HideSelection = False      ''選択の自動解除
        .AllowColumnReorder = True  ''列幅の変更を許可
        .FullRowSelect = True       ''行全体を選択
        .Gridlines = True           ''グリッド線
        .ColumnHeaders.Add , "_co", "??", 25
        .ColumnHeaders.Add , "_code", "コード", 140
        .ColumnHeaders.Add , "_name", "名前", 220
        .ColumnHeaders.Add , "_saito", "担当", 200
        .ColumnHeaders.Add , "_jyouken", "条件・メモ", 400
        .ColumnHeaders.Add , "_touroku", "登録名", 120
        .ColumnHeaders.Add , "_todoke", "回", 20
     End With

    If Not m_ShownFlag Then
    Set WB = Workbooks.Open(DBpath)
    Set Sh = WB.Worksheets("Sheet1")
        With ListView1
            For i = 2 To Range("A" & Rows.Count).End(xlUp).Row
            With .ListItems.Add(Text:=Cells(i, 1).Value)
                .SubItems(1) = Cells(i, 3).Value
                .SubItems(2) = Cells(i, 8).Value
                .SubItems(3) = Cells(i, 5).Value
                .SubItems(4) = Cells(i, 9).Value
                .SubItems(5) = Cells(i, 10).Value
                .SubItems(6) = Cells(i, 18).Value
    End With

ListView1.ColumnHeaders.Item(4).Alignment = lvwColumnCenter
ListView1.ColumnHeaders.Item(5).Alignment = lvwColumnCenter
ListView1.ColumnHeaders.Item(6).Alignment = lvwColumnLeft

          Next
    WB.Close False

    Me.Caption = MyDateFormat(Date)
    selIdx = Val(Range("T2"))
    If selIdx = 0 Then selIdx = 4
        If .ListItems.Count >= selIdx Then
            .ListItems(selIdx).Selected = True
            ListView1.SetFocus
       End If
      End With
      Application.ScreenUpdating = True
    End If
End Sub

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 この過去ログが
[[20201118192655]] 『ListView1読み込みスピードアップするには』(nobu)
 参考になるでしょうか
(とおりすがり) 2021/04/27(火) 06:27

.Alignment = lvwColumnCenter のあたりのインデントの崩れ具合といい、
同じ方か、過去スレッドを参考にしているんでしょうね。
 
今回、二つを比較しているとのことですが、列数も違いますし、
データが違うものは比較しても意味が薄いかも知れませんね。
他ブックであればその分は少しは遅くなるでしょう。
 
配列に一括して読み込んでから、という方法もありますが、
それとて抜本的な改善が期待できるものではありません。
過去スレでも書きましたが、ListViewに値をセットする方法はひとつしかありませんので、
その部分の改善は無理ですね。
だましだまし使うしかないと思いますよ。

(γ) 2021/04/27(火) 06:50


(とおりすがり)さん
(γ)さん
返信ありがとうございます。

過去ログ参考に試してみました
>それとて抜本的な改善が期待できるものではありません。
>だましだまし使うしかないと思いますよ
やはり多少の時間は仕方ないですか・・・
了解しました
ありがとうございました
(kawai) 2021/04/27(火) 17:02


 単に Application.ScreenUpdating の使いどころが適当なだけでは。
 まじめにコード見てないないですが。
 Application.ScreenUpdating 信者が多すぎる気がする。

(akv) 2021/04/27(火) 17:38


akvさん 教えてもらえますか?
どこが足を引っ張っているとお考えですか?
(γ) 2021/04/27(火) 17:54

 Application.ScreenUpdating = True
 の位置が、If文の中に入ってたので、単にこれではじかれていると
 おもっただけです。
 理由は、この手の描写されないの問題でこれが多かったからです。
 どうやら先走りの様みたいです。
 まじめに読めば良かったですね。
(akv) 2021/04/27(火) 18:39

ご返事ありがとうございました。

それは、基本的にはプロシージャを抜けた段階で
自動的にTrueになりますから致命的な話ではないと思います。
(もちろん正常な位置に書くことは推奨されますが)

例外的な事象を想定してTrueに設定して終える習慣になっていますが、
普通は書かなくても致命傷になることは稀です。
(影がついたような描画がなされることはあります。)
これが、その例外ケースにあたるとは思えません。

Falseにすることで、速度が低下するなら重要ですが、
それほど重要な論点とは思えませんでした。

(γ) 2021/04/27(火) 18:56


ん?
もしかして、ファイル読み込みの方はm_ShownFlagをTrueにする文がなくて
Activateのたびにlistview読み込みをしていて遅くなっているだけだったりして…?
(めざめるパワー) 2021/04/27(火) 20:30

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.