Excel VBAでListBoxへドラッグ&ドロップできない理由 前回までのおさらい

前回の記事では、WindowProc方式によるドラッグ&ドロップ実装が利用できなかった理由について調査しました。

Copilotから提案された方法では、

  • SetWindowLongPtr
  • CallWindowProc
  • WM_DROPFILES

を利用して、Windowsから送られるドラッグ&ドロップ通知を受信する予定でした。

しかし実際には、

  • hWndが取得できない
  • ThunderDFrameが見つからない
  • WindowProcを書き換えられない
  • WM_DROPFILESが届かない

という状態になっていました。

その結果、WindowProc方式そのものが成立しないことが分かりました。

そこで私は、それなら別の方法はないのだろうか?と思いました。

そこでCopilotから提案されたのが、OLEDragDrop という方法です。

今回は、その検証結果について書いていきます。

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

OLEDragDropとは何なのか

利用者 → Copilot

WindowProcが使えないなら別の方法はありませんか?

Copilot → 利用者

あります。

OLEDragDropを利用する方法です。

OLEDragDropはWindowsメッセージを横取りする必要がありません。
コントロール自身がドラッグ&ドロップを受け取れます。

この時は、今度こそいけるかもしれない!先にその方法教えてよーと思いました。

WindowProcは難しすぎましたし、hWnd問題にも悩まされていました。

しかしOLEDragDropなら、もっとVBAらしい方法に見えました。

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

OLEDragDropイベントとは

利用者 → Copilot

OLEDragDropとは何ですか?

Copilot → 利用者

OLEDragDropは、ファイルや文字列などがドラッグ&ドロップされた時に発生するイベントです。

例えば、

TextBox
PictureBox
TreeView

など一部のコントロールでは、

Private Sub Control_OLEDragDrop( _
Data As MSForms.DataObject, _
Effect As Long, _
Button As Integer, _
Shift As Integer, _
X As Single, _
Y As Single)

End Sub

というイベントが利用できます。
ここでDataObjectからファイルパスを取得できます。

説明だけ聞くと、これこそやりたかった方法です。もっと早くに聞きたかった!

Windows APIも不要です。
WindowProcも不要です。
WM_DROPFILESも不要です。

ListBoxにOLEDragDropを書こうとした

利用者 → Copilot

ListBoxへファイルをドロップしたいです。

Copilot → 利用者

それではListBoxのOLEDragDropイベントを作成してください。

そこで私はListBoxのプロパティを開きます。

しかし・・・見当たりません。

Excel VBAでListBoxへドラッグ&ドロップできない理由 前回までのおさらい

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

利用者 → Copilot

OLEDragDropがありません。

Copilot → 利用者

もう一度イベント一覧を確認してください。

私は何度も確認しました。しかし存在しません。

Labelでも試した

もしかするとListBoxだけが駄目なのかもしれない。

そこでLabelでも試してみましたが、結果は同じです。

イベント一覧に、

  • OLEDragDrop
  • OLEDragOver

がありません。

利用者 → Copilot

Labelにもありません。

Copilot → 利用者

それは重要な情報です。

ここから調査が始まりました。

そもそもイベントが存在しなかった

Copilotとの検証を進めた結果、意外な事実が分かりました。

利用者 → Copilot

なぜ表示されないのですか?

Copilot → 利用者

Excel VBAの標準ListBoxとLabelは、
OLEDragDropイベントを持っていません。

「持ってへんのかーい!」

思わず叫んでしまいました(笑)

今まで、

  • 書き方が悪い
  • 設定が足りない
  • 参照設定が不足している

と思っていました。

しかし・・・最初から存在しなかったのです。

DataObjectも受け取れない

利用者 → Copilot

ではファイルパスはどうやって取得するのですか?

Copilot → 利用者

取得できません。
OLEDragDropイベントが存在しないため、
DataObjectも受け取れません。

「できひんのかーい!」

つまり、

ファイルをドロップする

イベント発生なし

