三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

Excel VBA ListViewの設置方法 使用例:Drag And Dropでファイル名を受け取り サンプルコード

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.2 ツールボックスにコントロールの追加


コントロールがキレイに並んでいるので、
余白で右クリック
その他のコントロール...を選択します。

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.

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)