マクロ初心者で勉強中です。下記のようなマクロを書いたのですが、下に記載のところでエラーがでます。各シートの指定範囲(可変)をコピーし、集計シート貼りつけるマクロを作成しています。
どこが悪いのか教えて頂きたいです。
Sub matome公休105()
Dim i As Integer
Dim lRow As Long, lCol As Long, lRow2 As Long
Application.ScreenUpdating = False
'----全データシートの有無をチェックします
sh_check
'----列見出しをコピーします ’見出しの範囲を指定 どこにペーストするか指定
Worksheets(2).Range("I40:J40").Copy Worksheets(1).Range("A1")
For i = 2 To Worksheets.Count
With Worksheets(i)
'シート1の最終行を求める(最終行の次の行を求める)
lRow2 = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row + 1
Worksheets(i).Select
★★★「下記のところでエラーが出ます」★★★
Range("I42").CurrentRegion.Resize([MATCH(1,0/(I42:I50<>""))], 2).Select
'シート1の最終行の次に貼り付ける
Selection.Copy
Worksheets(1).Cells(lRow2, 1).PasteSpecial (xlPasteValues)
End With
Next i
Worksheets(1).Activate
Range("A1").Select
Application.ScreenUpdating = True
End Sub
下記のように単体でするとうまく動作します。
Sub test()
Worksheets("原本").Activate
Range("I42").CurrentRegion.Resize([MATCH(1,0/(I42:I50<>""))], 2).Select
End Sub
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
遅くなりました #2です
>エラー発生した時は、そのシートの処理はとばして次のシートに移るとしたらどうなるでしょうか。
On Error Resume Nextの場合、
Selection.Copy
Worksheets(1).Cells(lRow2, 1).PasteSpecial (xlPasteValues)
が実行されてしまいますね。(誤動作)
なので結局
On Error Resume Next
Range("I42").CurrentRegion.Resize([MATCH(1,0/(I42:I50<>""))], 2).Select
If Err.Number = 0 Then
Selection.Copy
Worksheets(1).Cells(lRow2, 1).PasteSpecial (xlPasteValues)
End If
On Error GoTo 0
End With
Next i
こんな感じになってしまいます。
#2のようにエラーでラベルに飛ばすのもエラーになっているか確かめて処理するにしても、内部的にはエラーが出力されている事には変わりませんね
なので[MATCH(1,0/(I42:I50<>""))]の代わりの処理を追加して
セルの拡張行数を取得するか、
MATCHのエラーの原因をあらかじめ調べてエラーが出る条件なら処理を
行わないようにする などが考えられます。
[MATCH(1,0/(I42:I50<>""))]の代わり テスト用
Sub a()
Dim n As Integer, cnt As Integer
'コピー範囲の最大数を取得
cnt = .Range("I42:I50").Cells.Count
'コピー範囲I42:I50に値があるか調べる
For n = 50 To 42 Step -1
If .Cells(n, "I") <> "" Then
Exit For '値が有ればforを抜ける
End If
cnt = cnt - 1 'ループごとにセル範囲を-1する
Next
MsgBox ("cnt =" & cnt & " MATCH =" & [MATCH(1,0/(I42:I50<>""))])
End Sub
この cnt を組み 不要部分を添削すると
Sub matome公休105()
Dim i As Integer
Dim lRow As Long, lCol As Long, lRow2 As Long
Dim n As Integer, cnt As Integer
Application.ScreenUpdating = False
'----全データシートの有無をチェックします
'sh_check
'----列見出しをコピーします ’見出しの範囲を指定 どこにペーストするか指定
Worksheets(2).Range("I40:J40").Copy Worksheets(1).Range("A1")
For i = 2 To Worksheets.Count
With Worksheets(i)
'シート1の最終行を求める(最終行の次の行を求める)
lRow2 = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row + 1
' Worksheets(i).Select これは Withで纏めているので無くて良いが
' Worksheets(i)に対してのレンジオブジェクトは . を加える(下記参照)
'コピー範囲の最大数を取得
cnt = .Range("I42:I50").Cells.Count
'コピー範囲()に値があるか調べる
For n = 50 To 42 Step -1
If .Cells(n, "I") <> "" Then
Exit For '値が有ればforを抜ける
End If
cnt = cnt - 1 'ループごとにセル範囲を-1する
Next
'すべて空白セルなら実行しない(セル範囲が0)
If cnt > 0 Then
'シート1の最終行の次に貼り付ける
.Range("I42").Resize(cnt, 2).Copy
Worksheets(1).Cells(lRow2, 1).PasteSpecial (xlPasteValues)
'最後のシートのコピー範囲に点々が残るので下記を追加
Application.CutCopyMode = False
End If
End With
Next i
Worksheets(1).Activate
Range("A1").Select
Application.ScreenUpdating = True
End Sub
.CurrentRegion リサイズしてしまうので要を足さないような・・?
'----全データシートの有無をチェックします
部分もあるかと思いますので先が長いのかもしれませんが、
参考になりますでしょうか。
No.2
- 回答日時:
こんばんは、
インデックス2以降のすべてのシートで
I42:I50セル範囲すべてが空白になっているシートはありませんか?
[MATCH(1,0/(I42:I50<>""))]は該当がない場合エラーが返りますので
エラートラップを配置するか、別の方法で範囲拡張数を取得する
必要があるように思います
簡単なエラートラップ
Worksheets(i).Select
On Error GoTo MyErr
★★★「下記のところでエラーが出ます」★★★
Range("I42").CurrentRegion.Resize([MATCH(1,0/(I42:I50<>""))], 2).Select
'シート1の最終行の次に貼り付ける
Selection.Copy
Worksheets(1).Cells(lRow2, 1).PasteSpecial (xlPasteValues)
Application.CutCopyMode = False
MyErr:
On Error GoTo 0
End With
エラートラップが嫌な場合、例えば
If Application.CountIf(Range("I42:I50"), "<>") > 0 Then
などで値の有無をあらかじめ検証して問題部分を実行するなどが考えられますが、セルの値が ""(数式セル)になっている場合、CountIf "<>"は通ってしまいますが、MATCHはエラーになると思われますので、対象セルに数式が入っている場合は、正しく""を取得する(除外する)方法などの検討が必要かと思います。
ありがとうございます。少し、分かってきたような気がします。エラー発生した時は、そのシートの処理はとばして次のシートに移るとしたらどうなるでしょうか。今、調べたらResume Next でしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 他のシートからコピーする下記マクロで貼付け位置をWorksheets(1).Range("A3")の 8 2023/01/30 18:48
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Excel(エクセル) vba 転記するときの最終行について 2 2022/09/03 09:31
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) Sheet1をフィルターで「りんご」を抽出し、Sheet2へ地域を貼り付ける下記マクロを変更して S 2 2022/12/11 03:01
- Visual Basic(VBA) Sheet3から2つの条件でオートフィルターで抽出した個数をSheet2へ入力するマクロで、一つ目の 4 2023/01/12 23:40
- Visual Basic(VBA) VBAが止まります。 1 2022/09/02 14:51
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マクロの「SaveAs」でエラーが...
-
VBA 空白行に転記する
-
VBA 別ブックからの転記の高速...
-
EXCELのSheet番号って変更でき...
-
マクロ実行後に別シートの残像...
-
VBAで変数の数/変数名を動的に...
-
ExcelVBAでDo Until loopのネス...
-
Changeイベントで複数セルへの...
-
VBA別シートの最終行の次行へ転...
-
VBA 実行時エラー1004 rangeメ...
-
VBA 重複チェック後に値をワー...
-
テキストボックスから、複数の...
-
vba 住所で判断して担当支店に...
-
GASでチェックボックスを一括of...
-
楽天RSSからエクセルVBAを使用...
-
ExcelのVBマクロを、バックグラ...
-
複数シートの複数列に入力され...
-
前回質問の続きになりますが、...
-
VBA Userformで一部別シートに...
-
VBAコードについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マクロの「SaveAs」でエラーが...
-
VBA 空白行に転記する
-
EXCELのSheet番号って変更でき...
-
マクロ実行後に別シートの残像...
-
VBA 別ブックからの転記の高速...
-
VBA別シートの最終行の次行へ転...
-
【VBA】特定の条件でセルをコピー
-
Count Ifのセルの範囲指定に変...
-
100万件越えCSVから条件を満た...
-
楽天RSSからエクセルVBAを使用...
-
VBAコードについて
-
Changeイベントで複数セルへの...
-
VBAで変数の数/変数名を動的に...
-
Excel2013で切り取り禁止
-
グラフマクロで系列を変数にす...
-
VBA 実行時エラー1004 rangeメ...
-
ExcelのVBマクロを、バックグラ...
-
Unionでの他のシートの参照につ...
-
Excel VBA オートフィルターで...
-
アクセスからエクセルへ出力時...
おすすめ情報