その1からの続きです。
ACCESSを起動すると、フォーム「MENU」が起動します。
左上のボタン「btn_コピー元」には、以下のコードをクリック時のイベントに割り当てています。
Private Sub btn_コピー元_Click() Me.txt_コピー元 = "" Me.txt_コピー元 = GetTransfer End Sub
これにより、「btn_コピー元」をクリックすると、フォルダ参照ダイアログが表示されます。
ダイアログのOKをクリックすると、「txt_コピー元」にコピー元フォルダのパスがセットされます。
ここでは、写真を保存したSDカードをEドライブとして設定しています。
Eドライブに10個のjpegファイル(写真)と1個のmovファイル(動画)を入れてあります。
写真は、2013/8/1から2013/8/10までに1枚ずつ撮影したもの。動画ファイルは、2013/8/7に撮影したものです。
次に、「btn_コピー先」をクリックすると、同様にフォルダ参照ダイアログが表示されるので、コピー先のフォルダを指定します。「btn_コピー元」には、同様に以下のコードをクリック時のイベントに割り当てています。
Private Sub btn_コピー先_Click() Me.txt_コピー先 = "" Me.txt_コピー先 = GetTransfer End Sub
出力先は、デスクトップに作成した「IMG」フォルダとします。
フォームの「btn_コピー実行」をクリックするとコピー先として指定したフォルダに、ファイル作成日を名前にしたフォルダを作成してコピーを実行します。コードは、以下のとおりです。
Dim db As DAO.Database Dim rst As DAO.Recordset Dim strSQL As String Dim FSO As Object Dim myPath, MyName, strTgTPATH, strTgTFileNM As String Dim FSO_DateCreated As String Dim LP_CNT As Long Private Sub Form_Load() Me.txt_コピー元 = "E:\" Set db = CurrentDb strSQL = "delete * from 変換" db.Execute strSQL End Sub
Private Sub btn_コピー実行_Click() Set db = CurrentDb strSQL = "delete * from 変換" db.Execute strSQL ' パスを設定します。 myPath = Me.txt_コピー元 & "*.*" MyName = Dir(myPath, vbNormal) strTgTPATH = Me.txt_コピー先 Set FSO = CreateObject("Scripting.FileSystemObject") LP_CNT = 1 Do While MyName <> "" ' ループを開始します。 myPath = Replace(myPath, "*.*", "", , , vbTextCompare) FSO_DateCreated = FSO.GetFile(myPath & "" & MyName).DateCreated strSQL = "insert into 変換 (コピー元パス,ファイル名,ファイル作成日時,コピー先パス) " & _ "values('" & myPath & "','" & MyName & "',#" & CDate(FSO_DateCreated) & "#,'" & strTgTPATH & "" & Format(CDate(FSO_DateCreated), "yyyy_mmdd") & "" & "' )" db.Execute strSQL MyName = Dir ' 次のファイル名を返します。 LP_CNT = LP_CNT + 1 Loop strSQL = "select * from フォルダ名" Set rst = db.OpenRecordset(strSQL) If rst.RecordCount <> 0 Then Do If Dir$(strTgTPATH & "" & rst!名前, vbDirectory) = "" Then MkDir (strTgTPATH & "" & rst!名前) Else MsgBox rst!名前 & "フォルダがあります。処理を中止します。" rst.Close Exit Sub End If rst.MoveNext Loop Until rst.EOF = True End If rst.Close strSQL = "select * from 変換" Set rst = db.OpenRecordset(strSQL) If rst.RecordCount <> 0 Then Do MyName = rst!ファイル名 myPath = rst!コピー元パス strTgTPATH = rst!コピー先パス 'コピー元 myPath = myPath & MyName 'コピー先 strTgTPATH = strTgTPATH & MyName FileCopy myPath, strTgTPATH rst.MoveNext Loop Until rst.EOF = True End If rst.Close MsgBox "コピー完了", vbInformation End Sub
コピー完了のメッセージが出現したら、正常終了です。IMGフォルダを見てみましょう。
うまくいったようです。
コマンドプロンプトのtreeコマンドでファイル構造を見てみましょう。
treeコマンドとは、ドライブやパスのフォルダ構造を図式表示してくれます。
TREE [ドライブ:][パス] [/F] [/A]
/F 各フォルダのファイル名を表示します。
/A 拡張文字ではなく、ASCII 文字で表示します。
├─2013_0801
│ 0001.JPG
│
├─2013_0802
│ 0002.JPG
│
├─2013_0803
│ 0003.JPG
│
├─2013_0804
│ 0004.JPG
│
├─2013_0805
│ 0005.JPG
│
├─2013_0806
│ 0006.JPG
│
├─2013_0807
│ 0007.JPG
│ M0001.MOV
│
├─2013_0808
│ 0008.JPG
│
├─2013_0809
│ 0009.JPG
│
└─2013_0810
0010.JPG
撮影日のフォルダへファイルがコピーされました。動画ファイルも2013_0807フォルダへコピーされていますね。成功です。
このACCESS-VBAは、WindowsXP SP3、Access2000、Internet Explorer8で動作確認しています。
コメントをどうぞ!