VBAサンプル集
ブックを開かずにセル値を取得(ExecuteExcel4Macro,Excel.Application)

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
公開日:2013-09-18 最終更新日:2020-05-07

ブックを開かずにセル値を取得(ExecuteExcel4Macro,Excel.Application)


「ブックを開かずにセル値を取得」に関する検索が非常に多いようです。
おそらく、ExecuteExcel4Macroに関連しているとか、
もしくは、大量のファイルがある為、マクロVBAの処理時間がかかってしまうと言うものでしょう。
ExecuteExcel4Macroについての簡単な解説は、「ExecuteExcel4Macroについて

・ ・ ・ExecuteExcel4Macroの使用例 ・ExecuteExcel4Macroの最後に

サンプルを通して、方法論を解説します。
以下では、マクロ記述してExcelファイルと同一フォルダ内の"test"サブフォルダの全Excelファイルについて処理します。
"test"フォルダには、100KB強のExcelファイルを100個入れて、以下のテストを実行しています。

ExecuteExcel4Macroで1個のセル値を取得

Sub sample1()
  Dim i As Long
  Dim strDir As String
  Dim strFile As String
  
  Debug.Print Timer
  Application.ScreenUpdating = False
  strDir = ThisWorkbook.Path & "\test\"
  strFile = Dir(strDir)
  i = 1
  Do While strFile <> ""
    Cells(i, 1) = ExecuteExcel4Macro("'" & strDir & "[" & strFile & "]Sheet1'!R1C1")
    strFile = Dir()
    i = i + 1
  Loop
  Application.ScreenUpdating = True
  Debug.Print Timer
End Sub

"Sheet1"のA1セルのみ取得しています。
この処理は非常に速いです。
私の環境では、0.3秒程度で完了します。

Excel.Applicationで1個のセル値を取得

Sub sample2()
  Dim i As Long
  Dim strDir As String
  Dim strFile As String
  Dim xls As New Excel.Application
  Dim wb As Workbook
  
  Debug.Print Timer
  Application.ScreenUpdating = False
  strDir = ThisWorkbook.Path & "\test\"
  strFile = Dir(strDir)
  i = 1
  Do While strFile <> ""
    Set wb = xls.Workbooks.Open(strDir & strFile)
    Cells(i, 1) = wb.Worksheets("Sheet1").Range("A1")
    wb.Close Savechanges:=False
    strFile = Dir()
    i = i + 1
  Loop
  Set xls = Nothing
  Application.ScreenUpdating = True
  Debug.Print Timer
End Sub

"Sheet1"のA1セルのみ取得しています。
私の環境では、11秒程度で完了します。

この処理は、ExecuteExcel4Macroに比べたら遅いのですが、
New Excel.ApplicationとExcelインスタンスを生成せずに、
普通に、Workbooks.Open(strDir & strFile)とやるよりは、はるかに高速に動作します。
これですと、30~40秒くらいの時間はかかってしまうはずです。

ExecuteExcel4Macroで100個のセル値を取得

Sub sample1_2()
  Dim i As Long
  Dim j As Long
  Dim strDir As String
  Dim strFile As String
  
  Debug.Print Timer
  Application.ScreenUpdating = False
  strDir = ThisWorkbook.Path & "\test\"
  strFile = Dir(strDir)
  i = 1
  Do While strFile <> ""
    For j = 1 To 100
      Cells(i, j) = ExecuteExcel4Macro("'" & strDir & "[" & strFile & "]Sheet1'!R1C" & j)
    Next
    strFile = Dir()
    i = i + 1
  Loop
  Application.ScreenUpdating = True
  Debug.Print Timer
End Sub

"Sheet1"のA1~CV1セルの取得をしています。
私の環境では、約25秒程度で完了します。
sample1の1個のセル取得に比べて、約100倍の時間がかかっています。
これは、単純に、ExecuteExcel4Macroの実行回数に比例していると言う事になります。

Excel.Applicationで100個のセル値を取得

Sub sample2_2()
  Dim i As Long
  Dim j As Long
  Dim strDir As String
  Dim strFile As String
  Dim xls As New Excel.Application
  Dim wb As Workbook
  
  Debug.Print Timer
  Application.ScreenUpdating = False
  strDir = ThisWorkbook.Path & "\test\"
  strFile = Dir(strDir)
  i = 1
  Do While strFile <> ""
    Set wb = xls.Workbooks.Open(strDir & strFile)
    For j = 1 To 100
      Cells(i, 1) = wb.Worksheets("Sheet1").Cells(1, j)
    Next
    wb.Close Savechanges:=False
    strFile = Dir()
    i = i + 1
  Loop
  Set xls = Nothing
  Application.ScreenUpdating = True
  Debug.Print Timer
