none
Word VBAでのListviewの高速化とUnicode文字の表示について RRS feed

  • 質問

  • お世話になります.

    変更履歴の一覧をListVIEWで一覧にするマクロを作成しています(Word 2007,Windows 7を使用).

    2つの点で悩んでおり,解決方法についてご教示いただきたく存じます.

    1点目 Listview表示の高速化について

    120件ほどの文書中の変更履歴をListviewにListitem.addで登録して表示するのに,2~3秒かかるのですが,さらに高速化したいと思っています.

    なお,描画の停止は試しております.

    2点目 Unicode文字のListviewでの表示

    漢字の異体字などUnicode文字が「?」になってしまうので,ChrW関数などを試したのですが,うまくいきません.

    FileSystemObjestを利用して,一旦Unicode文字を含めて,変更履歴の一覧をテキストに保存し,その後Listviewに読み込むのがいいではないかと考えているのですが,現在の速度でも遅いと考えているので,仮に実装できたとしても速度の面でさらに遅くなるのではないかと思っております.

    1点目,2点目の両方の問題を解決する方法をご存知であればお教えいただきたいと存じます.

    何卒よろしくお願いいたします.


    2016年6月2日 7:59

回答

  • すみません回答ではないのですが、1点目、2点目ともに実現は簡単ではないかもしれません。

    1点目についてはリストビューの表示速度が遅いというよりは、ActiveDocument.Revisions から更新履歴を取り出す部分が遅いようです。
    試しに、180件の文字列リテラルをリストビューに追加していただくとお分かりになると思います。

    ActiveDocument.Revisionsを取り出す方法では

    Dim item As Revision
    For i = 1 To ActiveDocument.Revisions.Count
        Set item = ActiveDocument.Revisions(i)
        'item.Index などを Listview に追加するコードをここに書く
    Next


    というようにやるより

    Dim item As Revision
    For Each item In ActiveDocument.Revisions
        If IsObjectValid(item) Then
            'item.Index などを Listview に追加するコードをここに書く
        End If
    Next


    としたほうが早いという記述を見つけましたが、これでも私の環境で180件のデータだと遅く感じました。
    http://www.vbforums.com/showthread.php?550998-Word-Document-Revisions


    2点目については VB 6.0 のリストビューコントロールは Unicode 文字の表示に対応していないようです。
    https://social.msdn.microsoft.com/Forums/office/en-US/f5f2ff9b-dd8b-4c74-b293-046f3c0d9ac3
    なので、他のOCXを探したり、Win32API の CreateWindowEx でリストビューを作成し SendMessage などでUnicode文字列を追加していくというような方法になるのかなと思います。
    参考サイト: http://web-accountbook.com/content/2013080687.aspx
    • 回答としてマーク 0509 2016年6月2日 23:57
    • 編集済み kenjinoteMVP 2016年6月5日 0:15
    2016年6月2日 16:15

すべての返信

  • すみません回答ではないのですが、1点目、2点目ともに実現は簡単ではないかもしれません。

    1点目についてはリストビューの表示速度が遅いというよりは、ActiveDocument.Revisions から更新履歴を取り出す部分が遅いようです。
    試しに、180件の文字列リテラルをリストビューに追加していただくとお分かりになると思います。

    ActiveDocument.Revisionsを取り出す方法では

    Dim item As Revision
    For i = 1 To ActiveDocument.Revisions.Count
        Set item = ActiveDocument.Revisions(i)
        'item.Index などを Listview に追加するコードをここに書く
    Next


    というようにやるより

    Dim item As Revision
    For Each item In ActiveDocument.Revisions
        If IsObjectValid(item) Then
            'item.Index などを Listview に追加するコードをここに書く
        End If
    Next


    としたほうが早いという記述を見つけましたが、これでも私の環境で180件のデータだと遅く感じました。
    http://www.vbforums.com/showthread.php?550998-Word-Document-Revisions


    2点目については VB 6.0 のリストビューコントロールは Unicode 文字の表示に対応していないようです。
    https://social.msdn.microsoft.com/Forums/office/en-US/f5f2ff9b-dd8b-4c74-b293-046f3c0d9ac3
    なので、他のOCXを探したり、Win32API の CreateWindowEx でリストビューを作成し SendMessage などでUnicode文字列を追加していくというような方法になるのかなと思います。
    参考サイト: http://web-accountbook.com/content/2013080687.aspx
    • 回答としてマーク 0509 2016年6月2日 23:57
    • 編集済み kenjinoteMVP 2016年6月5日 0:15
    2016年6月2日 16:15
  • kenjinote 様

    早々のご教示ありがとうございました.
    RevisionsのListviewへの書き込みは,現在,お教えいただきましたFor Eachで行っております.
    いっぺん配列に入れることもやってみたのですが,配列に入れるまでに時間がListVIEWに追加するまでの時間とほぼ一緒だったこともあって悩んでいたのですが,「更新履歴から取り出す部分が遅い」というのであれば頷けます.
    ご教示ありがとうございました.

    Unicodeの件は,APIでの実装はちょっと私にはハードルが高く,またListviewの選択行とWord上の変更履歴が連動するところまではできておりますので,ListViewが「?」でも,当面はこのままいくことにしたいと思います.
    Listviewは非常によいコントロールだと思っておりましたので,Unicode非対応というのは残念ですが,仕方ないですね.

    この度は,ご教示ありがとうございました.
    2016年6月3日 0:08