エクセルVBAで別ファイルの値をコピーする方法とは?

このQ&Aのポイント
  • エクセルVBAを使用して、同一フォルダ内にある別ファイルの値を開かずにコピーする方法を教えてください。
  • 現在、2000行近くある処理に時間がかかってしまうため、もっと高速な方法があれば教えてください。
  • ファイル名やシート名は変数で指定しています。
回答を見る
  • ベストアンサー

別ファイルの値を、「そのファイルを開かずに」コピー

いつもありがとうございます。 エクセルVBAにて、「同一フォルダ内にある別ファイルの値を、『そのファイルを開かずに』 コピーする」やり方をいろいろ調べているのですが、なかなか思うようにいきません。 現状、こんな感じです。 -----------------------------------------------------------------------   For i = 4 To 2000 Sheets(Lm).Cells(i, 14).FormulaR1C1 = "='[" & Base & ".xls]" & St & "'!RC[24]" Next i ※変数"Base"には参照したいファイル名、"St"及び"Lm"にはシート名が入っています -----------------------------------------------------------------------  これで行いたい処理はできているのですが、2000行近くあるため、職場の低CPUな PCでは処理に時間がかかってしまいます。  これを、(たとえばcopyメソッドなどを使って?)もっと速く処理できる方法はないでしょうか?  以上、ご教示のほど、よろしくお願いいたします。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

sub macro1() worksheets(Lm).range("N4:N2000").formulaR1C1 = "='c:\フォルダ\[" & base & ".xls] & st & "'!RC[24]" end sub などのようにしてみます。 少なくともセルを一個一個嘗め回してその都度外部参照させるようなマクロにしない工夫をしてみると,改善があるかもしれません。 高速化が目的なら,きちんと開いてシンプルにコピーしてきた方がずっと早い事も十分考えられます。実際にマクロを組んで,実験してみて事実を確認してみてください。 またセルを一度に2000個も本当に参照する必要があるのか?といった部分はどうなんでしょうか。 #ご質問に掲示された今のマクロは「閉じたブックを参照する」になっていませんが,てきとーに削って掲示したせいかもしれません? #閉じたCSVに対して外部参照式で値を取ってこさせる方法はありません。

AMEFURIO
質問者

お礼

ご回答ありがとうございました。 上手くいきました。 あとは、「きちんと開いてシンプルにコピー」とどちらが速いかなど いろいろ実験してみます。 あるがとうございました。

その他の回答 (2)

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.3

No2の方もおっしゃるように バックグラウンドでファイル内のデータをひっぱて来ることは可能ですが この方法はメモリが少ないPCでは逆に遅くなることもあります。 ファイルを開かずに値を持ってくることは不可能です。 2000ものファイルをどの頻度で操作するのでしょうか? データが多くのファイルに分散してしまう運用を見直したほうが良いです。 一般的な発想ですが それぞれのファイルでデータを操作したら、その内容を データベースに蓄積される 集計の際は、データベースから必要な部分を取り出して処理する。 といったことを考えます。

AMEFURIO
質問者

お礼

ご回答、ありがとうございました。

  • vaidurya
  • ベストアンサー率45% (2714/5983)
回答No.1

VBAとかEXCELの詳しい使い方は知りませんが… コンピューター処理の常識で考えると 一つはシートの保存場所を、HDDではなく RAMディスクやSSDにおくことが効果的じゃないかと思います。 それが予算的にできないのであれば シートをCSV形式に変換して保存するといった方法で まったく違う手段でアクセスするほうが高速かもしれません。 一度、その処理中にタスクマネージャーでモニタリングして CPU負荷とHDDアクセスとメモリー消費などの推移から 速度低下の原因を特定すべきかもしれません。 たとえば最初のアプローチはHDD待ちを解消するもので 後のアプローチは、メモリー消費とCPU負荷に効果があるかもしれません。 ただ、VBAからEXCELのシートをアクセスするより CSVファイルへのアクセスのほうが、難しいかもしれません。 また必ず高速化できるとも言えません。 (VBAのEXCELシート参照機能が充分に最適化されている場合など)

AMEFURIO
質問者

お礼

まったく違う視点からのご回答、ありがとうございました。