End Sub

"Sheet1"のA1~CV1セルの取得をしています。
私の環境では、約38秒程度で完了します。
sample2の1個のセル取得に比べて、約3倍以上の時間がかかっています。
しかし、データ個数の増加に比べると短い時間で済んでいます。
これは、セル値の取得より、ブックのOpenに時間がかかっている為です。
しかし、ちょっと考えてみて下さい。
連続したセル値を取得するなら、もっと効率的な記述ができます。

Excel.Applicationで100個のセル値を取得2

Sub sample2_3()
  Dim i As Long
  Dim strDir As String
  Dim strFile As String
  Dim xls As New Excel.Application
  Dim wb As Workbook
  Dim ws As Worksheet
  
  Debug.Print Timer
  Application.ScreenUpdating = False
  strDir = ThisWorkbook.Path & "\test\"
  strFile = Dir(strDir)
  i = 1
  Do While strFile <> ""
    Set wb = xls.Workbooks.Open(strDir & strFile)
    Set ws = wb.Worksheets("Sheet1")
    Range(Cells(i, 1), Cells(i, 100)).Value = ws.Range(ws.Cells(1, 1), ws.Cells(1, 100)).Value
    wb.Close Savechanges:=False
    strFile = Dir()
    i = i + 1
  Loop
  Set xls = Nothing
  Application.ScreenUpdating = True
  Debug.Print Timer
End Sub

私の環境では、約12秒程度で完了します。
sample2の1個のセル取得と、ほとんど変わっていません。
つまり、
Cells(i, 1) = wb.Worksheets("Sheet1").Range("A1")

Range(Cells(i, 1), Cells(i, 100)).Value = ws.Range(ws.Cells(1, 1), ws.Cells(1, 100)).Value
これは、ほとんど処理時間に差が無いと言うことになります。

ブックを開かずにセル値を取得

おもに、処理時間について考察しましたが、
ExecuteExcel4Macroには、重大な欠点があります。
それは、シート名が固定でなければ取得できないことです。
別の方法で、ブックを開かずにシート名を取得する方法はあります。
Excelファイルを開かずにシート名を取得
Excelファイルを開くときは、ファイルサイズに比して、とても遅い場合があります、ファイルを開かずに、Excelの情報を取得したいという要望は少なからずあるようです、そこで、処理の基本となるシート名を取得する方法になります。もちろん、開かないと言っても、厳密には必ず開いているわけですが、Excelのブックとして開か…

ExecuteExcel4Macro("'" & strDir & "[" & strFile & "]Sheet1'!R1C1")
この、Sheet1は固定で記述しなければなりません。
つまり、シート名が不明な場合はExecuteExcel4Macroは使えないのです。
Excel.Applicationを利用した方法なら、
先頭シート、Worksheets(1)のように記述も出来ますし、もちろん全シートに対しての処理も問題ありません。
結論として、ExecuteExcel4Macroが有用なのは、
・ファイル数が極めて多い
・シート名が固定されている
・取得するセル数が限定的である事

ということになります。
なお、「ExecuteExcel4Macroについて」にもある通り、ExecuteExcel4Macroでは関数も使えます。
・ ・ ・ExecuteExcel4Macroの使用例 ・ExecuteExcel4Macroの最後に
ただし、単一の値を取得する関数に限られます。

余程の事情が無い限り、ExecuteExcel4Macroは積極的に使うものではないでしょう。



同じテーマ「マクロVBAサンプル集」の記事

ブックを安全確実に開く方法(Open)
ブックを閉じる(Close)
他ブックを開いて閉じる(Open,Close)
ブックを開かずにセル値を取得(ExecuteExcel4Macro,Excel.Application)
罫線を簡単に引く(Borders,BorderAround)
マクロVBAの開始時と終了時に指定しておくべきApplicationのプロパティ
オートフィルター(AutoFilter)
日付のオートフィルタ(AutoFilter)
印刷ダイアログを使用する(xlDialogPrint)
名前定義の一覧と削除(Name)
シートを名前順に並べ替える


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