[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBA全体実行をすると途中で止まってしまう』(ピノ)
いつもお世話になっております。
VBAでステップ実行をすると、処理ができるのに、
全体実行をすると、途中で処理が終わってしまいます。
エラーメッセージは何もでません。
詳細は、下部に全構文を記載させていただきました。
以下1までは処理ができていて、
2の検索ループ以降処理ができなくなってしまいます。
要因とがわかれば教えていただけたら助かります。
1
Range("AB:AB").Copy
Range("AB:AB").PasteSpecial Paste:=xlPasteValues
2
'▼3行目〜最終行目に#N/Aがあった場合に該当行の4列目を黄色塗り
Dim rngFind As Range
Dim fAddress As String
Set rngFind = Range("AB3:AB" & i).Find(what:="#N/A", _
LookIn:=xlValues, _
lookat:=xlPart, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlNext, _
MatchCase:=False, _
MatchByte:=False)
'見つからなかったら ※見つかったら…If Not rngFind Is Nothing Then
If rngFind Is Nothing Then
<全文>
Sub テータ加工2_05()
Application.DisplayAlerts = False
'On Error Resume Next
'<<<<<冷凍・チルドデータをドッキング>>>>>
Workbooks("5_完成(05_冷凍).xlsx").Activate
'コピー_チルドデータを範囲コピー(可変)
With Workbooks("5_完成(05_チルド).xlsx").Worksheets(1)
'A1の1つ下行A2から最後のセルまでを範囲コピー
.Range("A2", .Cells.SpecialCells(xlCellTypeLastCell)).Offset(1).Copy
End With
'貼付け_冷凍データ最終行に貼付け
Workbooks("5_完成(05_冷凍).xlsx").Activate
'A列最終行の1つ下行を選択→貼付け
With Cells(Rows.Count, 1).End(xlUp)
.Offset(1, 0).Select
End With
ActiveSheet.Paste
Range("A1").Select
'▼別名保存
Const MyPath As String = "C:\Users\mi\Desktop\C026_週間発注表作成\1_営業確認用"
'保存しないで閉じる
Workbooks("5_完成(05_チルド).xlsx").Close False
Dim 開始日 As String, 終了日 As String
'週間発注日付をファイル名に設定
開始日 = Format(Date + 2, "yyyymmdd")
終了日 = Format(Date + 8, "yyyymmdd")
ActiveWorkbook.SaveAs Filename:=MyPath & "\" & 開始日 & "-" & 終了日 & "週間発注表(05).xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
'一時ファイルを開く
Workbooks.Open Filename:="C:\Users\mi\Desktop\C026_週間発注表作成\4_RPA作業用\一時ファイル.xlsx"
Dim 一時ファイル As Workbook
Set 一時ファイル = ActiveWorkbook
'<<<<新規商品が無いか確認>>>
'▼1週間前のファイルを開く
Const BackPath As String = "C:\Users\mi\Desktop\C026_週間発注表作成\1_営業確認用\バックナンバー"
Dim 開始日1 As String, 終了日1 As String
開始日1 = Format(Date - 5, "yyyymmdd")
終了日1 = Format(Date + 1, "yyyymmdd")
Workbooks.Open Filename:=BackPath & "\" & 開始日1 & "-" & 終了日1 & "週間発注表(05).xlsx"
Columns("A:B").Copy
一時ファイル.Worksheets(1).Paste
'保存しないで閉じる
Workbooks(開始日1 & "-" & 終了日1 & "週間発注表(05).xlsx").Close False
'▼2週間前のファイルを開く
Dim 開始日2 As String, 終了日2 As String
開始日2 = Format(Date - 12, "yyyymmdd")
終了日2 = Format(Date - 6, "yyyymmdd")
Workbooks.Open Filename:=BackPath & "\" & 開始日2 & "-" & 終了日2 & "週間発注表(05).xlsx"
i = Cells(Rows.Count, 1).End(xlUp).Row
Range("A3:B" & i).Copy
'最終行の1行下に貼付け
一時ファイル.Activate
With Cells(Rows.Count, 1).End(xlUp)
.Offset(1, 0).Select
End With
ActiveSheet.Paste
'保存しないで閉じる
Workbooks(開始日2 & "-" & 終了日2 & "週間発注表(05).xlsx").Close False
'▼3週間前のファイルを開く
Dim 開始日3 As String, 終了日3 As String
開始日3 = Format(Date - 19, "yyyymmdd")
終了日3 = Format(Date - 13, "yyyymmdd")
Workbooks.Open Filename:=BackPath & "\" & 開始日3 & "-" & 終了日3 & "週間発注表(05).xlsx"
i = Cells(Rows.Count, 1).End(xlUp).Row
Range("A3:B" & i).Copy
'最終行の1行下に貼付け
一時ファイル.Activate
With Cells(Rows.Count, 1).End(xlUp)
.Offset(1, 0).Select
End With
ActiveSheet.Paste
'保存しないで閉じる
Workbooks(開始日3 & "-" & 終了日3 & "週間発注表(05).xlsx").Close False
'▼4週間前のファイルを開く
Dim 開始日4 As String, 終了日4 As String
開始日4 = Format(Date - 26, "yyyymmdd")
終了日4 = Format(Date - 20, "yyyymmdd")
Workbooks.Open Filename:=BackPath & "\" & 開始日4 & "-" & 終了日4 & "週間発注表(05).xlsx"
i = Cells(Rows.Count, 1).End(xlUp).Row
Range("A3:B" & i).Copy
'最終行の1行下に貼付け
一時ファイル.Activate
With Cells(Rows.Count, 1).End(xlUp)
.Offset(1, 0).Select
End With
ActiveSheet.Paste
'保存しないで閉じる
Workbooks(開始日4 & "-" & 終了日4 & "週間発注表(05).xlsx").Close False
Workbooks(開始日 & "-" & 終了日 & "週間発注表(05).xlsx").Activate
i = Cells(Rows.Count, 1).End(xlUp).Row
'▼VLOOKUP
Range("AB3") = "=VLOOKUP(B3,'[一時ファイル.xlsx]Sheet1'!B:B,1,0)"
'フィルダウン
Range("AB3:AB" & i).FillDown
'値貼り付け
Range("AB:AB").Copy
Range("AB:AB").PasteSpecial Paste:=xlPasteValues
'▼3行目〜最終行目に#N/Aがあった場合に該当行の4列目を黄色塗り
Dim rngFind As Range
Dim fAddress As String
Set rngFind = Range("AB3:AB" & i).Find(what:="#N/A", _
LookIn:=xlValues, _
lookat:=xlPart, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlNext, _
MatchCase:=False, _
MatchByte:=False)
'見つからなかったら ※見つかったら…If Not rngFind Is Nothing Then
If rngFind Is Nothing Then
Exit Sub
Else
'見つかったら
If Not rngFind Is Nothing Then
rngFind.Offset(, -24).Interior.ColorIndex = 6
End If
fAddress = rngFind.Address
Do
rngFind.Offset(, -24).Interior.ColorIndex = 6
Set rngFind = Range("AB3:AB" & i).FindNext(rngFind)
If rngFind Is Nothing Then Exit Do
Loop While fAddress <> rngFind.Address
End If
'AB列クリア
Range("AB3:AB" & i).Clear
'不要倉庫列削除
Columns("U:V").Delete
'<<<<<最終保存して閉じる>>>>>
Workbooks(開始日 & "-" & 終了日 & "週間発注表(05).xlsx").Close True
'保存しないで閉じる
一時ファイル.Close False
End Sub
< 使用 Excel:Excel2016、使用 OS:Windows10 >
エラーが無かったから、単純に抜けちゃってるだけではないですか?
> '見つからなかったら ※見つかったら…If Not rngFind Is Nothing Then > If rngFind Is Nothing Then > Exit Sub ~~~~~~~~~
(稲葉) 2020/08/08(土) 16:17
少しコードまとめてみました。 テスト環境が無いのでテストまではしておりませんが、少し眺めてみてください。 テストする場合は、バックアップを取ってから試してみてください。
Sub テータ加工2_05()
'On Error Resume Next
'週間発注日付をファイル名に設定
Const MyPath As String = "C:\Users\mi\Desktop\C026_週間発注表作成\1_営業確認用" '今週のブックの保存先
Const BackPath As String = "C:\Users\mi\Desktop\C026_週間発注表作成\1_営業確認用\バックナンバー"
Dim チルドブック As Workbook
Dim 今週のブック As Workbook
Dim 一時ファイル As Workbook
Dim 開始日 As String, 終了日 As String '週間発注保存用
Dim i As Long
Dim rngFind As Range '#N/A検索用
Dim fAddress As String '#N/A検索ループ用
Dim n日前 As Long 'n週間前のループ用
Dim BNファイル名 As String 'バックナンバーのファイル名
Application.DisplayAlerts = False
'//冷凍・チルドデータをドッキング// ここから
'コピー_チルドデータを範囲コピー(可変)
Set チルドブック = Workbooks("5_完成(05_チルド).xlsx")
With チルドブック.Sheets(1)
'A1の1つ下行A2から最後のセルまでを範囲コピー
.Range("A2", .Cells.SpecialCells(xlCellTypeLastCell)).Offset(1).Copy
End With
'A列最終行の1つ下行を選択→貼付け
'★シート名を指定したほうが良いかと。
With Workbooks("5_完成(05_冷凍).xlsx")
.Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial xlAll
'~~~~~~~↑~~~~~~~~
'★アクティブワークブック・シートだと曖昧なので、ブックとシートは明記する
開始日 = Format$(Date + 2, "yyyymmdd")
終了日 = Format$(Date + 8, "yyyymmdd")
.SaveAs Filename:=MyPath & "\" & 開始日 & "-" & 終了日 & "週間発注表(05).xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
Set 今週のブック = Workbooks(.Name)
End With
'保存しないで閉じる
チルドブック.Close False
'//冷凍・チルドデータをドッキング// ここまで
'//新規商品が無いか確認// ここから
'一時ファイルを開く
Set 一時ファイル = Workbooks.Open(Filename:="C:\Users\mi\Desktop\C026_週間発注表作成\4_RPA作業用\一時ファイル.xlsx")
For n日前 = 1 To -20 Step -7
BNファイル名 = BackPath & "\" & Format$(Date - n日前 - 6, "yyyymmdd") & "-" & Format$(Date - n日前, "yyyymmdd") & "週間発注表(05).xlsx"
'▼1週間前のファイルを開く
With Workbooks.Open(BNファイル名, ReadOnly:=True)
With Sheets(1)
If n日前 = 1 Then
'1週間前なら、AB列をコピー
.Columns("A:B").Copy 一時ファイル.Sheets(1)
Else
'2週間前以前なら、最終行を一時ファイルにコピー
.Range("A3:B" & .Cells(Rows.Count, 1).End(xlUp).Row).Copy
'最終行の1行下に貼付け
With 一時ファイル.Sheets(1)
.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial xlAll
End With
End If
End With
'保存しないで閉じる
.Close False
End With
Next n日前
With 今週のブック
With .Sheets(1) 'シートを明記
i = .Cells(Rows.Count, 1).End(xlUp).Row
'▼VLOOKUP
.Range("AB3:AB" & i).Formula = "=VLOOKUP(B3,'[一時ファイル.xlsx]Sheet1'!B:B,1,0)"
'値貼り付け
.Range("AB3:AB" & i).Value = .Range("AB3:AB" & i).Value
'▼3行目〜最終行目に#N/Aがあった場合に該当行の4列目を黄色塗り
Set rngFind = .Range("AB3:AB" & i).Find(what:="#N/A", _
LookIn:=xlValues, _
lookat:=xlPart, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlNext, _
MatchCase:=False, _
MatchByte:=False)
If rngFind Is Nothing Then
'見つからなかったら何もしない
'Exit Sub
Else
'見つかったら
rngFind.Offset(, -24).Interior.ColorIndex = 6
fAddress = rngFind.Address
Do
rngFind.Offset(, -24).Interior.ColorIndex = 6
Set rngFind = .Range("AB3:AB" & i).FindNext(rngFind)
If rngFind Is Nothing Then Exit Do
Loop While fAddress <> rngFind.Address
End If
'AB列クリア
.Range("AB3:AB" & i).Clear
'不要倉庫列削除
.Columns("U:V").Delete
End With
一時ファイル.Close False
.Close True
End With
'//新規商品が無いか確認// ここまで
Application.DisplayAlerts = True
End Sub
(稲葉) 2020/08/08(土) 17:19
訂正
>.Columns("A:B").Copy 一時ファイル.Sheets(1)
.Columns("A:B").Copy
一時ファイル.Sheets(1).Paste
(稲葉) 2020/08/08(土) 17:21
構文までまとめて頂き、大変有難う御座います…。
自分でも不要な構文書いてる気がする…と思いながら、短縮の方法がわからなかったので、そのままにしていました。
いただいた構文で、勉強させていただきます!
本当に有難うございます!
(ピノ) 2020/08/08(土) 17:47
最後の一文は現状のコードにもいれておいた方がいいです Application.DisplayAlerts = True Falseのままエクセル使っていると、閉じたときの「保存しますか?」 のようなダイヤログも出なくなっちゃいます (稲葉) 2020/08/08(土) 18:26
また、纏めていただいた構文を確認させてもらっていますが、
コメントの書き方や過去ファイルをForでループさせる方法、とても勉強になりました。
色々とありがとうございます。
(ピノ) 2020/08/08(土) 18:37
■1
>見つからなかったら…の後のExit Sub がいらなかったんですね!!
ステップ実行をしているなら、原因自体はご自身で確認できたのではないでしょうか?
また、本当に"何もしない"(プロシージャを抜けることもしない)のであれば、そもそも記述しなくてよいでしょう。
Sub 実験1()
Stop
Dim tmp As Range
If tmp Is Nothing Then
'なにもしない
Else
MsgBox "テキトー"
End If
End Sub
'-------------------------------------------
Sub 実験2()
Stop
Dim tmp As Range
If Not tmp Is Nothing Then
MsgBox "テキトー"
End If
End Sub
■2
[[20200806235620]]の時にも思いましたが、本当に「本日」(マクロを実行した日)でよいのですか?
週間発注表なんて書いてあるところから想像するに、1週間単位の処理じゃないんでしょうか。
休日なんかで、締め日?にマクロを実行できない場合に困ったことになりませんか?
私が作るなら処理日を別途入力するなり、マクロを実行した日がどの週に属するのか判定するなどの処理を入れると思います。
■3
コメントアウトしてますが、冒頭の「On Error Resume Next」は何用ですか?
エラーが発生するからよくわからないけど飛ばしてました〜なんてことであれば、やめたほうがいいです。
"一知的に"エラーを無視したい場合は、その部分に記述すべきです。
■4
(1) VLOOKUPを使った数式を書き込む (2) 値貼り付けをする (3) "#N/A"を検索する (4) 見つかったら塗りつぶしをする (5) 作業用に使ったセルをクリアする
↑の部分は、↓のようにしてもよいとおもいます。
(1) VLOOKUPを使った数式を書き込む (2) エラー値になっているセルがあれば、塗りつぶしをする (3) セルをクリアする
よって、こんな感じでもOKじゃないでしょうか(元コードが読みづらかったので稲葉さんが整理されたコードをベースにしています。)
With 今週のブック
With .Sheets(1) 'シートを明記
i = .Cells(Rows.Count, 1).End(xlUp).Row
With .Range("AB3:AB" & i)
'▼数式を書き込む
.Formula = "=VLOOKUP(B3,'[一時ファイル.xlsx]Sheet1'!B:B,1,0)"
'▼一時的にエラーを無視してから(エラー値がなかった時の対策)、エラー値になっているセルの色の塗りつぶし色を設定
On Error Resume Next
.SpecialCells(xlCellTypeFormulas, xlErrors).Offset(, -24).Interior.ColorIndex = 6
On Error GoTo 0
'▼クリアするなら値貼付けは要らない
.Clear
End With
End With
End With
■5
問題があるわけではないですが、↓についてどの環境でも必ず同じ色にはならないことは理解されておいたほうがよいです。
.Interior.ColorIndex = 6
【参考】
http://officetanaka.net/excel/vba/graph/24.htm
■6
コピーする部分についても、↓のような感じでもよいとおもいます。
(コメントつけましたが、タイプミスと思われる部分があったので直しています。正しければ元に戻してください)
Dim チルドブック As Workbook
Dim 今週のブック As Workbook
Dim コピー範囲 As Range
Set チルドブック = Workbooks("5_完成(05_チルド).xlsx")
Set 今週のブック = Workbooks("5_完成(05_冷凍).xlsx")
With チルドブック.Sheets(1)
'// Offset(1)はいつものタイプミスでは?「A"1"」だったら分かりますが・・・
Set コピー範囲 = .Range("A2", .Cells.SpecialCells(xlCellTypeLastCell))
End With
コピー範囲.Copy 今週のブック.Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Offset(1)
今週のブック.SaveAs _
Filename:=MyPath & "\" & Format$(Date + 2, "yyyymmdd") & "-" & Format$(Date + 8, "yyyymmdd") & "週間発注表(05).xlsx", _
FileFormat:=xlOpenXMLWorkbook
(もこな2 ) 2020/08/11(火) 03:21
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.