Access インポートするファイル名の一部をレコードとして取り込む
インポートするレコードがいつ作成されたものなのか、後々の分析作業で使用したい場面で使います。
ファイル名の最後に年月日(yyyymmdd)と文字列が入っている場合
AccessのVBAにもSQLを使用したモジュール入れて、レコードにすることが可能です。
この場合は Right(ファイル名, 8) で取り出します。
ファイル名は文字列なので、'で括ります。
後、フィールド名がNullの場合も考慮しNz関数を使用します。
AccessのVBAでSQLを起動する時はDoCmd.RunSQL構文を使います。
Sub date_import1()
Dim sql As String
DoCmd.SetWarnings WarningsOn:=False
sql = "UPDATE テーブル名 SET フィールド名='" & Right(ファイル名, 8) & "' WHERE Nz(フィールド名)=''"
DoCmd.RunSQL sql
DoCmd.SetWarnings WarningsOn:=True
End Sub
ファイルを選択、テーブルインポートから、ファイル名の年月日(yyyymmdd)の取得まで一気に行いたい場合
上の構文とは少し変えて、年月日(yyyymmdd)が、ファイル名の左にも右にも寄っておらず、任意の文字列の次に記載されていることとします。
ここでは、アンダーバー(_)の次に年月日(yyyymmdd)が記載されているファイル名だとして、テーブルにインポートする際のフルパス使用し、InStrRev関数を使用してアンダーバーはファイルの何番目の文字になるのかを i = InStrRev(FLNM, "_")で表します。
例として、csvファイルのインポートの想定で記します。
Sub date_import2()
DoCmd.SetWarnings False
Dim InRet As Integer ’ダイアログ用変数
Dim FLNM As String ’ファイルの値変数
Dim sql As String
Dim i As Long
With Application.FileDialog(msoFileDialogOpen)
’ダイアログのタイトルを設定
.Title = "任意のタイトル"
’ファイルの種類を選択
.Filters.Clear
.Filters.Add "csvファイル", "*.csv"
.FilterIndex = 1
’複数のファイル選択を許可しない
.AllowMultiSelect = False
’初期パスを設定
.InitialFileName = CurrentProject.Path & "\"
'ダイアログを表示
InRet = .Show
If InRet <> 0 Then
’ファイルが選択されたとき、フルパスを返り値に設定
FLNM = .SelectedItems.Item(1)
Else
’ファイルが選択されなければブランク
FLNM = ""
End If
’ファイルが未選択ならメッセージを出してモジュールを終了
If FLNM = "" Then
MsgBox "ファイルを選択してください"
Exit Sub
’ファイルが選択されたら所定のテーブルにインポート
End If
DoCmd.TransferText acImport, "インポート定義", "テーブル名", FLNM, True
'アンダーバーがファイル名の最初から何番目になるか取得
i = InStrRev(FLNM, "_")
’インポートしたテーブルの任意のフィールドに年月日を取得
sql = "UPDATE テーブル名 SET フィールド名='" & Mid(FLNM, i + 1, 8) & "' WHERE Nz(フィールド名)=''"
DoCmd.RunSQL sql
DoCmd.SetWarnings True
MsgBox "年月日情報をインポートしました"
End With
End Sub
インポートする時にFileDialogを使い、任意のファイルを選択します。
Accessを使用してると、確認のポップアップが出てくることが多いのですが、それを出したくない時は構文の前後に DoCmd.SetWarnings をFalseにすると、ポップアップが出なくなります。
構文が終わった後や、メッセージボックスを出したい時は Trueにしてポップアップが出るようにします。
DoCmd.SetWarnings False
構文
DoCmd.SetWarnings True