DataObjectなし

ファイルパス取得不可

という状態になります。

実際に試したコード

利用者 → Copilot

強引に書いたら動きませんか?

Copilot → 利用者

コンパイルエラーになります。
例えば次のようなコードです。

Private Sub ListBox1_OLEDragDrop( _
Data As MSForms.DataObject, _
Effect As Long, _
Button As Integer, _
Shift As Integer, _
X As Single, _
Y As Single)

MsgBox "ドロップされました"

End Sub

しかし、このイベント自体が存在しないため、VBAは認識できません。

「動かへんのんかーい!」

イベントを書いても発火しない、という状態になります。

初心者向けに例えると

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

例えば、インターホン付きの家を想像してください。

来客が来る

インターホンが鳴る

応答する

これがOLEDragDropです。

ところが今回のListBoxとLabelは、そもそもインターホンが付いていません。

だから、誰かが来ても鳴らない・・・という状態になります。

最終的に分かったこと

ここまでの検証で、ドラッグ&ドロップを実現するために考えられる方法をほぼ試しました。

まず、WindowProc方式を試しました。

しかし、

  • hWndが取得できない
  • ThunderDFrameが見つからない
  • WM_DROPFILESが届かない

という問題が発生しました。

次に、OLEDragDrop方式を試しました。

しかし、

  • ListBoxにイベントがない
  • Labelにイベントがない
  • DataObjectが取得できない

という問題が発生しました。

つまり、Windows API方式も駄目、OLEDragDrop方式も駄目 という結果になったのです。

代替UI挑戦編の結論

ここまでかなり長い期間、Copilotと何度もキャッチボールを続けました。

コードを書き換える。
APIを追加する。
別案を試す。
また検証する。

その繰り返しです。

しかし最終的に分かったのは、私がやろうとしていたListBoxへ直接ファイルをドラッグ&ドロップするという仕組みは、私のExcel環境では実現できない可能性が非常に高い・・・ということでした。

もちろん環境が違えば結果も変わるかもしれません。

しかし少なくとも私の環境では、何度コードを書き換えても解決できませんでした。

まとめ

今回の検証では、WindowProc方式の代替として、OLEDragDrop方式を調査しました。

OLEDragDropは、ドラッグ&ドロップされたデータをイベントとして受け取れる便利な仕組みです。

そのため、Windows APIを使わずに実装できる可能性があり、かなり期待していました。

しかし実際に確認すると、Excel VBA標準のListBoxやLabelにはOLEDragDropイベント自体が存在しませんでした。

その結果、

イベントが発生しない
DataObjectが取得できない
ファイルパスを取得できない

という状態になりました。

つまり、

WindowProc方式も利用できない
OLEDragDrop方式も利用できない

ということが分かったのです。

これで、ListView代替UI計画で考えられる主要なドラッグ&ドロップ方式はほぼ検証し終えました。

結果として実装には至りませんでしたが、その過程でWindows API、hWnd、WindowProc、OLEDragDropなど、普段は触れることのない仕組みを学ぶことができました。

そして何より、AIが提案したコードが動かない時は、コードだけではなく環境そのものを疑う必要がある、という大きな学びを得ることができました。

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

リンク

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コードを引き出す質問術

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

Excel64bit代替UIに挑戦した結果…hWndが取得できなかった理由 代替UI計画の本当の問題が見えてきた

Excel VBAでListViewの代替UIを作ろうとしたところ、hWndが取得できずドラッグ&ドロップ機能が実装できませんでした。Copilotとの検証を通じて、ThunderDFrameが見つからない理由やUserFormがOSウィンドウとして存在していない可能性について初心者向けに詳しく解説します。

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

Excel VBA 64bit環境でListViewの代替としてUserFormとListBoxを利用したファイル管理画面を作成。しかしhWnd取得失敗、ThunderDFrame未検出、WM_DROPFILES未受信などの問題に直面。Copilotとの実際のやり取りをもとに失敗の原因を初心者向けに解説します。