ACCESS開発の話です。
「ACCESSなんて知らねーよ」って方は、この記事はスルーで。
エクスプローラでファイルを選択し、リストボックスにドラッグアンドドロップで追加するフォームの製造をしました。
でも、ネットで調べてもAPIを使う難しい方法ばかりで、なかなか簡単な方法がない・・・
なんとか簡単に実装できる方法を見つけたので、紹介します。
ちょっと一般的な話じゃないので、ブログに載せるか迷ったのですが、僕と同じようにハマっている人の役に立てばいいなぁと思い記事にしました。
1.まずはフォームにリストボックスを追加
フォームにリストボックスを追加します。
コントロール名:lstFileList
プロパティの[値集合タイプ]を、[値リスト]に変更します。
2.フォームにActiveXコントロールのProgressBarを追加
[デザイン]の[コントロール]エリアにある、▼(上に横棒)をクリックします。
下の図のように表示されるので、[ActiveXコントロール]をクリックします。
選択画面が表示されるので、[Microsoft ProgressBar Control]を選択して、OKボタンをクリックします。
すると、フォームにProgressBarが追加されます。
3.ProgressBarのプロパティを変更
フォームに追加されたProgressBarを選択し、プロパティ[OLEDropMode]を[1-ccOLEDropManual]に変更します。
コントロール名:prgAddFile
4.ソースで、ProgressBarにファイルをドラッグした時の処理を追加
VBAで、ProgressBarのOLEDragDropイベントに、リストボックスへのファイル名追加のロジックを記述します。
※OLEDragDropイベントは、プロパティシートの日本語イベント一覧にはないので、イベント自体も直接記述します。
Private Sub prgAddFile_OLEDragDrop(Data As Object, _ Effect As Long, _ Button As Integer, _ Shift As Integer, _ x As Single, y As Single) On Error Resume Next Dim i As Long 'ドラッグ&ドロップされた全てのオブジェクトを判定し、 'フォルダ以外をリストに追加 For i = 1 To Data.Files.Count If GetAttr(Data.Files(i)) <> vbDirectory Then Me.lstFileList.AddItem Data.Files(i) End If Next On Error GoTo 0 End Sub
5.完成!!!
エクスプローラ上で、ファイルを選択(複数も可)します。
そのまま、ProgressBarにドラッグ&ドロップすると・・・
リストボックスに選択したファイル名がフルパスで表示されました。
フォルダはロジック内で判定し無視しているので、リストボックスには追加されません。
あとは、取得したファイル名に対して、目的に応じた処理をすればOKです。
フォームのデザインが適当なのは、許してください・・・
お知らせ 2018年7月9日
最近、エクセルVBAを社会人向けの学校で教える仕事をしています。
それで、エクセルのサイトを作ってみました。
まだまだ作成途中ですが、開発ルールはボチボチまとまったかなと思っています。ACCESSでも生かせると思うので、参考にしてみてください。
エクセルの図書館で、「えくとしょ」というサイト名にしてみました。
がんばって完成させようと思うので、よろしくお願いします。
Accessのドラッグ&ドロップ方法を検索していましたらこちらのサイトへとたどり着きましたので読ませて戴きました。
今回、ドロップしますターゲットとリスト表示されます枠が別々に設置されておりますが、ドロップをしますターゲット?に直に表示させますことは可能でしょうか?
今回、Access画面の中に2つの枠(リストボックスとプログレスバー)がありますけれど、それを1つの枠にまとめることが可能かどうか興味をもってしまいましたっ
VB.NETですと、ドロップしました場所に文字列表示可能ですよねっ
もし宜しければ、お返事戴けますと嬉しいです
ごん様、ご訪問&ご質問ありがとうございます。
せっかくご質問いただいたのですが、vb.netのようにリストボックスに直接ドラッグ&ドロップをする簡単な方法は僕もわかりません。
僕も最初は直接リストボックスにファイルをドラッグ&ドロップをしようと思いました。
ただ、ACCESSのリストボックスはvb.netのリストボックスと違い、エクスプローラなどからのファイルドラッグを取得できないです。
そのため苦肉の策で、ドラッグ&ドロップが取得できるProgressBarをワンクッション挟んで実装しています。
リストボックスとProgressBarを同じ大きさにし重ね合わせると、ドラッグ&ドロップはうまくいくのですが、リストボックスの操作ができなくなるんですよね・・・
どうしても実装するとなると、ActiveXコントロールのListViewコントロールや、API関数を使うしかないと思います。
ただそこまですると、ACCESSの利点である開発の早さや容易さがなくなってしまうので、素直にvb.netで製造したほうがいいのかもしれません。
せっかく質問をいただいたのに、明確な回答ができなくて申し訳ないです・・・
僕の技術力の限界です(´;ω;`)
リストボックスにActiveControlを重ねて
最前面に表示でよくない?
ルアー様、コメントありがとうございます。
確かに、リストボックスと同サイズのActiveXコントロールを重ねて、ActiveXコントロールを最前面とすることでドラッグ&ドロップでリストボックスにファイルの追加はできます。(ActiveXコントロールを最前面としても、見た目はリストボックスが前面に見えるため)
でも見た目はリストボックスでも、実際の最前面はActiveXコントロールのため、リストボックスのスクロールや、リストの選択ができなくなるので、重ね合わせ&最前面による方法は当時諦めました。
ただ、この記事を書いて数年経つので、今はもっと良い方法があるかもしれません・・・
最近はACCESSの開発から離れているため(最近はvb.netやasp.netを使ってます)、新しい知識が入ってきてなくて申し訳ないです。