エクセルVBAでConsolidate

このQ&Aのポイント
  • エクセルVBAでConsolidateを使って同じフォルダ内の全ブックのSheet1のA1:B10をThisWorkbookのSheet1に統合する方法を教えてください。
  • 上記のVBAコードでは、フォルダ内の各ブックのSheet1のA1:B10の値を変数に代入し、それらの値をThisWorkbookのSheet1に統合しています。
  • このコードを実行すると、開いているエクセルブックと同じ場所にある他のブックのデータを参照し、統合することができます。
回答を見る
  • ベストアンサー

エクセルVBAでConsolidate

以下は、ネット検索で見つけたサンプルコードです。 同じフォルダ内の全ブックのSheet1のA1:B10をThisWorkbookのSheet1に統合しています。 Sub test2() Dim MyFile As String, MyPath As String Dim SumFile() As Variant, i As Long MyPath = ThisWorkbook.Path & "\" MyFile = Dir(MyPath, vbNormal) Do Until MyFile = "" If MyFile <> ThisWorkbook.Name Then ReDim Preserve SumFile(i) 'A1からB10の値を変数に代入 SumFile(i) = "'" & MyPath & "[" & MyFile & "]Sheet1'!R1C1:R10C2" i = i + 1 End If MyFile = Dir Loop If i = 0 Then MsgBox "データが有りません": Exit Sub Worksheets("Sheet1").Range("A1").Consolidate Sources:=SumFile() End Sub 質問1 Sheet1だけでなく全シートのA1:B10をThisWorkbookのSheet1に統合するためにはどう書き換えればよいのでしょうか? 質問2 上記コードではなぜ、ブックを開かずにデータがとれるのでしょうか?

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

merlionXX さんは ヘルプなどのドキュメントをご自分で調べる方だと思います。 十分なスキルがありますので、基本的なことは説明しません。 が、何故かデバッグの方法を教えてくれる人やドキュメントはなかなか見ませ んね、、、 良い機会なので、デバッグ のアドバイス です。   1. On Error ~ ステートメント は コメントアウト しておく   2. VBE の ローカルウインドウ を表示   3. 再度実行し、エラー 停止時の変数を ローカルウインドウ で チェック この様にして、#1 補足欄のコードを実行し、エラー停止時の変数の状況をチェック します。すると、オブジェクト変数 wb が Nothing になっていました。 これが原因で wb.Close に失敗しています。 次に wb が何故 Nothing になってしまったかを検証します。 今度はプロシージャを 「ステップイン」で一行ずつ実行してみます。 F8 キーを押すことで順次コードを実行していきますので、これでプログラムの流れ がわかります。 すると、MyFile = Dir(MyPath, vbNormal) で返されたファイル名が ThisWorkbook と一致した場合、 If MyFile <> ThisWorkbook.Name Then ~ End If 内に書かれた Set wb = ~ をすり抜けて wb.Close に飛んでいることに気付くと 思います。 このような手順で行ってみて下さい。

merlionXX
質問者

お礼

デバックの方法までご丁寧にありがとうございます。 #2でご教示のコードを動かしたところ、やはり同じところがエラーになりました。「インデックスが有効範囲に無い」というエラーです。 SumFile(i) = "'" & MyPath & "[" & MyFile & "]" & sn & "'!R1C1:R10C2" '←ここでエラー!! ご教示のF8で順次コードを実行して見ていくと、最初のブックの2枚目のシートにきたところでエラーが出ます。でも変数にはすべて値が入っておりなぜかわかりません。(゜〇゜;)? どこが悪いのでしょうか?

merlionXX
質問者

補足

わかりました! ReDim Preserve SumFile(i)の位置が悪いんですね? For Nextの中にもっていかないと配列のワクが広がらないからインデックスエラーなんですね?

その他の回答 (3)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

