- ベストアンサー
Excel VBA ExecuteExcel4Macroについて
- Excel VBAのExecuteExcel4Macroを使用してファイルからデータを読み込む方法について説明します。
- マクロを実行すると、指定したフォルダ内の複数のxlsファイルからデータを読み込みます。
- 処理速度を上げるために、範囲でのデータの読み込みを試みましたがうまくいかなかったので、他の方法を探しています。
- みんなの回答 (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
その他の回答 (2)
- mitarashi
- ベストアンサー率59% (574/965)
範囲で読み込んでいる例を見たことがないので、出来ないのかもしれません。(確証なし) 下記に、本板の常連の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)
最後の方の .range(Cells(3, fc),cells(6, fc)) = e は e=.range(Cells(3, fc),cells(6, fc)) の間違いでしょうか? eをvariantにしてはいかがですか ExecuteExcel4Macroをなぜ使わなければならないのかよく解りません >セルA3以下が読み込まれます。 とあるので単なる転記(代入)でいいと思いますが。
お礼
Wendy02さん いつもありがとうございます。 mitarashiさんのご回答をいただいてから、「一旦配列に受けておいて、一気にセルに代入する」ためにいろいろ苦心していましたが、ついには捗のいかないまま、Wendy02さんのコードを拝借させていただく仕儀となりました。 実行結果についてひとつ申し添えますと、 Loop While Dir() <> "" のところは Loop Until fn = "" にさせていただきました。 もちろん"o.xls"の情報をもういちどD列に書き出す必要などないのですが、前者のままだとなぜか"c.xls"のデータが読み込まれなかったからです。 とにかく、大変感謝しております。ありがとうございました。