HOME > 即効テクニック > Excel VBA > ファイル操作関連のテクニック > 閉じたブックからデータを取得する

閉じたブックからデータを取得する|Excel VBA

ファイル操作関連のテクニック

閉じたブックからデータを取得する

(Excel 97/2000/2002/2003/2007/2010)

ブックを開かないで、ブックのデータを読む方法を紹介します。
ここで言う「開く」とは、Excel上に読み込むことを指します。
サイズの大きなブックでは、Excelで開くだけでも時間がかかる場合があります。
ここでご紹介する方法を使えば、そうした時間的なロスを避けることができます。

ブックを閉じたままデータを読むには、Excel 4.0のマクロを使います。 次のコードは、C:\Book1.xlsのSheet1のセルA1を読んで表示します。

Sub Sample1()
    MsgBox ExecuteExcel4Macro("'C:\[Book1.xls]Sheet1'!R1C1")
End Sub

Excel 4.0マクロを使うにはExecuteExcel4Macroという命令を使います。
ブック名は[Book1.xls]のように半角の角括弧[]で囲みます。
パスは角括弧[]の前に指定し、後ろにはシート名を指定します。
この「パス[ブック名]シート名」全体をシングルコーテーション(')で囲み、その後ろには「!」に続けてセルのアドレスをR1C1形式で指定します。
R1C1形式は、Rが行位置を表し、Cが列位置を表します。
R1C1は「1行目1列目」でセルA1を指し、R2C3はセルC2を意味します。

非常に便利なテクニックですが、いくつかの注意点や制限もあります。
まず、存在しないブック名やパス、あるいは存在しないシート名などを指定するとマクロはエラーになってしまいます。
ブック名やパスは、Dir関数などで事前に調べることもできますが、ブックを開かないでそのブックにSheet1が存在するかどうかを調べるのは、かなり難しいです。

また、ブックをExcel上に開かないとはいえ、ブックのデータを解析して指定されたデータを取り出すことに違いはありません。
たくさんのセルを取得しようとすると、それなりに時間がかかるので注意しましょう。

なお、この方法で取得できるのは「セルのデータ」だけです。
文字の色や罫線などセルの書式を調べることはできませんし、セルに数式が入っていた場合は、数式の計算結果が返されます。日付や時刻はシリアル値が返ります。
また、何も入力されていないブランクセルでは、「0」が返るという特徴もあります。

以上のような注意点や制限を理解していれば、便利に使える場合もあります。
ここでは、いくつかの例をお見せしましょう。
次のコードは、C:\Book1.xlsのSheet1のセル範囲A1:D10を取得して、アクティブシートに入力します。

Sub Sample2()
    Dim i As Long, j As Long
    For i = 1 To 10
        For j = 1 To 4
            Cells(i, j) = _
                ExecuteExcel4Macro("'C:\[Book1.xls]Sheet1'!R" & i & "C" & j)
        Next j
    Next i
End Sub

次のコードは「C:\支店データ」フォルダに保存されている全てのブックから、
Sheet1のセルA1を取得してアクティブシートに入力します。

Sub Sample3()
    Dim i As Long, buf As String, Target As String
    Const Path = "C:\支店データ\"
    buf = Dir(Path & "*.xls")
    Do While buf <> ""
        Target = "'" & Path & "[" & buf & "]Sheet1'!R1C1"
        i = i + 1
        Cells(i, 1) = buf
        Cells(i, 2) = ExecuteExcel4Macro(Target)
        buf = Dir()
    Loop
End Sub