【VBA-Excel】他ファイルから特定の日付の列を参照してシートにセットする
フォームにボタンを配置して、名前を”btnRun”とでも変更する。
Private Function getFile() As Variant Dim myFile As Variant ChDir "D:\Temp" myFile = Application.GetOpenFilename("Excelファイル(*.xlsx),*.xlsx") getFile = myFile End Function Private Sub btnRun_Click() Dim myFile As Variant myFile = getFile If VarType(myFile) = vbBoolean Then MsgBox "キャンセルされました" Else loadData (myFile) End If End Sub
ボタンが押された時の動作を記述する。
細かい動作は、MSDNなどを参照してください。getFileでマスターとなるExcelファイルを参照しています。Variant 型に入れていますが、取得できるのはファイル名です。
loadData で、ファイルからデータを取得しています。
Private Sub loadData(myFile As Variant) Dim wbFrom, wbTo As Workbook Set wbTo = ActiveWorkbook '書き込み先 Set wbFrom = Workbooks.Open(myFile) 'マスターデータ Dim iRow, mRow As Integer iRow = 1 mRow = 1 Dim chkDate As Date chkDate = CDate("2021/1/1") Do Dim wDate As Variant wDate = wbFrom.Worksheets("Sheet1").Cells(iRow, 4).Value Debug.Print (wDate) ' If (IsDate(wDate) = True) Then Dim dwDate As Date dwDate = CDate(Int(wDate)) If (dwDate = chkDate) Then wbTo.Worksheets("Sheet1").Cells(mRow, 1).Value = wbFrom.Worksheets("Shett1").Cells(iRow, 1).Value wbTo.Worksheets("Sheet1").Cells(mRow, 2).Value = wbFrom.Worksheets("Shett1").Cells(iRow, 2).Value wbTo.Worksheets("Sheet1").Cells(mRow, 3).Value = wbFrom.Worksheets("Shett1").Cells(iRow, 3).Value wbTo.Worksheets("Sheet1").Cells(mRow, 4).Value = wbFrom.Worksheets("Shett1").Cells(iRow, 4).Value mRow = mRow + 1 End If End If ' If (wDate = "") Then Exit Do End If iRow = iRow + 1 Loop wbFrom.Close 'wbTo.Save 'wbTo.Close End Sub
鍵になってくるのが、日付の検索です。
元となっているファイルには、日付として、”yyyy/MM/dd HH:MM:SS”の形式で入っています。時刻が打刻されているデータと、日付だけを検索する為には、一工夫が必要です。
Variant でもうまく動くかもしれませんが、型はしっかりと宣言した方が、バグを回避できます(持論)。なので、比較対象を作成するときには、Date 型を宣言します。C#で慣れている人だと、DateTime型での宣言だと思ってください。Dateプロパティではないです。
CDate で、日付型に変換されますが、これだと時刻まで入ってしまいます。
chkDate = CDate(“2021/1/1”)
では、chkDate には、”2021/01/01 00:00:00”が入ります。時刻まで一致させる必要があります。Date プロパティでの比較も考えましたが、wDate には、Variant で宣言してシリアル値が入っていますので、小数点以下を切り捨てれば、日付のシリアル値となります。この辺りの動きは、経験則からなので、正しく動きますが、行おうと思ったら、Date型から年と月と日を取得して、日付として構築しなおして、Date型として宣言するのが正しいように思えます。
楽なので、Date型は、日付を1として時刻を小数で表現されているので、小数点以下を切り捨てることで、日付を算出できる。
あとは、開いたマスターデータを取得して、転写先にコピーするだけ。
終了条件として、データが無くなったらとしている。
最後に、開いているブックを閉じれば終了。
積読本や購入予定の書籍の情報を投稿しています
小説/開発/F1&雑談アカウントは、フォロバを返す可能性が高いアカウントです