Sub TEST1()
'別ブックを開く
Workbooks.Open Filename:=ThisWorkbook.Path & "\TEST.xlsx"
Set Wb1 = ThisWorkbook 'このブック
Set Wb2 = Workbooks("TEST.xlsx") '別ブック'別ブックの値を取得
Wb2.Worksheets("Sheet1").Range("A1:C1").Copy Wb1.Worksheets("Sheet1").Cells(1, 1)
Wb2.Close False '別ブックを閉じる
End Sub
同じフォルダに、「TEST.xlsx」というブックを用意しました。
フォルダ構成
「TEST.xlsx」には、「Sheet1」に次にように値を入力しておきました。
別ブックの値
では、VBAコードを実行して、別ブックを参照してみます。
別ブックを参照
別ブックの値を、参照することができました。
この方法がVBAとしては、シンプルな方法になります。
ただ、ブックを開いて参照するので、少し時間がかかります。
次で、時間を計測してみます。
100個のブックを参照する時間を計測
別ブックを開いて参照する方法で、100個のブックを参照するのにかかる時間を、計測してみます。
VBAコードは、こんな感じになります。
Sub TEST2()
t = Timer
For i = 1 To 100
'別ブックを開く
Workbooks.Open Filename:=ThisWorkbook.Path & "\TEST" & Format(i, "000") & ".xlsx"
Set Wb1 = ThisWorkbook 'このブック
Set Wb2 = Workbooks("TEST" & Format(i, "000") & ".xlsx") '別ブック'別ブックの値を取得
Wb2.Worksheets("Sheet1").Range("A1:C1").Copy Wb1.Worksheets("Sheet1").Cells(i, 1)
Wb2.Close False 'ブックを閉じる
Next
Debug.Print Timer - t & " 秒"
End Sub
Sub TEST3()
With ActiveSheet
'数式を使って、別ブックを参照
.Cells(1, 1) = "='C:\Users\User\Desktop\TEST\[TEST.xlsx]Sheet1'!$A$1"
'数式を値に変換
.Cells(1, 1).Value = .Cells(1, 1).Value
End With
End Sub
Sub TEST4()
Dim A, B, C, D
With ActiveSheet
A = ThisWorkbook.Path 'フォルダパス
B = "TEST.xlsx" '別ブック名
C = "Sheet1" 'シート名
D = .Cells(1, 1).Address 'セル範囲'数式を使って、別ブックを参照
.Cells(1, 1) = "='" & A & "\[" & B & "]" & C & " '!" & D
'数式を値に変換
.Cells(1, 1).Value = .Cells(1, 1).Value
End With
End Sub
Sub TEST5()
Dim A, B, C, D
With ActiveSheet
A = ThisWorkbook.Path 'フォルダパス
B = "TEST.xlsx" '別ブック名
C = "Sheet1" 'シート名
For i = 1 To 3
'セル範囲
D = .Cells(1, i).Address
'数式を使って、別ブックを参照
.Cells(1, i) = "='" & A & "\[" & B & "]" & C & " '!" & D
'数式を値に変換
.Cells(1, i).Value = .Cells(1, i).Value
Next
End With
End Sub
では、別ブックのセル「A1~C1」を参照してみます。
別ブックのセル「A1~C1」を参照することができました。
VBAコードが少し見づらいではありますけども、かなり高速です。
次で、検証してみます。
100個のブックを参照する時間を計測
100個のブックを、数式を使って参照するという方法で、時間を計測してみます。
VBAコードは、次のようになります。
Sub TEST6()
t = Timer
Dim A, B, C, D
For i = 1 To 100
For j = 1 To 3
With ActiveSheet
A = ThisWorkbook.Path 'ファルダパス
B = "TEST" & Format(i, "000") & ".xlsx" '別ブック名
C = "Sheet1" 'シート名
D = Cells(1, j).Address 'セル範囲'数式を使って、別ブックを参照
.Cells(i, j) = "='" & A & "\[" & B & "]" & C & " '!" & D
'数式を値に変換
.Cells(i, j).Value = .Cells(i, j).Value
End With
Next
Next
Debug.Print Timer - t & " 秒"
End Sub
別ブックを100個、用意しました。
100個の別ブック
それぞれのブックには、セル「A1~C1」の範囲にデータが入力されています。
100個の別ブックのデータ
では、100個の別ブックを、数式を使って参照してみます。
数式を使って100個の別ブックを参照
100個の別ブックを、数式を使って参照できました。
問題の時間です。
かかった時間
「1.41 秒」となりました。
かなり速いですよね。別ブックを毎回開いて参照した場合では、「87.70 秒」でした。
ブックを閉じたまま参照できるので、速いです。
ちなみに、配列を使うともうちょっと速くなります。
次で検証してみます。
配列を使って高速化
数式を使って別ブックを参照する方法で、さらに配列を使って、高速化してみます。
VBAコードは、こんな感じになります。
Sub TEST7()
t = Timer
'配列を作成
Dim Arr
ReDim Arr(1 To 100, 1 To 3)
Dim A, B, C, D
For i = 1 To 100
For j = 1 To 3
With ActiveSheet
A = ThisWorkbook.Path 'フォルダパス
B = "TEST" & Format(i, "000") & ".xlsx" '別ブック名
C = "Sheet1" 'シート名
D = Cells(1, j).Address 'セル範囲'数式を配列に格納
Arr(i, j) = "='" & A & "\[" & B & "]" & C & " '!" & D
End With
Next
Next
With ActiveSheet
'配列をセルに入力
.Range("A1").Resize(UBound(Arr, 1), UBound(Arr, 2)) = Arr
'数式を値に変換
.Range("A1").CurrentRegion.Value = .Range("A1").CurrentRegion.Value
End With
Debug.Print Timer - t & " 秒"
End Sub