アプリ版:「スタンプのみでお礼する」機能のリリースについて

Private Sub CommandButton1_Click()

'シート「物件情報」の3列目には「住所」が
'シート「西エリアの県」の1列目には「西エリアの府県」が
'書かれています。
'西エリアの府県の住所のある行を削除するコードを作成したのですが
'一部消したい行が残ってしまいます。
'どこがどのように間違っているのでしょうか
’0 < InStr は西エリアの府県の文字の位置が1以上なら、「その府県が含まれる」としています。

Dim sheet1 As Worksheet
Dim sheet2 As Worksheet
Dim i1 As Integer
Dim i2 As Integer

Set sheet1 = Worksheets("物件情報")
Set sheet2 = Worksheets("西エリアの県")

For i1 = 2 To sheet1.Cells(Rows.Count, 3).End(xlUp).Row
'住所が西エリアならその物件を削除する
For i2 = 2 To sheet2.Cells(Rows.Count, 1).End(xlUp).Row
If 0 < InStr(sheet1.Cells(i1, 3).Value, sheet2.Cells(i2, 1).Value) Then
sheet1.Rows(i1).Delete Shift:=xlUp
End If
Next
Next

End Sub

A 回答 (3件)

For i1 = 2 To sheet1.Cells(Rows.Count, 3).End(xlUp).Row



For i1 = sheet1.Cells(Rows.Count, 3).End(xlUp).row To 2 Step -1
に変えてください。行削除の場合は、下から上に向かって削除するのが鉄則です。
    • good
    • 0

こんばんは。



きっと、上から処理して消しているから。行を消すと1行全体的に上がる。
でも、for文では、消した行の事は考慮されていないため、1行上がっても
その行は、処理されずに更にその下を処理するから。だと思います。

For sheet1.Cells(Rows.Count, 3).End(xlUp).Row To 2 Step -1

の様に、下から処理するのが良いかと思います。
    • good
    • 0

こんばんは


ぱっと見で回答しますので違うかもですが
削除する側のループを最終行から廻すようにするのが、行削除の定石です
For i1 = sheet1.Cells(Rows.Count, 3).End(xlUp).Row To 2

行削除する場合、Rangeオブジェクト変数を使い、
対象行(rangeオブジェクト)をUnionで纏めて
ループ後に纏めて処理する方が処理が早く良いと思います
この場合、最終行からループする必要はありません。

サンプル
Set sheet1 = Worksheets("物件情報")
Set sheet2 = Worksheets("西エリアの県")

For i1 = 2 To sheet1.Cells(Rows.Count, 3).End(xlUp).Row
'住所が西エリアならその物件を削除する
For i2 = 2 To sheet2.Cells(Rows.Count, 1).End(xlUp).Row
If 0 < InStr(sheet1.Cells(i1, 3).Value, sheet2.Cells(i2, 1).Value) Then
If Rng Is Nothing Then
Set Rng = sheet1.Rows(i1)
Else
Set Rng = Union(Rng, sheet1.Rows(i1))
End If
End If
Next
Next
If Not Rng Is Nothing Then Rng.Delete Shift:=xlUp

条件設定に付いては未検証ですが、、
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!