Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Excel 2010)
ListBoxのデータの移動について
投稿日時: 20/12/30 10:42:42
投稿者: ロードランナー
投稿者のウェブサイトに移動

いつもお世話になります。
 
今回の質問は、ListBoxに表示されているデータを移動する方法についてです。
 
即効テクニックに載っていた記事「リストボックスのデータを移動する」は理解できます。
https://www.moug.net/tech/exvba/0090063.html
 
この方法ではなくListBoxに表示されている、データをマウスでドラッグ&ドロップして移動できないか、というのが質問です。
 
ListBoxのイベントプロシージャには
・ListBox1_BeforeDragOver
・ListBox1_BeforeDropOrPaste
といったものがあり、名前からしてこれらを使えばできるような感じもするのですが、具体的な使い方がググっても見つかりません。
 
この2つのイベントを使えばできるものなのでしょうか?
これらの使用例が見つからないため用途が分かりません。
 
使用例があるサイトがあれば、それを紹介いただくだけでも構いません。
 
よろしくお願いいたします。<(_ _)>

回答
投稿日時: 20/12/30 12:32:06
投稿者: simple

同じ即効テクニックにある
「ドラッグ&ドロップ−ListBox⇒ListBox」
https://www.moug.net/tech/exvba/0150045.html
が参考になりませんか?
 
>これらの使用例が見つからないため用途が分かりません。
ExcelVBAの書籍でも作成されているのでしょうか?
必要性は低いように思いますので、対象からはずしたらどうでしょうか?無理は不要でしょう。
もともとのデータそのものを、例えばシート上でいくらでも加工できるわけですし、
それほどの頻度で変更するものでもないように思います。

投稿日時: 20/12/30 14:17:34
投稿者: ロードランナー
投稿者のウェブサイトに移動

simpleさん、さっそくの返信をありがとうございました。
 
サイトを参考にStartDragしたあとデータをRemuveItemすると、移動できますね。
 
ただListBox1_BeforeDropOrPasteで、単にAddItemしているだけなので、必ず一番下に移動してしまいます。
 
MouseUpイベントで移動先のアイテムが判定できれば、そこに移動することもできるのですが、なぜかMouseUpイベントが発生しません。(クリックして離したときは発生します)
 
もうしこし頑張ってトライしてみます。
 
MouseMoveイベントでSetTextしてからStartDragし、受け取る側(ListBox1_BeforeDropOrPaste)で
GetTextしたデータをAddItemする、という流れが分かっただけでも収穫がありました。
 

引用:
もともとのデータそのものを、例えばシート上でいくらでも加工できるわけですし、
それほどの頻度で変更するものでもないように思います。

 
理由があって個人用マクロブックに、ListBoxに表示するデータを作りこんでいます。
このパソコンは複数のスタッフが使うため、このデータが簡単にだれでもメンテナンスできるようにしておきたいのです。
 
再表示してシートのデータを書き替えればいいのですが、シートを非表示に戻し忘れたり、個人用マクロブックを保存し忘れたりすることも考えられます。(・・・し忘れ、というリスクは払拭できません)
 
データの入れ替えは年一回程度のもので、そのためにここまでやる? と思われるかもしれませんが、このようなミスを避けるために、ツール化しておきたいと考えました。
(なにより自分のスキルアップにもなります)

回答
投稿日時: 20/12/30 14:28:52
投稿者: WinArrow
投稿者のウェブサイトに移動

ドラッグ&ドロップの操作で
ドロップ時に、行を指定するのは、無理ではないでしょうか?
 
リストブックス内の「行移動」用ボタン(例えば、「上へとか「下へ」)を作成し
対応したほうが操作しやすいではないかと思います。

回答
投稿日時: 20/12/30 15:40:39
投稿者: MMYS

ロードランナー さんの引用:

MouseUpイベントで移動先のアイテムが判定できれば、そこに移動することもできるのですが、なぜかMouseUpイベントが発生しません。(クリックして離したときは発生します)
 
このパソコンは複数のスタッフが使うため、このデータが簡単にだれでもメンテナンスできるようにしておきたいのです。

イベント引数の X,Y にマウス座標が入っているので一応、可能ではあります。
しかし、面倒な処理になると思います。
 
'ドラッグ時のみドラッグされたデータをリスト項目に追加
If Action = fmActionDragDrop Then    
    Debug.Print X, Y
    ListBox2.AddItem Data.GetText
End If

 
昔は追加・削除をドラッグ&ドロップ操作がありましだか、最近では、その操作方法は殆ど見かけません。
 
最近は、リストボックスを2つ配置して
 [追加]ボタン
 [削除]ボタン
 [上]ボタン
 [下]ボタン
を配置したほうが直感的だと思います。
 
たとえば、Excelオプションの「クイックアクセスツールバー」のカスタマイズ画面などです。
http://www4.synapse.ne.jp/yone/excel2010/faq/input_screen.html
 
 

投稿日時: 20/12/30 15:42:04
投稿者: ロードランナー
投稿者のウェブサイトに移動

引用:
リストブックス内の「行移動」用ボタン

 
実は、これはやりました。が、リスト表示がたくさんあるとクリック操作が煩雑になるため今回のようなことを思いついたのです。
 
しかし、ListBoxがスクロールの状態でドラッグ操作するのも煩わしそうなので、ListStyle = fmListStyleOptionにし、2つ目を選択したらそれぞれを入れ替える、という仕様に変更したいと思います。
 
いろいろアドバイスをいただきありがとうございました。
今回の件で、ドラッグできることも分かり、大変勉強になりました。
 
これで一旦解決とさせていただきます。