Sub TEST1()
'「別ブック」を参照して条件一致の合計値を算出
With Workbooks("TEST.xlsx").Worksheets("Sheet1")
ThisWorkbook.Worksheets("Sheet1").Cells(2, "A") = WorksheetFunction.SumIf(.Range("A:A"), "B", .Range("B:B"))
End With
End Sub
別ブックを用意しておきます。
別ブックを用意
同フォルダ内に、参照元と参照先のブックを保存しています。
参照する別ブックの「TESXT.xlsx」は開いておきます。
では、別ブックを参照して、条件一致の合計値を算出してみます。
別ブックを参照して条件一致の合計値を算出
別ブックを参照して、条件一致の合計値を算出できました。
ブックを開いておく必要がある
SumIf関数を使う際のポイントは、「ブックを開いておく」ということです。
ブックを閉じた状態では参照することができません。
ちょっとやってみます。
先ほどとのVBAコードです。
Sub TEST2()
'別ブックを開いていないとエラー
With Workbooks("TEST.xlsx").Worksheets("Sheet1")
ThisWorkbook.Worksheets("Sheet1").Cells(2, "A") = WorksheetFunction.SumIf(.Range("A:A"), "B", .Range("B:B"))
End With
End Sub
別ブックを閉じた状態にしておきます。
別ブックを閉じた状態
では、VBAコードを実行してみます。
別ブックを閉じた状態だとエラー
別ブックを閉じた状態だと「エラー」となりました。
ブックを開いて合計値を算出してみる
別ブックを参照したい場合は、「ブックを開いて」から参照するといいです。
「Workbooks.Open」で参照したいブックを開きます。
Sub TEST3()
'ブックを開く
Workbooks.Open ThisWorkbook.Path & "\TEST.xlsx"
'「別ブック」を参照して条件一致の合計値を算出
With Workbooks("TEST.xlsx").Worksheets("Sheet1")
ThisWorkbook.Worksheets("Sheet1").Cells(2, "A") = WorksheetFunction.SumIf(.Range("A:A"), "B", .Range("B:B"))
End With
'別ブックを閉じる
Workbooks("TEST.xlsx").Close
End Sub
開いていても邪魔なので、最後に別ブックを閉じます。
別ブックを閉じた状態にしておきます。
別ブックは閉じた状態
では、VBAコードを実行します。
別ブックが開かれる
別ブックが開かれました。
別ブックを参照して別ブックを閉じる
別ブックを参照して、条件一致の合計値を計算できました。
別ブックは閉じられています。
埋め込み数式を使ってSumIf関数で別ブックを参照
埋め込み数式でSumIf関数を使う方法で、「別ブック」を参照してみます。
「ブック名」を入力して別ブックを参照
埋め込みの数式内に、「ブック名」を入力すると、別ブックを参照できます。
「[TEST.xlsx]Sheet1!A:A」というような感じです。
Sub TEST4()
'「別ブック」を参照して条件一致の合計値を算出
With ThisWorkbook.Worksheets("Sheet1")
.Cells(2, "A") = "=SUMIF([TEST.xlsx]Sheet1!A:A,""B"",[TEST.xlsx]Sheet1!B:B)"
.Cells(2, "A").Value = .Cells(2, "A").Value '値に変換
End With
End Sub
別ブックを用意しておきます。
別ブックを用意
同フォルダ内に、参照元と参照先のブックを保存しています。
別ブックを開いておきます。
では、VBAコードを実行してみます。
別ブックを参照した条件一致の合計値を算出
「別ブック」を参照して、条件一致の合計値を算出できました。
セルに数式を入力してコピーして使う
数式を埋め込みたい場合は、一旦、セルに数式を入力して、コピーして使うと便利です。
数式をコピーして利用する
VBE画面で直接入力してもできますけども、セルの数式をコピーした方が簡単です。
ブックを開いておく必要がある
埋め込みの数式を使う場合も、「別ブックを開いておく」必要があります。
先ほどとのVBAコードを、別ブックが閉じた状態で実行してみます。
Sub TEST5()
'別ブックを開いていないと、うまく計算できない
With ThisWorkbook.Worksheets("Sheet1")
.Cells(2, "A") = "=SUMIF([TEST.xlsx]Sheet1!A:A,""B"",[TEST.xlsx]Sheet1!B:B)"
.Cells(2, "A").Value = .Cells(2, "A").Value '値に変換
End With
End Sub
Sub TEST6()
'ブックを開く
Workbooks.Open ThisWorkbook.Path & "\TEST.xlsx"
'「別ブック」を参照して条件一致の合計値を算出
With ThisWorkbook.Worksheets("Sheet1")
.Cells(2, "A") = "=SUMIF([TEST.xlsx]Sheet1!A:A,""B"",[TEST.xlsx]Sheet1!B:B)"
.Cells(2, "A").Value = .Cells(2, "A").Value '値に変換
End With
'ブックを閉じる
Workbooks("TEST.xlsx").Close
End Sub
Sub TEST7()
'「SUM」と「If」を配列数式で、別ブックを「閉じたまま」参照する
With ThisWorkbook.Worksheets("Sheet1")
.Cells(2, "A").FormulaArray = "=SUM(IF('C:\TEST\[TEST.xlsx]Sheet1'!A:A=""B"",'C:\TEST\[TEST.xlsx]Sheet1'!B:B))"
.Cells(2, "A").Value = .Cells(2, "A").Value '値に変換
End With
End Sub
「.FormulaArray」で「配列数式」の形でセルに入力するのがポイントです。
別ブックを閉じた状態にしておきます。
では、VBAコードを実行してみます。
別ブックを閉じた状態で参照できました。
数式を作成する方法
最初は、別ブックを開いた状態で、セルに「配列数式」を入力して、参照できることを確認します。
そのあとに、参照先の別ブックを閉じます。
別ブックを閉じると、別ブックのパスが、自動的にフルパスに変更されます。
セルに入力された数式をコピーして、VBAコードに貼り付けて、利用します。
ブックを閉じたまま取得すると高速
ブックを閉じたまま取得したいのは、少し高速になるからです。
ブックを開いて参照
ブックを閉じたまま参照する
の2つで時間を計測してみます。
ブックを開いて参照
ブックを開いて参照するコードです。
Sub TEST8()
t = Timer
For i = 1 To 10
'ブックを開く
Workbooks.Open ThisWorkbook.Path & "\TEST.xlsx"
'「別ブック」を参照して条件一致の合計値を算出
With ThisWorkbook.Worksheets("Sheet1")
.Cells(2, "A") = "=SUMIF([TEST.xlsx]Sheet1!A:A,""B"",[TEST.xlsx]Sheet1!B:B)"
.Cells(2, "A").Value = .Cells(2, "A").Value '値に変換
End With
'ブックを閉じる
Workbooks("TEST.xlsx").Close
Next
Debug.Print Timer - t & " 秒"
End Sub
ブックを開いて値を取得する方法を、10回繰り返します。
別ブックを参照できています。
かかった時間は、「7.91 秒」となりました。
ブックを閉じたまま参照する方法
次は、ブックを閉じたまま参照する方法です。
Sub TEST9()
t = Timer
For i = 1 To 10
'「SUM」と「If」を配列数式で、別ブックを「閉じたまま」参照する
With ThisWorkbook.Worksheets("Sheet1")
.Cells(2, "A").FormulaArray = "=SUM(IF('C:\TEST\[TEST.xlsx]Sheet1'!A:A=""B"",'C:\TEST\[TEST.xlsx]Sheet1'!B:B))"
.Cells(2, "A").Value = .Cells(2, "A").Value '値に変換
End With
Next
Debug.Print Timer - t & " 秒"
End Sub