Excel64bit代替UIに挑戦した結果…結局動かなかった話 ListViewの代替UI作戦が始まった

前回の記事では、Excel VBA 64bit環境でListViewを使うことを断念し、 代わりに UserForm・ListBox・Windows API を組み合わせて代替UIを作る方針へ進みました。

やりたかったことは次の4つです。

  • 大量のファイルをドラッグ&ドロップ
  • 一覧表示
  • クリック選択
  • 選択ファイル情報の取得

Copilot からは「ListViewは必須ではありません」という提案があり、 この構成で実現できるなら助かる、と当時の私は思っていました。

しかし、ここから長い検証が始まります。

■■■スポンサーリンク■■■

Copilotが提案した最終構成

Copilot が提示した構成は次の3つを組み合わせる方法でした。

  • 標準モジュール
  • UserForm
  • Windows API

流れとしては、

  1. UserFormへドラッグ&ドロップを許可
  2. Windowsメッセージを横取り
  3. ドロップされたファイルパスを取得
  4. ListBoxへ表示

というものです。

初心者だった私は、なるほど、これでできるのかと 思っていました。

最初に提案された標準モジュール

Copilotから提案されたコードの一部です。

Option Explicit

Public OldProc As LongPtr

Public Const WM_DROPFILES As Long = &H233
Public Const GWL_WNDPROC As Long = -4

Private Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" ( _
  ByVal hWnd As LongPtr, _
  ByVal nIndex As Long, _
  ByVal dwNewLong As LongPtr) As LongPtr

Private Declare PtrSafe Function CallWindowProc Lib "user32" Alias "CallWindowProcA" ( _
  ByVal lpPrevWndFunc As LongPtr, _
  ByVal hWnd As LongPtr, _
  ByVal Msg As Long, _
  ByVal wParam As LongPtr, _
  ByVal lParam As LongPtr) As LongPtr

そして、WM_DROPFILES というWindowsメッセージを受け取るため、独自の WindowProc を作成するという説明でした。

UserForm側のコード

UserForm側では、hWnd を取得して、ドラッグ&ドロップを有効化する という説明でした。

Private Sub UserForm_Initialize()

    Dim myHwnd As LongPtr

    myHwnd = FindWindow(vbNullString, Me.Caption)

    DragAcceptFiles myHwnd, True

End Sub

この時点では、なるほど・・・と思いました。

しかし、実際に実行すると問題が発生します。

最初の異常

コードはエラーなく実行されました。

ところが、ファイルをドラッグしても何も起きません。

ドロップ禁止マークが表示されます。

ファイルが受け取れません。

メッセージも出ません。

利用者 → Copilot

ファイルをドロップしても何も起きません。

Copilot → 利用者

まず hWnd が取得できているか確認してください。

hWnd確認へ進む

そこで確認コードを追加しました。

MsgBox myHwnd

ところが、期待した値が取得できません。

利用者 → Copilot

hWnd が取得できません。
0になります。

Excel64bit代替UIに挑戦した結果…結局動かなかった話 ListViewの代替UI作戦が始まった

Copilot → 利用者

それは重要な情報です。
UserFormがWindows上の通常ウィンドウとして存在していない可能性があります。

FindWindowを修正してみる

Copilotからは、UserFormのタイトルが取得できていない可能性があります と言われました。

そこで、Captionを変更したり、FindWindowの条件を変えたりしました。

しかし結果は同じでした。

利用者 → Copilot

Captionを変更しても変化ありません。

Copilot → 利用者

それではThunderDFrameを検索してみましょう。

ThunderDFrameも見つからない

ここから調査はさらに深くなります。

本来VBAのUserFormはThunderDFrame というウィンドウクラスで作られています。

しかし、何度調べても見つかりません。

利用者 → Copilot

ThunderDFrameが見つかりません。

Copilot → 利用者

それはかなり特殊です。
UserFormがOSレベルのウィンドウとして生成されていない可能性があります。

さらにコードを修正した

その後も、

  • SetWindowLongPtr
  • FindWindowEx
  • EnumWindows
  • GetWindow

など、様々な方法を試しました。

しかし結果は同じでした。

利用者 → Copilot

修正版でも動きません。

Copilot → 利用者

それではWindowProc方式そのものが利用できない可能性があります。

何度もキャッチボールした

実はこの後、かなり長い期間やり取りを続けました。

