
お世話になります。同内容で質問済ですが、私の力不足で教えて頂いたソースコードでエラーを回避することができず(ご回答者様大変申し訳ございません!!)、急ぎでツールを作らな得ればいけない関係上、自分で読解可能な使えそうなソースコードを拾いました。(以下がそのコード ★箇所アレンジ済エラー中)
見出しがマージされているためか、データ範囲の指定がうまくできません。
また、このソースは1シートしかない前提なのですが、これを複数シートでシートごとにマージするようにアレンジする場合は、どのように書き足せばよいでしょうか?
やりたいこと
ユーザーにフォルダを指定してもらいそのフォルダ内のブックをシートごとに統合する
(フォルダ指定のソースコードは完成しております。)
シートは7つ1つは統合不要で、残り6つのシートのデータをマージしたいです。
シート見出しが1-3行が不規則にマージされております。列のマージはありません。(画像添付)
列はALまであります。
レコードが存在するはいつもA4からはじまり、行に抜けはありません。
レコードが0の場合もあります。
1つのブックの1つのシートの最大レコード数はあっても1000くらいです
ファイルはすべて.xlsxです。
Sub データ処理()
Dim matomesh As Worksheet, scorewb As Workbook
Set matomesh = Worksheets("まとめ")
Dim fileName As String
fileName = Dir(ThisWorkbook.Path & "\*.xlsx")
If fileName <> "" Then
Dim sh As Worksheet
Dim lastrow As Long
Dim rng As Range
lastrow = matomesh.Cells(Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False
Do
Set scorewb = Workbooks.Open(fileName:=ThisWorkbook.Path & "\" & fileName)
Set sh = scorewb.Worksheets("sheet1")
Set rng = sh.Range("A1").CurrentRegion.Offset(3, 0).Resize(sh.Range("A1").CurrentRegion.Rows.Count - 3) '★1
lastrow = matomesh.Cells(Rows.Count, 1).End(xlUp).Row
rng.Copy matomesh.Cells(lastrow + 1, 1) '★2
scorewb.Close savechanges:=False
fileName = Dir()
Loop Until fileName = ""
Application.ScreenUpdating = False
Else
MsgBox "データがありません"
End If
End Sub

No.3ベストアンサー
- 回答日時:
そちらですね
一旦、sh.Range("A1").CurrentRegionをセットしてその大きさで操作すれば良さそう・・難しい回答ばかりで判らないと思いますので
エラーが出たら飛ばす・・なんて方法で期待通りの結果が得られるなら下記のようにすればOK?かな
Sub データ処理()
Dim matomesh As Worksheet, scorewb As Workbook
Set matomesh = Worksheets("まとめ")
Dim fileName As String
fileName = Dir(ThisWorkbook.Path & "\*.xlsx")
If fileName <> "" Then
Dim sh As Worksheet
Dim lastrow As Long
Dim rng As Range
lastrow = matomesh.Cells(Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False
Do
Set scorewb = Workbooks.Open(fileName:=ThisWorkbook.Path & "\" & fileName)
Set sh = scorewb.Worksheets(1)
On Error Resume Next
Set rng = sh.Range("A1").CurrentRegion.Offset(3, 0).Resize(sh.Range("A1").CurrentRegion.Rows.Count - 3) '★1
lastrow = matomesh.Cells(Rows.Count, 1).End(xlUp).Row
rng.Copy matomesh.Cells(lastrow + 1, 1) '★2
scorewb.Close savechanges:=False
Err.Number = 0
Set rng = Nothing
fileName = Dir()
Loop Until fileName = ""
Application.ScreenUpdating = False
Else
MsgBox "データがありません"
End If
End Sub
No.4
- 回答日時:
コピペで書いたので良く見ませんでした
Loop Until fileName = ""
Application.ScreenUpdating = False
は
Loop Until fileName = ""
Application.ScreenUpdating = True
ですね
No.2
- 回答日時:
こんにちは
ご説明の文章とコードの内容が必ずしも一致しているとは思えませんけれど、ひとまず、コードの方を正として考えました。
>★箇所アレンジ済エラー中
「Range("A1").CurrentRegion」で目的とするセル範囲を取得できるものと仮定します。
エラーが発生する時は、4行目以降にデータがない(あるいは4行目が空白など)ではないでしょうか?
無条件で、sh.Range("A1").CurrentRegion.Rows.Count - 3 を指定しているので、0行以下になるときにエラーになっているのではないかと想像します。
それを回避するなら、
Set rng = sh.Range("A1").CurrentRegion.Offset(3, 0)
Set rng = rng.Resize(Application.Max(rng.Rows.Count - 3, 1))
などとしておくことで、データがない時は空白1行分を設定することができます。
(以降の処理で、空白行をコピーすることにはなりますが・・)
あるいは、行数を判断して、データがない時には、コピー処理までをスキップする制御に変更するのでも良いと思います。
(こちらの方法の方が、本筋と言えるかもしれません)
No.1
- 回答日時:
こんにちは
エラー№は?
添付画像の場合、エラーは出そうもありませんが
A1セルを囲むセルが空白の場合、CurrentRegionは取得できないので
1004エラーが返るかと
もし、そのようなシート表組も対象にしなければならない場合は、
データー群の必ず値が存在するセルを指定します。
上3行見出しを不要とする場合、必ずなら良いですが、それも不確定であれば
確定要素を考え範囲を決めるようにすれば良いでしょう。
★1でエラーが発生しなければ★2は実行可能と思います。
A1セルを囲むセルが空白になっていない時でもエラーが発生するのなら
エラー番号と発生するシートの画像を表示すると判り易いかもです
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) 2つ目のコンボボックスが動作しません。 3 2023/03/25 12:29
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マクロOn Error GoTo ErrLabel...
-
if関数の順番 iserrorが認識さ...
-
VBA 空白行の削除
-
VBAでfunctionを利用しようとし...
-
OpenOffice Basicで簡単な関数...
-
UserForm1.Showでエラーになり...
-
On Error GoTo でエラーが発生...
-
ApplicationとWorksheetFunctio...
-
現在、HP作成業者さんがつく...
-
ExcelにSQLの結果を表示
-
WindowsのプロダクトIDを取得す...
-
検索Find処理を2重、3重とす...
-
インポート時のエラー「データ...
-
EnableWindow()後のGetLastError()
-
オブジェクト型の変数にフォー...
-
VBA データ(特定値)のある最...
-
実行時エラー'1004'の詳細と回...
-
VBA変数をFunction.VLookupの戻...
-
条件式について
-
エクセルVBAの二重ループについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
String""から型'Double'への変...
-
【VBA】ワークブックを開く時に...
-
文字列内で括弧を使うには
-
マクロで"#N/A"のエラー行を削...
-
Excel vbaについての質問
-
VBA データ(特定値)のある最...
-
On ErrorでエラーNoが0
-
ApplicationとWorksheetFunctio...
-
【Access】Excelインポート時に...
-
インポート時のエラー「データ...
-
実行時エラー 438 の解決策をお...
-
オブジェクト型の変数にフォー...
-
.VBSだとADODBのプロバイダが見...
-
実行時エラー'-2147467259(8000...
-
【VB.NET】 パワポ操作を非表示で
-
フランスの生年月日(jj/mm/aaaa)
-
【VBAエラー】Nextに対するFor...
おすすめ情報
上記ソースコードの拾い先 YouTubeです
「エクセル VBA 57 複数ブックデータを一つにまとめる処理について詳しく解説します! Dir関数についても説明あり。」