> For Nextの中にもっていかないと配列のワクが広がらないから > インデックスエラーなんですね? ああ、、見落としてましたね。 こちらでは、1 ブック 1シートの手抜きテストだったものです から、、すみません。その通りです。完全にスルーしてました。 (^^;) あと、掲示板で質問するときは、エラーメッセージの内容か、 エラー番号を教えてもらえると話が通りやすくなりますよ。

merlionXX
質問者

お礼

ありがとうございました。 原因の究明もでき、無事解決ですっきりです。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

wb.Close の位置が違います。 それから、コードで直した方が良いと思う点が幾つかありました。ご参考 下さい。 Sub test2()      Dim MyFile  As String   Dim MyPath  As String   Dim sn    As String   Dim SumFile() As Variant   Dim i     As Long   Dim wb    As Workbook   Dim sh    As Worksheet '<-- ココ      MyPath = ThisWorkbook.Path & "\"   MyFile = Dir(MyPath & "*.xls", vbNormal) '<-- ココ      Do Until MyFile = ""     If MyFile <> ThisWorkbook.Name Then       ReDim Preserve SumFile(i)       '選択したファイルをLink更新なしで開く       Set wb = Workbooks.Open(MyPath & "\" & MyFile, UpdateLinks:=0)       For Each sh In wb.Worksheets         sn = sh.Name         SumFile(i) = "'" & MyPath & "[" & MyFile & "]" & sn & "'!R1C1:R10C2"         i = i + 1       Next       '選択したファイルを閉じる       wb.Close SaveChanges:=False '<-- ココ     End If     MyFile = Dir   Loop   Set wb = Nothing '<-- ココ   If i = 0 Then MsgBox "データが有りません": Exit Sub   Worksheets("Sheet1").Range("A1").Consolidate Sources:=SumFile() End Sub

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

こんにちは。KenKen_SP です。 【質問1 について】  > SumFile(i) = "'" & MyPath & "[" & MyFile & "]Sheet1'!R1C1:R10C2"  この部分が肝です。全シートを対象にするなら、Sheet1 の部分をループ  処理で書換えてやれば良いのです。ただ、下記の質問2に関連しますが、  ブックに含まれるシート名のリストを得るためには、結局ブックを開く  ことになりますね、、 【質問2 について】  厳密に言えば、例外なくどんなファイルでも開かずにデータを得ることは  不可能です。  しかし、ユーザーに「開く動作」を意識させないことは可能です。  簡単な例で言えば、Workbooks.Open の動作を Application.ScreenUpdating  で画面描写を停止させてしまう方法がありますね。「開く動作」を意識させ  ずに、シートのデータを得る方法は、他にもあります。  ・Excel のリンクを使う 例)='C:\[test.xls]Sheet1'!$A$1  ・ExecuteExcel4Macro メソッド(Excel4.0Macro)を利用する  ・DAO や ADO でブックに接続する  ・バイナリデータを直接解析する  いずれの場合も、何らかの形でファイルは開いています。  Consolidate メソッドが内部でどのように問い合わせをしているのか、その  方法はわかりませんが、同様に「開く」を意識させないように実装されて  いるだけに過ぎません。 で、つまるところ実現したいことは、、 「 Workbooks.Open を使わずに、シートのデータを取得したい」 ということですか?

merlionXX
質問者

お礼

こんにちは。KenKen_SPさん。いつもお世話になります。 長くなりますので、補足の欄に書かせていただきました。 よろしくお願いします。

merlionXX
質問者

補足

「開かずに」が重点ではありません。 実は、Sheet1をループ処理するためにWorkbooks.Open で以下のようにしてみたのですがエラーになってしまいました。それで困って質問したのです。 Sub test2() Dim MyFile As String, MyPath As String, sn As String Dim SumFile() As Variant, i As Long Dim wb As Workbook MyPath = ThisWorkbook.Path & "\" MyFile = Dir(MyPath, vbNormal) Do Until MyFile = "" If MyFile <> ThisWorkbook.Name Then ReDim Preserve SumFile(i) Set wb = Workbooks.Open(MyPath & "\" & MyFile, UpdateLinks:=0) '選択したファイルをLink更新なしで開く For Each sh In wb.Worksheets sn = sh.Name SumFile(i) = "'" & MyPath & "[" & MyFile & "]" & sn & "'!R1C1:R10C2" '←ここでエラー!! i = i + 1 Next End If wb.Close '選択したファイルを閉じる MyFile = Dir Loop If i = 0 Then MsgBox "データが有りません": Exit Sub Worksheets("Sheet1").Range("A1").Consolidate Sources:=SumFile() End Sub