コードを修正する

試す

動かない

別案を試す

また動かない

・・・の繰り返しです。

途中では、今度こそできるかもしれない・・・と思うこともありました。

しかし結果は変わりませんでした。

最終的にCopilotが出した結論

何度も検証した結果、Copilotから次の説明がありました。

Copilot → 利用者

あなたのExcel(Excel 2013 / 64bit)では、
UserFormとListBoxが普通のウィンドウとして作られていません。

そのため、

WindowProcが使えません。
OLEDragDropが使えません。
ListBoxへファイルを直接ドロップする方法も存在しません。

つまり、物理的に不可能な状態です。

初心者向けに分かりやすく説明すると

ここは非常に分かりにくい部分です。

私も最初は理解できませんでした。

例えば、郵便物を受け取るには玄関が必要です。

Windowsのドラッグ&ドロップも同じです。

Windowsは、ウィンドウ という玄関に対して通知を送ります。

しかし私の環境では、その玄関が存在しませんでした。

だから、通知が届かない という状態だったのです。

コードの問題ではなかった

当初は、コードの書き方が悪いのだと思っていました。

変数名が違うのかもしれない。
API宣言が違うのかもしれない。
64bit対応が足りないのかもしれない。

そう思っていました。

しかし実際は違いました。

問題はコードではなく、Excel環境そのものだったのです。

だから、コードを何度修正しても解決しませんでした。

今回分かったこと

今回の検証で分かったのは、AIが提案したコードが必ず動くわけではない ということです。

Copilotの説明自体は理論的には正しかったと思います。

しかし、私のExcel環境では成立しませんでした。

つまり、コード以前に環境条件を確認することが重要 ということです。

これは今回かなり勉強になりました。

まとめ

ListViewの代替として、

  • UserForm
  • ListBox
  • Windows API

を利用したドラッグ&ドロップ対応画面を作ろうとしました。

Copilotからは複数のコードを提案してもらい、そのたびに検証を行いました。

しかし、

  • hWndが取得できない
  • ThunderDFrameが見つからない
  • WM_DROPFILESが届かない
  • ドロップ禁止マークが出る

という問題が解決しませんでした。

最終的にCopilotから説明されたのは、私のExcel 2013 64bit環境では、UserFormとListBoxが通常のWindowsウィンドウとして存在していない可能性が高い ということでした。

つまり、コードを書けば解決する問題ではなく、環境そのものの制約だったのです。

この時点で私は、代替UI計画そのものを見直さなければならないことを悟りました。

しかし同時に、なぜ動かないのかを追い続けたことで、WindowsとExcel VBAの仕組みについて多くのことを学ぶことができました。

そしてここから、さらに原因究明が始まります。

■■■スポンサーリンク■■■

リンク

