• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel VBA ExecuteExcel4Macroについて)

Excel VBA ExecuteExcel4Macroについて

このQ&Aのポイント
  • Excel VBAのExecuteExcel4Macroを使用してファイルからデータを読み込む方法について説明します。
  • マクロを実行すると、指定したフォルダ内の複数のxlsファイルからデータを読み込みます。
  • 処理速度を上げるために、範囲でのデータの読み込みを試みましたがうまくいかなかったので、他の方法を探しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 mitarashiさん、どうもありがとうございます。 今回の件については、私のコードは苦肉の策の内容のようです。 >ExecuteExcel4Macroは範囲を読み込むことはできないのでしょうか? 今回のコードも、INDEX関数で取ることはできないわけではないのですが、本質的には、一つずつ取り出すしかないようですね。 なお、ExecuteExcel4Macroを使うと、使うメリットは、ファイルを開かなくて済むということですが、DAOやADOの方法もあります。開くときのオーバーヘッドが減らせますから、ファイルの数が多ければ多いほど、時間は少なくて済むはすだと思います。 以下のコードは、値自体のエラー値や'0'を取り去ることも出来ませんが、同じ技法を使った、Consolidate という方法があります。少しは、速くなるような気がします。 なお、以下のコードの細かい点は検証されていません。 '------------------------------------------- Sub TestMacro1()   Dim p As String   Dim fn As String   Dim j As Long   Const EXT As String = ".xls" '拡張子   Application.Calculation = xlManual   Application.ScreenUpdating = False   Application.DisplayAlerts = False      p = Application.DefaultFilePath      With Worksheets("o")     .UsedRange.Clear     fn = Dir(p & "\" & "*.xls", vbNormal)          Do       .Cells(1, j + 1).Value = p & "\" & fn       .Cells(2, j + 1).Value = fn              .Range("A3").Resize(4).Offset(, j).Consolidate Sources:= _       "'" & p & "\[" & fn & "]" & Replace(fn, EXT, "", 1) & "'!R3C1:R6C1", _       Function:=xlSum, TopRow:=True, LeftColumn:=False, CreateLinks:=False       j = j + 1       fn = Dir()     Loop While Dir() <> ""   End With   Application.ScreenUpdating = True   Application.DisplayAlerts = True   Application.Calculation = xlAutomatic End Sub

noname#200395
質問者

お礼

Wendy02さん いつもありがとうございます。 mitarashiさんのご回答をいただいてから、「一旦配列に受けておいて、一気にセルに代入する」ためにいろいろ苦心していましたが、ついには捗のいかないまま、Wendy02さんのコードを拝借させていただく仕儀となりました。 実行結果についてひとつ申し添えますと、     Loop While Dir() <> "" のところは Loop Until fn = "" にさせていただきました。 もちろん"o.xls"の情報をもういちどD列に書き出す必要などないのですが、前者のままだとなぜか"c.xls"のデータが読み込まれなかったからです。 とにかく、大変感謝しております。ありがとうございました。

その他の回答 (2)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

範囲で読み込んでいる例を見たことがないので、出来ないのかもしれません。(確証なし) 下記に、本板の常連のWendy02さんの回答例があります。 http://oshiete1.goo.ne.jp/qa2999291.html 試してみた結果では、一旦variant型の配列に値を収納しておいて、範囲に代入するところが高速化に効いている様でした。 データ数が増えてくると、ご呈示のコードの .Cells(i, fc) = e のところを、一旦配列に受けておいて、一気にセルに代入するのは高速化に相当効きます。(5年くらい前のCeleron機で、1000個のデータ読込・転写が6.6秒位でしたが、どうでしょうか) http://officetanaka.net/excel/vba/speed/s11.htm

  • rivoisu
  • ベストアンサー率36% (97/264)
回答No.1

最後の方の .range(Cells(3, fc),cells(6, fc)) = e は e=.range(Cells(3, fc),cells(6, fc)) の間違いでしょうか? eをvariantにしてはいかがですか ExecuteExcel4Macroをなぜ使わなければならないのかよく解りません >セルA3以下が読み込まれます。 とあるので単なる転記(代入)でいいと思いますが。