ExcelのUserFormとSheetに
ListViewを設置して、
Drag And Drop でファイル名を受け取ってみた。
OLEDragDropを使ってみた ListView1.OLEDropMode = ccOLEDropManual
www.youtube.com
https://www.youtube.com/watch?v=Z9b5dXKVKzE
目次
00:00 0.やりたいこと
00:35 2.UserFormで使ってみる
02:57 2.2 OLEDragDrop イベントにコードを書く
04:55 2.2.1 簡単なコード説明 ドロップされたフォーマットを確認
07:55 2.2.2 Fileがドロップされたら
10:37 3.UserForm だけじゃなく Sheetに貼ってみた
11:58 OLEDropMode = ccOLEDropManual
14:09 シートのコントロール デザインモードでハマる
15:38 動作イメージ
0.やりたいこと
File名をドラッグして受け取りたい
ListViewに_OLEDragDropがあるので、使ってみたいと思います。

1.設置
ListViewなんて、どこにもない
おじさん
嘘つかないでくれますか?
ListBox リストボックスと勘違いしてませんか?
キレイで純粋な心、じゃなかった、
初期状態だとListViewが選択できないので、
まず、コントロールを追加します。
1.1 開発 から VBE エディターに飛び userFormの追加
開発から VisualBasic へ飛び、
VBEのエディターを表示する
次に、挿入から ユーザーフォームを選択して、
新規にユーザーフォームを追加します。
コントロールがキレイに並んでいるので、
余白で右クリック
その他のコントロール...を選択します。
1.3 ListView Control に☑を入れます
□MicroSoft ListView Control に ☑チェックを入れます
OKを押すと。登録されます。
アイコンが小さいけど、無事登録されました。
※枠を広げておくと良いかも
2.userFormで使ってみる
UserFormに ListView Control を設置して、使ってみます。
設置は、いつも通り、
コントロールを選択して、位置・サイズを決めます。(設置します)
2.1 ListViewのプロパティを変更します
ListView の
ドラッグ アンド ドロップ の
プロパティが ( OLEDropMode が 0 - ccOLEDropNone )
初期値だと 有効になっていないので、
ここを、
1 - ccOLEDropManual に変更する
って、書きましたが、
※よく、この初期設定を忘れるので(デバッグ・テスト時に受け入れないので、気が付く)
Formが開いた時のイベント、
UserForm_Initialize
に書くのが一般的です。
Private Sub UserForm_Initialize() ListView1.OLEDropMode = ccOLEDropManual 'ドロップを受け入れる End Sub
2.2 OLEDragDrop イベントにコードを書く
ListViewのイベント OLEDragDrop にコードを書きます。
ListView1を選択、イベント OLEDragDrop を選択します
コードを書きます。
サンプル解説は
GPTに聞いたり、ネットに詳しく載っているので
簡単に
2.2.1 簡単なコード説明 ドロップされたフォーマットを確認
Data.GetFormat(n) で どのフォーマットが使用可能か判断
Data.GetData(n) で 取得
n=1 テキスト、で、テキストデータが取得可能か聞いて、取得したり。
2.2.2 Fileがドロップされたら
Data.Files に ドロップされたファイル名が入っているので、
Data.Files.Count や Data.Files(n) で 取り出したり。
Private Sub ListView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single) Dim sFileName Debug.Print "Data.GetFormat(1) =", Data.GetFormat(1) 'テキストフォーマットで取得可能か聞く GetFormat(1) = Trueで判断 If Data.GetFormat(1) = True Then '単純に書き出してみた Debug.Print "Data.GetData(1) =", Data.GetData(1) Else 'テキストで取得不可なら、ファイルでしょと考えるのは、安易だが、 '(※他の、形式で、ドロップされたデータもあるので) 'いつもの、.Countで数がわかるので、何かのチェックで使うか。 Debug.Print "Data.Files.Count=", Data.Files.Count For Each sFileName In Data.Files 'ファイル名を取得 Debug.Print "Data.Files = ", sFileName Next End If End Sub
3.UserForm だけじゃなく Sheetに貼ってみた
userForm だけじゃなく Sheetに貼れるので、
使ってみてください。
開発メニーに切り替えて
コントロールの挿入
ActiveX コントロールの右下
このコンピュータで使用できるコントロールのセットから
を選択します。
3.1 MicroSoft ListView Controlを選択します
MicroSoft ListView Controlを選択します
選択後、シートに貼り付けます。
3.2 同じく、プロパティを忘れずに修正する
右クリックでプロパティを表示
OLEDropMode を 1:ccOLEDropManual にする
※プロパティの枠・幅が狭かったり、
老眼にはキツイ文字のサイズだったりって、
これは視聴者様には関係ないな・・・
3.3 Sheetのモジュールにコードを書く
ア.シートを右クリックしてコードの表示を選んだり、
イ.挿入したListViewをダブルクリックしたり。
コードを書きます。
'ListViewにドロップされたファイル名をA列にセットする Private Sub ListView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single) Dim sFileName Columns("A:A").ClearContents 'A列のデータをクリアする Debug.Print "Data.GetFormat(1) =", Data.GetFormat(1) 'テキストフォーマットで取得可能か聞く GetFormat(1) = Trueで判断 If Data.GetFormat(1) = True Then '単純に書き出してみた Debug.Print "Data.GetData(1) =", Data.GetData(1) Range("a1") = "テキストデータを受け取りました。" Range("a2") = Data.GetData(1) Else 'テキストで取得不可なら、ファイルでしょと考えるのは、安易だが、 '(※他の、形式で、ドロップされたデータもあるので) 'いつもの、.Countで数がわかるので、何かのチェックで使うか。 Debug.Print "Data.Files.Count=", Data.Files.Count Dim nROW As Long '行カウンタ nROW = 1 'A1から書き込むので初期値1を代入 For Each sFileName In Data.Files 'ファイル名を取得 Debug.Print "Data.Files = ", sFileName Cells(nROW, 1) = sFileName 'A列にファイル名をセットする nROW = nROW + 1 '次の行へ Next End If End Sub
4. 終わりの挨拶
ファイルを ドラッグAndドロップ 操作をしたいために、
ListView Control
の
OLEDragDrop
を使ってみました。
ファイル名取得処理、
ファイル選択処理の参考となれば幸いです。
複数のファイリングした書類を箱にぶん投げる青年。
漫画イラスト風で作成してください。
A young man who throws several filed documents into a box.
Please create it in a cartoon illustration style.