ChatGPTでExcel VBAマクロを自動生成してみた|初心者でも使える実践手順
Excel VBAのエラー修正をChatGPTに頼んだら原因が一発で分かった話
仕様が曖昧でもOK?ChatGPTにExcel VBAを作らせてみた結果
ChatGPTに作らせたExcel VBAコードは安全?使う前に確認すべきポイント
Excel VBA初心者がChatGPTを使うと挫折しにくくなる理由
CopilotでExcel作業はどこまで効率化できる?実務で使ってみた結果
Copilotに仕事を任せてみた|メール・資料作成はここまで楽になる
Copilotが向いている人・向いていない人を実体験から整理してみた
ChatGPT・Copilot・Geminiに同じ仕事を頼んだら結果が全然違った
結局どれを使えばいい?目的別に生成AIを整理してみた【初心者向け】
初心者が最初にやるべき生成AI活用① ChatGPTで「長文を理解・整理する」読むのがしんどい人ほど効果が出る使い方
初心者が最初にやるべき生成AI活用②ChatGPTに「分からないことをそのまま相談する」使い方・聞き方を気にしない安心感
初心者が最初にやるべき生成AI活用③AIを「自分専用の調べ物係」にする使い方|検索に疲れた人ほど効果が出る
ChatGPTにブログ記事を“赤ペン先生”してもらったら修正力がすごかった話―書くのが苦手な人ほど使ってほしい文章改善―
CopilotでExcel作業手順書を一瞬で作る|引き継ぎ資料が秒で完成した話
Geminiでアイデアが枯れたときの発想復活法|何も思いつかないを脱出する使い方
ChatGPT・Copilot・Geminiをブレスト役で使い分ける実例|発想が加速した方法
CopilotでExcel集計→Word報告書を一気に作る実務フロー― 月次報告が“考えずに終わる”ようになった話 ―
大型Excel VBAはChat-GPTよりCopilotの方が作りやすい?実務で感じた変化
Copilotで会議議事録からToDo管理まで一気にやってみた実務フロー
Geminiで社内資料の画像を作ってみた|伝わらない資料が一瞬で変わった話
ChatGPTに流行りの「今まで私があなたをどう扱ってきたかを画像にして」を頼んでみた
ChatGPTのプロンプトを“自分用”に進化させる方法|頼み方で結果が激変する理由
初心者が最初にやりがちなプロンプトの失敗例と直し方
ChatGPTが急に賢くなる「前提条件」の渡し方-同じ質問なのに答えが変わるのはなぜ?-
プロンプトを毎回書かなくてよくなる“会話の残し方”
ChatGPTに「察してもらえない」と感じた時の原因と対処法|噛み合わない理由を実例で解説
AIに雑に投げても失敗しにくくなる頼み方のコツ|考えずに使っても噛み合う方法
プロンプトが思いつかない人のための“最初の一文”テンプレ集
ChatGPTを“相棒化”する人と、うまく使えない人の決定的な差
生成AIはどこまで使っていい?初心者が最初に知るべき法律の話
AI画像生成は違法?著作権で“やってはいけないこと”実例集
商用利用OK?NG?生成AIの利用規約を初心者向けに噛み砕く
AIで作った文章は誰のもの?著作権の考え方をやさしく解説
「知らなかった」では済まない?生成AIトラブル事例と回避法
ブログ・SNSでAI生成物を使うときの最低限の注意点まとめ
AIに頼りすぎて思考力が落ちた話|便利さの裏で起きたリアル失敗
AIの回答を信じて怒られた話|正しいはずが通用しなかった理由
ChatGPTにExcelマクロを直してもらったらコメントが消えた話|親切の落とし穴
Copilotの差分コードが分からなかった話|全コード出してもらう選択
ChatGPTにきれいな文章はいらなかった話|ぐちゃぐちゃでも伝わる
Copilotでクロス表を縦持ちデータに変換|実務VBA作成の流れ
Copilotでクロス表を縦持ちデータに変換|実務仕上げ編
Copilotでクロス表を縦持ちデータに変換|配列で高速化する
Copilotでクロス表を縦持ちデータに変換|項目変更に強い構造へ
Copilotでリストボックスにユニーク値を設定|実務VBA
Copilotでリストボックス並び替え対応|実務VBA
Copilotでリストボックス表示制御を追加|実務VBA
Copilotで階層連動コンボボックス作成|実務VBA
Copilotで列番号を動的管理|階層連動VBAの実務改善
Copilotで並び順統一とUI改善|階層連動VBA仕上げ
Copilotで高速化(配列化)|階層連動VBA最終仕上げ
CopilotにListViewを相談したら絶望した話|64bit VBAの壁
ListView強行突破|MSCOMCTL.OCX配置に成功した話
CopilotでListView登録に挑戦|regsvr32実行編(64bit VBA)
CopilotでListView確認|追加コントロール検証編(64bit VBA)
Copilotに全否定された件|ListView断念か?64bitの壁
CopilotでListView地獄を検証|32bit化で見えたWindowsの罠
CopilotでListView復活か?参照設定に見えた希望
Excel64bit版ListView問題の結論が見えた日
Excel64bit版ListView問題|2017年更新情報をCopilotへ再確認した結果
Excel64bitでListViewをあきらめて代替UIへ挑戦
Excel64bit代替UIに挑戦した結果…結局動かなかった話 ListViewの代替UI作戦が始まった
Excel64bit代替UIに挑戦した結果…hWndが取得できなかった理由 代替UI計画の本当の問題が見えてきた
Excel VBA WindowProcの壁 UserFormにウィンドウがなければWM_DROPFILES受取不可
Excel VBAでListBoxへドラッグ&ドロップできない理由 前回までのおさらい
Copilotはなぜ存在しない機能を提案したのか 前回ブログで生まれた新たな疑問
AIから正しいVBAコードを引き出す質問術

■■■スポンサーリンク■■■