【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&雑談アカウントは、フォロバを返す可能性が高いアカウントです