【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関連の戯言を呟いています。
小説アカウントでは、宣伝をメインに積読本や購入予定の書籍を呟いています。