関連するQ&A

  • excel VBA For ~Next構文について

    excel VBA For ~Next構文についての質問です。 以下のようなマクロがあります(実際はもう少し複雑なことをやっていますが)     For i = 4 To 178      Cells(i, 16).FormulaR1C1 = "=RC[-2]-'" & Lm & "'!RC[-2]"     Next i これに「もし、『Cells(i, 1)』が空白なら、この処理は行わずに、次の行にすすめ」という指示を加えたいのですが、こんな簡単なこと(?)で行き詰ってしまっています。 とりあえず以下のように修正をしてみたのですが・・・    For i = 4 To 178    If Cells(i, 1) = "" Then GoTo ワープ:    Cells(i, 16).FormulaR1C1 = "=RC[-2]-'" & Lm & "'!RC[-2]"    ワープ:   Next i  これで一応こちらの求めている処理はできたのですが、もっと簡単に(もしくはすっきりと) できる方法はないでしょうか?  以上、よろしくお願いいたします。   

  • 複数ファイルの特定のセルをコピーして1つにまとめる

    1つのフォルダ内の複数のファイル(Sheet1のみ)から、 特定のセルをコピーして、1つのファイルにまとめたいと 思っています。 変数  wkb 複数のファイル  myb 自分のファイル (1) wkb.Sheets("Sheet1").Range("A1:D5").Copy myb.Sheets("統合").Cells(i, "A").PasteSpecial Paste:=xlPasteValues このように書いた場合、うまくいくのですが (2) wkb.Sheets("Sheet1").Range(Cells(1, 1), Cells(5, 5)).Copy myb.Sheets("統合").Cells(i, "A").PasteSpecial Paste:=xlPasteValues このように書くと、1004でエラーとなります。 本来は、Sheet1の1行目から5行目までの中で、値がある行まで コピーしたいので、(つまり1~3行目のときもあれば、1行目だけの ときもある。)(2)の方法で実行したいのです。 なんとかいい方法はないでしょうか?

  • エクセルVBAで書式と値の貼付けにつて

    エクセル2007VBAで新規ファイルを作る場合のコピー、貼り付けで質問しましたが 式も全て貼り付けになるとUSBメモリーで持ち出した場合、エラーとなります。 それで値と書式のみ貼り付けする様下記の様に書き直しましたが、.PasteSpecialでメソッドまたはデータメンバーが見つかりませんとなります。 ぐぐっててヘルプを見ますが解決出来ません。どなたがご教授お願いします。 元の式 Sub DGCopy() Workbooks.Add With ThisWorkbook .Sheets(5).Cells.Copy Sheets(1).Cells Sheets(1).Select Sheets("Sheet1").Name = "電気代" .Sheets(6).Cells.Copy Sheets(2).Cells Sheets(2).Select Sheets("Sheet2").Name = "ガス代" F = Application.GetSaveAsFilename(FileFilter:="Excelブック (*.xls),*.xls)") If F = "False" Then Exit Sub ' ダイアログでCancelをクリックした場合 ActiveWorkbook.SaveAs Filename:=CStr(F) End With End Sub 書き直した式 Sub DGCopy() Workbooks.Add With ThisWorkbook Sheets(5).Select Cells.Selection.Copy Sheets(1).Selection .PasteSpecial Paste:=xlPasteFormats ←エラー部分 .PasteSpecial Paste:=xlPasteValues Sheets("sheets1").Name = "電気代" Sheets(6).Select Cells.Selection.Copy Sheets(2).Selection .PasteSpecial Paste:=xlPasteFormats .PasteSpecial Paste:=xlPasteValues Sheets("sheets2").Name = "ガス代" F = Application.GetSaveAsFilename(FileFilter:="Excelブック (*.xls),*.xls)") If F = "False" Then Exit Sub ActiveWorkbook.SaveAs Filename:=CStr(F) End With End Sub

  • ファイル すべてのシート 値だけ 別のシート

    ファイルAのすべてのシートに関数式が含まれています。 このシートを別フォルダーに分割し書き出すことは出来たのですが 関数式まで貼り付けられます。 これを値のみにしたいのですがご教授御願いします。 マクロはこれです。 Sub シート分割() Const path As String = "C:¥" Dim bk As Workbook Set bk = ActiveWorkbook Dim st As Worksheet For Each st In bk.Sheets Workbooks.Add st.Copy Before:=ActiveWorkbook.Sheets(1) ActiveWorkbook.SaveAs path & st.Name & ".xls" ActiveWorkbook.Close Next End Sub

  • シートをコピーする際のVBAコードについて

    お世話になります。 sample.xls というファイルがあります。 このファイルの中にVBA処理にて、現在のシートをコピーする処理を行います。 Windows("sample.xls").Activate Sheets("sheet1").Select Sheets("sheet1").Copy after:=Sheets(Sheets.Count) sample.xlsは原本ファイルとなり、実際の運用時は拡張子の前に年月を表示する 形で保存されます。 (sample201106.xls、sample201109.xlsなど) こうなってしまうと、VBAで定義した Windows("sample.xls").Activate ファイル名が変わることで、この部分にエラーが生じます。 ファイル名が変更されても、上記コードがうまく機能するようにする方法はありますでしょうか? アドバイスいただけたらと思います。 よろしくお願いします。

  • VLookupで参照する範囲を変数で渡したい

    マクロ内で開いた別ファイルにあるリストをVLookupで参照するマクロを作っています。 固定のファイルで行う場合には以下の内容で動いています。 ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-4],'070801.xls'!R1C1:R2430C6,6,FALSE)" このファイル名[070801.xls]とセル範囲(行数がファイルによって違う)のを変数で渡す必要があります。 #細かい部分は割愛しています。 Workbooks.Open Filename:=Fname, ReadOnly:=True 'ファイル読み込み Range("A1").CurrentRegion.Select 'データ全体選択 Selection.SpecialCells(xlCellTypeLastCell).Select '最終行検出 endRcell = ActiveCell.Row ********ここの間に入る処理 ********多分「Range(Cells(1, 1), Cells(endRcell, 6))」など ThisWorkbook.Activate Range("H2").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-4],?????,6,FALSE)"                              ↑ここに指定する変数 2カ所について、どのように指定すればよいのか分かりません。 色々試してみたのですが・・・・ よろしくお願いいたします。

  • エクセルマクロエラー「'Cells'メソッドは失敗しました。'_Global'オブジェクト」について

    Excel 2000のマクロで教えてください。 あるセルに関数をいれるマクロを設定しております。  変数% = 8  Range(Cells(126, 20), Cells(155, 19 + 2 *  変数%)).FormulaR1C1 =  "=(RC[-18]-R[-1]C[-18])/0.04*100" このマクロを走らせると、たまに、 「'Cells'メソッドは失敗しました。'_Global'オブジェクト」 という、エラーがでます。 どういう意味なのでしょうか。 うまくいくときもあるので、よくわかりません。 すみませんが、教えてください。

  • シートを別のブックに複数自動コピー

    初質問です。よろしくお願いします。 マクロを使って、あるブックのシート(20から50枚程度)を、別の貼り付け先のブックに自動的にコピーしようとすると、10回をすぎたあたり(必ずしも一定せず)で 「実行時エラー'1004': WorksheetクラスのCopyメソッドが失敗しました。」 というエラーと共にマクロが止まり、デバッグしようとすると 「ActiveSheet.Copy After:=Workbooks("貼り付け先ブック.xls").Sheets("○○シート")」 のところで止まっています。 マクロの記述内容は以下の通りです。 Sheets("貼り付け元シート").Activate ActiveSheet.Copy After:=Workbooks("貼り付け先ブック.xls").Sheets("○○シート") Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Application.CutCopyMode = False Range("A1").Select Windows("貼り付け元ブック.xls").Activate ・・・以下貼り付け元シートを変えつつ複数回繰り返し これができる様になれば非常にラクになるので、ぜひご教授願います。

  • EXCEL VBA セルからファイル名を読み込む

    EXCEL VBAについての質問です 同じ処理を名前の違う複数のファイルで行いたいと思っています そこで、セルA2へファイル名の『○○.xls』○○部分だけをそれぞれのファイルに書き込んでおき、マクロは共通にしてファイル名をそれぞれのファイルから読み込んで実行したいと思っています。 良い方法を教えてください。 Workbooks("200809.csv").Activate Sheets("200809").Select Range("C3:C33").Copy Windows("○○.xls").Activate'←ここをファイルにあわせて変更できる形にしたい Sheets("報告書").Select Range("G5:G35").Select ActiveSheet.Paste Windows("200809.csv").Activate Range("K3:K33").Copy Windows("○○.xls").Activate’←ここ Sheets("報告書").Select Range("I5:I35").Select ActiveSheet.Paste Workbooks("200809.csv").Close SaveChanges:=False よろしくお願いします。

  • VBAのブックやシートのアクティブ化について質問です。

    元ファイルに格納されているマクロを実行すると、 他のエクセルファイルを開いて、 そこから必要な情報を収集して元ファイルに集める… というマクロをいま組んでいるのですが、 他のエクセルファイルを開いたら、 そのファイルはアクティブになるはずで、 それ以下に記述の処理は、元のファイルを触らない限り、 当該他のファイルに対して行われると思っているのですが、 元ファイルが処理されていします。 なので、現在、記述する際には、 以下のようにブック名とシート名から指定しています。 Workbooks(BookBango & ".xls").Sheets(2).Range(Workbooks(BookBango & ".xls").Sheets(2).Cells(1, 1), Workbooks(BookBango & ".xls").Sheets(2).Cells(paste_counter, 3)).Copy … これで一応動くは動くのですが、 とても冗長ですし、ミスを誘いやすく、修正が大変ですので、 解決したいのですが、 どうにも解決法が分かりません。 不勉強で申し訳ありませんが、どうかご指導下さい。 お願いします。

専門家に質問してみよう