- 締切済み
VBAがとまります。
フォルダ内の全てのエクセルデータを一つにまとめたいのですが、 下記を実行すると、『実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです。』のメッセージが出て先に進みません。対象のデータを開いて実行しても同様でした。 調べましたがよくわかりませんので、ご教示いただけませんでしょうか。 基本的なところかもしれませんが、よくわかりません。 どうぞよろしくお願いいたします。 ------------------------------------------------------- 'プログラム1|プログラム開始 Sub GetExcelDataInFolder() 'プログラム2|シート設定 Dim ws1 As Worksheet Set ws1 = ThisWorkbook.Worksheets("Sheet1") 'プログラム3|FileSystemObjectの設定 Dim fs As FileSystemObject Set fs = New FileSystemObject 'プログラム4|対象フォルダを取得 Dim myfolder As Folder Set myfolder = fs.GetFolder(ThisWorkbook.Path) 'プログラム5|対象フォルダ内の全ファイルを処理 Dim myfile As File For Each myfile In myfolder.Files 'プログラム6|拡張子が「xlsx」のファイルのみを処理 If fs.GetExtensionName(myfile) = "xlsx" Then 'プログラム7|フォルダ内のエクセルを開いてシートを設定 Dim wb As Workbook Set wb = Workbooks.Open(Filename:=myfile) Dim ws2 As Worksheet Set ws2 = wb.Worksheets(1) 'プログラム8|開いたエクセルの最終行を取得 Dim cmax As Long cmax = ws2.Range("A65536").End(xlUp).Row Debug.Print myfile.Name & "のcmax=" & cmax 'プログラム9|開いたエクセルのデータを転記 Dim i As Long For i = 2 To cmax Dim cmax1 As Long cmax1 = ws1.Range("A65536").End(xlUp).Row ws1.Range("A" & cmax1 + 1 & ":E" & cmax1 + 1).Value = ws2.Range("A" & i & ":E" & i).Value Next 'プログラム10|エクセルを閉じる wb.Close 'プログラム11|オブジェクト解放 Set ws2 = Nothing Set wb = Nothing End If Next 'プログラム12|エクセルを保存 ThisWorkbook.Save 'プログラム13|オブジェクト解放 Set myfolder = Nothing Set fs = Nothing 'プログラム14|プログラム終了
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- HohoPapa
- ベストアンサー率65% (455/693)
何をしたいコードなのかがよくわからないまま答えています。 後記コードは、コードを読む限り 新たなブック(多くの場合book1.xlsx)を用意し そこに、 マクロ実行段階ですでに開いているブックのそれぞれのシートを調べ 1行目からA列に値の埋まている最終行までを この新たなブックに集めているようです。 そもそも、 やりたいことと、 提示し実行しているコードはかみ合っていますでしょうか? Sub bookmerge() Dim b As Workbook Dim b1 As Workbook Dim d As Long Dim d1 As Long Workbooks.Add Set b1 = ActiveWorkbook For Each b In Workbooks If b.Name <> b1.Name Then Dim i As Long For i = 1 To b.Worksheets.Count d = b.Worksheets(i).Range("a" & b.Worksheets(i).Rows.Count).End(xlUp).Row d1 = b1.Worksheets(1).Range("a" & Rows.Count).End(xlUp).Row b.Worksheets(i).Rows("1:" & d).Copy b1.Worksheets(1).Range("a" & d1 + 1) MsgBox b.Name & "/" & b.Worksheets(i).Name & "/" & d & "行目まで" Next End If Next End Sub
- HohoPapa
- ベストアンサー率65% (455/693)
画像に表示されているソースコードと 質問文に書き込まれたソースコードの関係がよくわかりません。 画像に表示されているソースコードでエラーが起きているように見えるので、 画像に表示されているソースコードを使い、 当方で再現テストしましたが、同じエラーになりません。 パット見、問題な箇所はなさそうに思いますし、 文法上の問題もないように思います。 ただ、 『実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです。』 のエラーが d = b.Worksheets(i).Range("a" & Rows.Count).End(xlUp).Row で起きるのであれば、 集計元ブックに、Rows.Count の数だけの行が無い可能性を疑います。 つまり、集計元ブックの行数が、1048576未満の可能性です。 集計元ブックがxlsのファイルということはありませんでしょうか。 もし、xls,xlsxが混在しているのであれば d = b.Worksheets(i).Range("a" & b.Worksheets(i).Rows.Count).End(xlUp).Row といったコードで回避できるかもしれません。 なお、 一般には、有効な最終行の行番号の取得は RANGEを使うのではなく、 Cells(Rows.Count, 1).End(xlUp).Row といったコードを使うのがポピュラーと思います。
補足
HohoPapa様 Qchan1962様 こんにちは。 いつもお世話になっております、お休みのところ失礼いたします。 『d = b.Worksheets(i).Range("a" & b.Worksheets(i).Rows.Count).End(xlUp).Row』ですと止まらず、book1のファイルが新規に作成され終了。 修正を方法がおわかりでしたら、ご教示ください。 月曜日以降でも大丈夫です。 どうぞ、よろしくお願いいたします。
補足
HohoPapa 様 お休みのところ、早速のご返信有り難うございました。 おっしゃる通りかも知れません。 今後は、整理をして問い合わせさせていただきます。 せっかく、ご協力いただいているにもかかわらず、申し訳ありませんでした。