お世話になります。
こちらの質問をさせて頂いた者です。
リンク先の質問の回答では、シート内のセルの値から日付を取得する方法を提示して頂いたのですが、Excelのファイル名から日付を取得するようにしたいと考えています。
Option Compare Database
Option Explicit
Public Function getFileName(tmpFilePath As String) As String
Dim intret As Integer
With Application.FileDialog(msoFileDialogOpen)
.Title = "発注書選択"
.Filters.Clear
.Filters.Add "Excelファイル", "*.xls"
.FilterIndex = 1
.AllowMultiSelect = False
.InitialFileName = tmpFilePath
intret = .Show
If intret <> 0 Then
getFileName = Trim(.SelectedItems.Item(1))
Else
getFileName = ""
End If
End With
MsgBox getFileName
End Function
上記のような標準モジュールと
Private Sub btn_発注書取込_Click()
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "T_発注書取込", getFileName(""), True, "発注数$B4:J32"
MsgBox "インポート完了", vbInformation + vbOKOnly
End Sub
このような発注書取込ボタンを作成しました。
フォームボタンのクリック時イベントのDocmdの後に、タイトルを実現するコードを追記したらいいと思うのですが、、、やり方が分かりません。
取り込みたいのは発注書(2023.12.19).xlsというファイル名だとします。
とりあえず、どのようにファイル名が取得されているのかをMsgbox getFileNameで確認したところ
C:¥Users¥中略¥発注書(2023.12.19).xls
が代入されていると分かりました。
mid関数やsearch関数を組み合わせるのかと考えましたが、()内のみを取り出すような方法はあるのでしょうか?
標準モジュールに下記の関数を作成します。
発注書取込ボタンのクリック時のイベントプロシージャを下記にします。
取得した日付はとりあえずメッセージボックスに表示してますが、
使用用途に合わせて修正してください。
こちらのコードを試したところ、Beref引数の型が一致しませんとエラーが出るのですが、どうすればよろしいでしょうか?
また、このコードの読解をしていたところ、8文字かそれ以上でなければ日付かどうか判定する条件式に入らないと思うのですが、ファイル名が発注書(2024.1.9).xlsxのように8桁ではない場合、どうすればよいでしょうか?
そのエラーがでるのはどの行ですか。エラーのでる行を提示してください。
こちらで試してみましたが「発注書(2024.1.9).xlsx」でも問題なく 2024/01/09 という日付が返りますが。
実際に試してみましたか。
エラーが出ていたためまだ実行結果を見ていませんでした。
もう一度コピペし直したところエラーは出なくなりました。
あと、読解が間違っていたようです。(2024.1.9)でもpos1=8、pos2=17なのでl=8で条件式に入りますね。
この取得した日付をT_発注書取込の発注日フィールドに書き込む記述は、msgboxのところを書き換えればよいでしょうか?
はい、そうです。
とりあえず試してみてうまく行かない場合、質問してください。
getFileName
がget file nameっぽくないですねぇC:\(データ)\ABC(2023.12.12).xls
とか試してみるといいと思います
先にファイル名を取り出しておくでもいいですが、InStr関数ではなくInStrRev関数を使っておくとより良いと思います
ついでにmidを使わない方法を考えてみたり
手抜きしているので
C:\データ\ABC)2023.12.12(.xls
も日付を拾ってきます正規表現によるパターンパッチングを行う場合。
個別にレスできずすみません。
回答ありがとうございます。
意味を理解しながら一つずつ試してみたいと思います!