関連するQ&A

  • Application.DisplayAlerts =Falseでも警告される?

    下記のコードを実行するとSheet1という名前のシートがないBookを開いた場合、「統合元ファイル○○のSheet1を開けません」という警告がでます。 無ければ集計しなくていいので「はい」を押せばいいのですが、その都度止まってしまうのは困ります。 Application.DisplayAlerts = False としても警告されるのはなぜでしょうか?出ないようにすることは出来ないのでしょうか? Sub test03() 'Sheet1のみ開かずに統合 Dim MyFile As String, MyPath As String Dim SumFile() As Variant, i As Long MyPath = ThisWorkbook.Path & "\" MyFile = Dir(MyPath & "*.xls", vbNormal) Do Until MyFile = "" If MyFile <> ThisWorkbook.Name Then ReDim Preserve SumFile(i) Application.DisplayAlerts = False SumFile(i) = "'" & MyPath & "[" & MyFile & "]Sheet1'!R1C1:R10C2" 'A1からB10のLinkを変数に代入 Application.DisplayAlerts = True i = i + 1 End If MyFile = Dir Loop If i = 0 Then MsgBox "データが有りません ( ̄□ ̄;)!!": Exit Sub Worksheets("Sheet1").Range("A1").Consolidate Sources:=SumFile() End Sub

  • Excel 2010 VBA:ファイル名を読み込む

    下は複数のcsvファイルを一つに合体するVBAです。これにシートの右端に読み取ったファイル名を追加するにはどうしたらよいでしょうか。 よろしくお願いします。 Sub macro1() Dim myPath As String Dim myFile As String Dim s As String myPath = ThisWorkbook.Path & "\" On Error Resume Next Kill myPath & "合体版.csv" On Error GoTo 0 myFile = Dir(myPath & "*.csv") If myFile = "" Then Exit Sub Open myPath & "合体版.csv" For Output As #1 Do Until myFile = "" Open myPath & myFile For Input As #2 Do Until EOF(2) Line Input #2, s Print #1, s Loop Close #2 myFile = Dir() Loop Close #1 End Sub

  • EXCEL マクロ につきまして

    お世話になっております。 以前、同様の質問をさせていただきまして、 その拡張バージョンをつくりたいと考えております。 Sub macro1() Dim myPath As String Dim myFile As String Dim c As Long Dim LastRowr As Long Application.ScreenUpdating = False myPath = ThisWorkbook.Path & "\" myFile = Dir(myPath & "*.xls") c = 6 Do Until myFile = "" If myFile <> ThisWorkbook.Name Then Workbooks.Open Filename:=myPath & myFile lastrow = Worksheets("特定のシート").Range("A65536").Row ThisWorkbook.Worksheets(2).Cells(1, c).Resize(lastrow, 1).Value = Worksheets("特定のシート").Range("H1").Resize(lastrow, 1).Value Workbooks(myFile).Close False c = c + 1 End If myFile = Dir() Loop Application.ScreenUpdating = True On Error Resume Next ActiveSheet.Name = Format(Date, "mmdd") On Error GoTo 0 End Sub こちらは"特定のシート"の特定の列(H)のみをひたすらフォーマットに 貼り付けていくものですが、コピペしたい列が増えた場合(数は一定ではない) のバージョンができればと思っております。 正直まったくわかりません。 1)データが何列あるかは不定 2)行1~3には自動的に何らかのデータが振られてしまっており(連番等)  データの終わりとして使えそうなのは、行4に「0」が入っていること  (但し0は非表示にしております) "特定のシート"名・データがH列から始まる等は変わりません。 現状の記述を改修、もしくは全とっかえでも構いません。 なにとぞよろしくお願い致します。

  • 複数のエクセルファイルとシートからデータ抽出したい

    以前に http://soudan1.biglobe.ne.jp/qa8369459.html でやられている内容なのですが、私の場合はシートすべての[i4」のセル値を一覧でひっぱりたいです。 keithinさんご回答の sub macro1()  dim myPath as string  dim myFile as string  dim w as worksheet  mypath = thisworkbook.path & "\"  myfile = dir(mypath & "*.xls*")  application.screenupdating = false  do until myfile = ""   if myfile <> thisworkbook.name then    workbooks.open mypath & myfile    for each w in workbooks(myfile).worksheets    with thisworkbook.worksheets("Sheet1").range("A65536").end(xlup).offset(1)     .value = myfile     .offset(0, 1) = w.name     .offset(0, 2).value = w.cells(w.rows.count, "C").end(xlup).value              ↑をRange("i4").Value      end with    next    workbooks(myfile).close false   end if   myfile = dir()  loop  application.screenupdating = true end sub にて実施しましたが、ファイル名・シート名は正確に抽出するものの 参照したい「i4」のデータが先頭のシートのi4だけを拾ってしまいます 1.xls、2.xls、3xlsがありそれぞれ名前がばらばらなシート「あ」、「い」、「う」の3つがある。2.xlsには「え」、「お」、「か」のしーとがあると仮定、マクロを実行すると、一覧のエクセルに 1、xls  あ  あのシートi4の値 1、xls  い  あのシートi4の値 1、xls  う  あのシートi4の値 2.xls  え  えのシートi4の値 2.xls  お  えのシートi4の値 2.xls  か  えのシートi4の値 子のようなか形で出力されます い のところには いのシートのi4が、う のところには うのシートのi4が、 抽出されるには構文をどう買えればよいのでしょうか

  • エクセルVBAで、ある条件の時

    お世話になります。 エクセルVBAで次のようなことをしたいのですが方法を教えてください。 formフォルダにあるすべてのファイルについて、A1セルが「0」でないとき、 A4:B7及びA9:B12の中で日付が入っている行の日付と内容を、ActiveWorksheetのB列、C列にレコードとして取り出したいのです。 (A列はナンバリングになります) --------formフォルダの中にあるブック---------   A  B 1 23 2 3 日付 内容   'この行は固定です 4 5/13 あああ 5 5/17 いいい 6 7 8 日付 内容   'この行は固定です 9 5/16 ううう 10 5/12 えええ 11 12 5/10 おおお ---ThisWorkbook(前に助けていただいたコードです)--- Sub data_torikomi2()   Dim wb As Workbook   Dim Fn As String   Dim myPath As String   Dim dbBkSh As Worksheet   Dim i As Long   For Each wb In Workbooks     If wb.Name <> ThisWorkbook.Name And _     InStr(1, wb.FullName, "form\", 1) > 0 Then 'formを検索       wb.Close '閉じる     End If   Next wb   myPath = ThisWorkbook.Path & "\"   Set dbBkSh = ThisWorkbook.Worksheets("一覧表")          Range("4:1000").Clear '全データ削除   Fn = Dir(myPath & "form\*.xls")   i = 1   '画面のちらつきを抑える   Application.ScreenUpdating = False   Do Until Fn = ""     If Fn <> ThisWorkbook.Name Then       With Workbooks.Open(myPath & "form\" & Fn, , True)         dbBkSh.Range("A3").Offset(i, 0).Value = i     【★たぶんこの部分に入るものです★】         .Close False         i = i + 1      End With     End If     Fn = Dir()   Loop   Application.ScreenUpdating = True   Set dbBkSh = Nothing End Sub ご教示よろしくお願いします。

  • マクロ処理後のファイル名変更について

    マクロでいくつかの処理を行った後、もとのファイル名に 「済+ファイル名」としてファイル名を変更して終了をしたいのですが、 どのようにすればできるのかわかりません。 どなたか教えていただけますか? イメージ) 処理前のファイル名:サラダ.xls、お肉.xls・・・ 処理後のファイル名:済サラダ.xls、済お肉.xls・・・ Dim myPath As String Dim myFile As String Dim w As Workbook Dim s As Worksheet myPath = ThisWorkbook.Path & "\" myFile = Dir(myPath & "*.xls") Do Until myFile = "" If myFile <> ThisWorkbook.Name Then Set w = Workbooks.Open(myPath & myFile) For Each s In w.Worksheets s.Range・・・・・     ・・・・・・・・     ・・・・・・・・ Next w.Close savechanges:=True End If myFile = Dir() Loop MsgBox "完了しました。" End Sub

  • excel マクロ PDF化の際のエラーについて

    エクセルブックを一括で名前をつけてpdfに変換するようなマクロを作ろうとして作ってみました。 基本は、マクロで印刷を一気に行う要領でpdfをアクティブプリンタに設定したのですが、見かけ上pdfファイルが作成されるものの、開くと破損していますとなってしまい、きちんとpdf化が出来ていないようです。 システムフォントを利用~のエラーは回避できたのですが、無理やりファイル名を指定しているせいでこのようになっているのでしょうか。 お手数ですがアドバイスをお願いします。 マクロの記録ではアクティブプリンタを指定して、プリントアウトというものしか記録されないので、プリントアウトのところが何か間違っているとは思うのですが・・・ 以下コードです。 Sub PrtPDF() Dim MyFile As String, MyPath As String Dim wb As Object Dim fn As String If vbNo = MsgBox("フォルダ内のブックの一括印刷を行いますか?", vbYesNo) Then GoTo CloseFile Dim bookname1 As String bookname1 = "Conv.xls" MyPath = ThisWorkbook.Path & "\" '自分のパスを取得 MyFile = Dir(MyPath & "*.xls", vbNormal) 'パス内のxlsファイル If LCase(MyFile) = LCase(bookname1) Then MyFile = Dir 'MyFileとbookname1が同じファイルの場合スキップする Do Until MyFile = "" '対象ファイルがなくなるまで Set wb = Workbooks.Open(MyPath & "\" & MyFile) '選択したファイルを開く fn = MyPath & "PDF\" & Range("J4").Value & ".pdf" 'アクティブシートを印刷する。 Application.ActivePrinter = "Adobe PDF on Ne07:" ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, PrtoFileName:=fn 'アクティブブックを閉じる。 ActiveWorkbook.Close MyFile = Dir '次のファイルを検索 If LCase(MyFile) = LCase(bookname1) Then MyFile = Dir 'MyFileとbookname1が同じファイルの場合スキップする Set wb = Nothing Loop '繰り返し GoTo ProcessEnd CloseFile: ActiveWorkbook.Close MsgBox "処理を中止しました。" Exit Sub ProcessEnd: MsgBox "処理が終了しました" End Sub

  • 一部マクロを変更したいので教えてください。

    現在、下記のようなマクロを使用しています。 Sub sample() Dim myFile As String, myPath As String, i As Long Application.ScreenUpdating = False myPath = InputBox("フルパスでフォルダーを指定") myFile = Dir(myPath & "\*.xls", vbNormal) Do Workbooks.Open myPath & "\" & myFile For i = 1 To ActiveWorkbook.Sheets.Count If WorksheetFunction.CountA(Sheets(i).Range("B7:B11")) = 0 Then Sheets(i).Range("B7") = "*" End If Next ActiveWorkbook.Close True myFile = Dir() Loop While myFile <> "" Application.ScreenUpdating = True MsgBox "完了 !!" End Sub 上から4行目のmyPath = InputBox("フルパスでフォルダーを指定")を パスを入力するマクロではなくてもっと簡単にフォルダを選択するマクロに変更したいのですが どうすればいいですか?

  • VBA 探しているFileがないときの処理方法

    現在、下記のようにしてマクロ実行ブックと同じ階層のフォルダ名を取得してAに、フォルダ内のabc.XLSのC9の値をBに、abc.XLSの更新日時をCに表示させています。 このとき、フォルダ内にabc.XLSが無い場合にファイル名をAに書き出してB及びCは空白というように表示したいのですが、どのようにすればよろしいでしょうか。 macro1は以前質問させて頂いたものがベースになっています。ExecuteExcel4Macroを使っている関係でファイル名が無いときの処理はDirを使ってできるとmougで調べてわかりましたが、自分の知識ではできず、macro2を作成したのですが、指定ファイルがない場合の処理がうまくできずにいます。 macro1はファイルオープンの窓が開きます。macro2はファイルが存在しないという窓が開きます。 どちらの場合でもかまいませんのでお力をお貸し頂けませんでしょうか。 Sub macro1() Dim myPath As String Dim myFolder As String Dim r As Long r = 3 myPath = ThisWorkbook.Path & "\" myFolder = Dir(myPath, vbDirectory) myBook = "abc.XLS" Application.ScreenUpdating = False Range("A3:C60").Clear Do Until myFolder = "" If myFolder <> "." And myFolder <> ".." Then If (GetAttr(myPath & myFolder) And vbDirectory) = vbDirectory Then Cells(r, 1) = myFolder Cells(r, 2).Value = ExecuteExcel4Macro("'" & myPath & myFolder & "\[" & myBook & "]Sheet1 '!R9C3") On Error Resume Next Cells(r, 3) = FileDateTime(myPath & myFolder & "\" & myBook) On Error GoTo 0 If Cells(r, 3) = "" Then Cells(r, 2) = "myBook" End If Cells(r, 2).NumberFormatLocal = "#,##0_ " Cells(r, 3).NumberFormatLocal = "y""年""m""月""" With Range("A3:C60") .Sort Key1:=Range("C3"), Order1:=xlAscending .Borders.LineStyle = True End With r = r + 1 End If End If myFolder = Dir() Loop Application.ScreenUpdating = True End Sub Sub Macro2() Dim myPath As String Dim myFolder As String Dim myBook As String myPath = ThisWorkbook.Path & "\" myFolder = Dir(myPath, vbDirectory) myBook = "abc.XLS" i = 2 Do Until myFolder = "" If myFolder <> "." And myFolder <> ".." Then If (GetAttr(myPath & myFolder) And vbDirectory) = vbDirectory Then Workbooks.Open (myPath & myFolder & "\" & myBook) Range("C9").Activate Selection.Copy ThisWorkbook.Activate Cells(i, 1) = myFolder Cells(i, 2).PasteSpecial xlValues Cells(i, 3) = FileDateTime(myPath & myFolder & "\" & myBook) Workbooks(myBook).Close SaveChanges:=False i = i + 1 End If End If myFolder = Dir() Loop End Sub

  • VBAでブック名の拡張子を除去してシートにコピー

    VBA初心者でコード作成で困っております。 下記の通りコードを組みましたが、シート名をブック名に変更して 保存したいのですが、このコードですと拡張子までついてしまいます。 拡張子を除去するためにはどうすればよいでしょうか? アドバイス宜しくお願い致します。 Sub test() 'シート名の変更 Dim MyPath As String Dim MyFile As String Dim Wb As Workbook MyPath = "C:\TEST\" MyFile = Dir(MyPath & "*.xlsx") Do While MyFile <> "" Set Wb = Workbooks.Open(MyPath & MyFile) ActiveSheet.Name = ActiveWorkbook.Name Application.DisplayAlerts = False Wb.Save Application.DisplayAlerts = True Wb.Close (False) MyFile = Dir() Loop End Sub

専門家に質問してみよう