標準モジュールマクロ動作について
office2010
excelのマクロにて、標準モジュールにて一括の場合と、分割されている場合で動作結果が変わります。
その原因が分からないので教えて頂きたく。
A2セルからR6セルまで、文字列データが入っています。
D列、F列のみ、不特定行が空欄ありです。
D列を検索し、○があったら、行ごと削除します。
C列の最終セルから2行上、1列右のセルを参照し、空欄だったら、A空欄あり
のメッセージ表示
E列の最終セルから2行上、1列右のセルを参照し、空欄だったら、B空欄あり
のメッセージ表示
マクロ実行前のデータで
D2セルが○、D3セルが○、
D4セルが空欄
F4セルが何かしらの文字列あり
でマクロを実行させると、
D2セルは空欄、
D4セルが何かしらの文字列あり
になります。
メッセージは、A空欄あり
のみとなるはずなのですが、
(1)の場合、A空欄あり、B空欄あり
と誤りになります。
(2)だとA空欄ありのみ表示されます。
何がおかしいのでしょうか?
なお、(1)を2回マクロ実行させると、2回目は、A空欄ありのみ表示です
(1)標準モジュール一括の場合
Sub SAKUJO()
'D列で○の非稼働日行を削除
Dim lastRow, r As Long
Dim v As Variant
'C列最終行の取得
lastRow = Cells(Rows.Count, 3).End(xlUp).Row
'D列を検索し、非稼働日(○)は行で削除
For Each v In Array("○")
For r = lastRow To 2 Step -1 'POINT!最終行から2行目へ
If InStr(Cells(r, 4).Value, v) <> 0 Then '指定セルの値が配列内のワードを含むかどうか
Rows(r).Delete '含む場合は行を削除
End If
Next r
Next v
'非稼働日を除き、今日から2日前が空欄だったら、メッセージ表示
If Cells(lastRow, 3).Offset(-2, 1) = "" Then
MsgBox "A空欄あり"
Else
End If
If Cells(lastRow, 5).Offset(-2, 1) = "" Then
MsgBox "B空欄あり"
Else
End If
End Sub
(2)標準モジュール分割の場合
Sub SAKUJO()
'D列で○の非稼働日行を削除
Dim lastRow, r As Long
Dim v As Variant
'C列最終行の取得
lastRow = Cells(Rows.Count, 3).End(xlUp).Row
'D列を検索し、非稼働日(○)は行で削除
For Each v In Array("○")
For r = lastRow To 2 Step -1 'POINT!最終行から2行目へ
If InStr(Cells(r, 4).Value, v) <> 0 Then '指定セルの値が配列内のワードを含むかどうか
Rows(r).Delete '含む場合は行を削除
End If
Next r
Next v
test
End Sub
Sub test()
'非稼働日を除き、今日から2日前が空欄だったら、メッセージ表示
Dim lastRow
' C列の最終行取得
lastRow = Cells(Rows.Count, 3).End(xlUp).Row
If Cells(lastRow, 3).Offset(-2, 1) = "" Then
MsgBox "A空欄あり"
Else
End If
If Cells(lastRow, 5).Offset(-2, 1) = "" Then
MsgBox "B空欄あり"
Else
End If
End Sub
お礼
ありがとうございます。おかげさまで、効率的なアルゴリズムによるコーディングができました。感謝いたします。