今年の夏もとんでもなく暑い日々が続きましたが、8月末からの大雨の連続が強引に秋をつれてきた感じがする今日この頃です。
さて、夏休みでデジカメのSDカードは写真でいっぱいです。そろそろPCに取り込んで、SDカードを空にしないといけません。今日は、撮影日ごとに振り分けるACCESSのVBAをご紹介します。
撮影日ごとにフォルダを作って振り分けたい!
和休の場合、デジカメで撮影した写真は、撮影日ごとのフォルダを作成してそこへ保管しています。
たとえば、2013年9月6日に撮影した写真を保管するフォルダ名は、2013_0906です。ファイル名はそのままです。
これまではフリーソフトの「FuriwakeTo」を使用していましたが、静止画(jpegファイル)は振り分けてくれるのですが動画(movファイル)は残ってしまう問題がありました。
そんならACCESSを使用して同様の機能を作り上げてしまえ!ということで、作成しました。
テーブル
テーブル名 変換
フィールドは、コピー元パス(テキスト型 サイズ255)、ファイル名(テキスト型 サイズ255)、ファイル作成日時(日付型)、コピー先パス(テキスト型 サイズ255)
クエリ
クエリ名 フォルダ名
SELECT Format([変換]![ファイル作成日時],”yyyy_mmdd”) AS 名前
FROM 変換
GROUP BY Format([変換]![ファイル作成日時],”yyyy_mmdd”);
フォーム
フォーム名 MENU
フォームにはボタンが3つ、テキストボックスが2つあります。
「コピー元を設定」ボタンの名前はbtn_コピー元
「コピー先を設定」ボタンの名前はbtn_コピー先
「コピー実行」ボタンの名前はbtn_コピー実行
テキストボックスの名前は、「txt_コピー元」と「txt_コピー先」。
マクロ
マクロ名 autoexec
起動時にmenuフォームを立ち上げる設定です。
モジュール
モジュール名 Module1
フォルダ参照ダイアログとデスクトップへのパスを取得する関数を入れてあります。
どちらもネット上で見つけたコードそのままです。
Module1の中身
Option Compare Database
Option Explicit
Type BROWSEINFO
hWndOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
Declare Function SHBrowseForFolder Lib "SHELL32" (lpbi As BROWSEINFO) As Long
Declare Function SHGetPathFromIDList Lib "SHELL32" _
(ByVal pIDL As Long, ByVal pszPath As String) As Long
Public Function GetBrowseFolder(strMsg As String) As String
'フォルダ参照ダイアログを表示し選択されたフォルダ名を返します。
'引数 strMsg : ダイアログに表示するメッセージ(例:"フォルダを指定して下さい")
'[キャンセル]ボタンやESCキーが押された場合は長さゼロ("")の文字列を返します。
Dim udtBrowseInfo As BROWSEINFO
Const cMaxPathLen = 256
Dim strBuffer As String * cMaxPathLen
Dim strPathBuffer As String * cMaxPathLen
Dim strRetPath As String
Dim lngRet As Long
'BROWSEINFO構造体を定義します
With udtBrowseInfo
.hWndOwner = Application.hWndAccessApp
.pidlRoot = 0
.pszDisplayName = strBuffer
.lpszTitle = strMsg & vbNullChar
.ulFlags = 1
.lpfn = 0
.lParam = 0
.iImage = 0
End With
GetBrowseFolder = "" '返り値の初期設定を行います
lngRet = SHBrowseForFolder(udtBrowseInfo) 'フォルダ参照ダイアログを表示します
If lngRet <> 0 Then 'API関数の返り値をチェックします
If SHGetPathFromIDList(lngRet, strPathBuffer) <> 0 Then
'返り値にフォルダ名をセットします
GetBrowseFolder = Left(strPathBuffer, InStr(strPathBuffer, vbNullChar) - 1)
End If
End If
End Function
Function GetTransfer()
Dim strFolder As String
'フォルダの参照ダイアログを表示します
strFolder = GetBrowseFolder("フォルダを指定して下さい。")
If Len(strFolder) > 0 Then
If Right$(strFolder, 1) <> "" Then
'フォルダが選択された場合
strFolder = strFolder
End If
GetTransfer = strFolder
Else
MsgBox "キャンセルされました。", , "管理者"
'キャンセルされたときはアクションなし
End If
End Function
Function myDeskTopPath()
' 実行時の デスクトップパス取得
Dim MyWSH As Object
Set MyWSH = CreateObject("WScript.Shell")
myDeskTopPath = MyWSH.SpecialFolders("Desktop")
Set MyWSH = Nothing
End Function
その2へ続く




コメントをどうぞ!
お下劣鉄工所さん、こんにちは。
今回の記事は、確かにACCESSやVBAを使わない方にとっては???だと思います。
和休もプログラミングなんて別世界のお話しと思っていましたが、あるきっかけで始めてみると結構面白いです。ACCESS-VBAを始めて約10年になります。独学なので詳しい方に見られるのはちょっと恥ずかしいですね。
ACCESSを最近始められた方へ、こんな使い方もあるよという感じでUPして見ました。以前UPした自動バックアップもそうですが、VBAからのファイル操作の練習の題材にいいかなと思います。
私には見ても読んでも???
なので今回はコメントしようがありません。