こんにちはmasalifeです。
ずっと作りたかった機能が、悩みに悩んで完成したので紹介したいと思います。
紹介するのはCSVファイルを特定の枠にドラッグ&ドロップしたらインポートする機能です。
めちゃくちゃ便利で作成満足度は一番です。
やりたい事とこの機能の便利な点
インポートするCSVファイル(商品.csv)をフォーム(F_import)の特定の枠にドラッグ&ドロップします。
そうすると、CSVファイル(商品.csv)がAccessにT_商品のテーブルの名前でインポートされます。
この機能がめっちゃ便利だなと思う点は、
- ファイルが格納されているフォルダ等の名前が変更となっても、フルパスを変更する必要がなく、メンテナンスフリーでインポートができる。
- 操作が直感的
今までは「このフォルダにこのファイル名で格納して、このボタンをクリックしてください。」
のように、フォルダ名とファイル名を固定したプログラムを記述していました。
そうすると、組織の機構変更等でサーバ名が変わったり、基幹システムから出力されるファイル名に日付や時間が入っていたりすると、プログラムのフルパスの変更やファイル名を手動で変更する必要が生じてしまいます。
一方、この機能では、フルパスはドラッグ&ドロップしたファイルに応じて自動で取得してくれるため、メンテナンスがフリーとなります。
今まで作成したインポート機能をすべてこの機能に置き換えたいぐらい便利です。
準備するもの
削除クエリ
インポートするたびにデータが追加されてしまう(重複してしまう)ため、インポート前にテーブルのデータを削除します。
上のイメージのように、テーブル(T_商品)のデータをすべて削除する削除クエリを作成してください。
名前はQ_商品テーブル削除とします。
インポートフォーム
Microsoft ProgressBar Control, version6.0を配置する
上のイメージのように、単票フォームにファイルをドロップする枠を作成します。
枠にはActiveX コントロールのMicrosoft ProgressBar Control, version6.0を使用します。
「フォームデザイン」タブで赤枠のアイコンをクリックし、画面を展開します。
【ActiveX コントロール】をクリックします。
「ActiveX コントロールの挿入」画面が表示されますので、【Microsoft ProgressBar Control, version 6.0】を選択し、【OK】をクリックします。
大きさを整えて配置します。
これで、 Microsoft ProgressBar Control, version6.0の配置が終了です。
ProgressBarのオプション設定
「プロパティシート」の【すべて】タブにある【OLEDropMode】の値を「1」=(自動)にします。
これで、ProgressBarのオプション設定が終了です。
最後に好みで、フォームのオプション(レコードセレクタ:いいえ 等)設定を行ってください。
VBAの設定
フォーム(F_import)を選択し、「フォームデザイン」タブの【コードの表示】をクリックします。
VBE画面で次のコードを貼り付けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Private Sub ProgressBar_OLEDragDrop(Data As Object, Effect As Long, button As Integer, shift As Integer, X As Single, Y As Single) Dim FullPath As String Dim answer As String DoCmd.SetWarnings False FullPath = Data.Files(1) answer = MsgBox("ファイルをインポートしますか?", vbOKCancel, "インポートフォーム") If answer = vbOK Then DoCmd.OpenQuery "Q_商品テーブル削除" DoCmd.TransferText acImportDelim, , "T_商品", FullPath, True Else MsgBox "キャンセルされました!!" End If DoCmd.SetWarnings True End Sub |
誤ったファイルをドラッグしている等の誤操作対策に、インポートする前にメッセージを出して、キャンセルを選択した場合はインポートを中止しています。
VBAコードを読み解く
ドラッグ&ドロップの仕組みを作る際の既定文
1 |
Private Sub ProgressBar_OLEDragDrop(Data As Object, Effect As Long, button As Integer, shift As Integer, X As Single, Y As Single) |
プログレスバーにドラッグするときの記述です。
詳しくはありませんが、ドラッグ&ドロップの決まり文句みたいです。
変数を宣言する
3 4 |
Dim FullPath As String Dim answer As String |
3 Dim FullPath As StringはインポートするファイルのフルパスをString型(文字列型)で格納する変数を宣言しています。
4 Dim answer As Stringはドラッグ時に出すVbOKCancelのメッセージボックスの選択値をString型(文字列型)で格納する変数を宣言しています。
Accessのメッセージを消す
6 |
DoCmd.SetWarnings False |
後述しますが、重複してデータをインポートしないようにテーブルのデータを削除してからインポートしています。
その際の削除クエリのメッセージを消します。
【重要】インポートするファイルのフルパスを取得し変数に格納
8 |
FullPath = Data.Files(1) |
DataオブジェクトとFilesコレクションを使用してフルパスを取得し、変数FullPathに格納しています。
一つのファイルのフルパスを取得するので、Filesコレクションのインデックスを(1)とします。
コレクション内の最初の項目は0ではなく、1となることに注意してください。
ドロップ時に確認のメッセージを出す
9 |
answer = MsgBox("ファイルをインポートしますか?", vbOKCancel, "インポートフォーム") |
誤ったファイルをドラッグしている等の誤操作対策に、メッセージボックスを出して、OKかCancelの選択値を変数answerに格納しています。
メッセージボックスの選択値で処理を分岐する
11 12 13 14 15 16 17 18 19 20 |
If answer = vbOK Then DoCmd.OpenQuery "Q_商品テーブル削除" DoCmd.TransferText acImportDelim, , "T_商品", FullPath, True Else MsgBox "キャンセルされました!!" End If |
If then elseステートメントを使って、メッセージボックスの選択値で処理を分岐しています。
OK(vbOK)を選択した場合は、テーブル(T_商品)のデータを削除してから、CSVファイル(商品.csv)をインポートしています。
※前述していますが、インポート前にデータを削除するのは、インポートするたびにデータが追加されるため、データの重複を防ぐためです。
OK(vbOK)以外、すなわちCancelを選択した場合は、メッセージを出してインポートをキャンセルしています。
こんにちはmasalifeです 今回はフォームに設置したボタンをクリックするだけで、特定のテキストファイルをインポートする機能を紹介します。 使用するのはVBAのDoCmd.TransferTextメソッド […]
Accessのメッセージを出す
22 |
DoCmd.SetWarnings True |
最後に、Accessのメッセージが出るようにしています。
DoCmd.SetWarnings Falseとセットのため記述している程度の理解で大丈夫です。
さいごに
この機能を作成するにあたって、多くの方のブログやリファレンスを参考にさせていただきました。
記事を作成していただいた方には感謝申し上げます。
最後まで読んでいただきありがとうございました。