- ベストアンサー
削除される行と、されない行があります
VBAで、もしD列とE列が同じ数字ならその行を削除、 という式を作りました。なお、D列が0より大きいときに その式を適用するようにしました。 なぜか、D列とE鉄が同じ場合は、きちんと削除されるのに、 ある行だけ削除されません。 理由がわかりませんでした。 どのようなことが考えられますか。 D列もE列も半角で数字が入っていました。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
適当な列に =D3=E3 と埋めることで 同じかどうか調べることができましょう。 この結果がFalseなら、もはやソースコードの問題ではないことになります。 また、表示形式を標準にすることで違いが見えてくるかもしれません。
その他の回答 (5)
- micnak
- ベストアンサー率60% (3/5)
文字列と数値での型が違っているか、見た目ではわからない文字が入っているかだと思います。以下をすべて貼り付けて Check() マクロを実行してみるとわかるかもしれません。 ============================== Sub Check() '以下のD9, E9の部分を目的のセルのアドレスに変更してから実行します。 CheckDifference Range("D9"), Range("E9") End Sub Sub CheckDifference(A As Range, B As Range) If A.Value = B.Value Then Debug.Print "同じ" Else Debug.Print "違う " & A.Address & "<>"; B.Address End If If VarType(A.Value) <> VarType(B.Value) Then Debug.Print "数値型、文字列などの型が違います。" Else Debug.Print "値が違います。" Debug.Print A.Address & " " & Codes(A.Value) Debug.Print B.Address & " " & Codes(B.Value) End If End Sub Function Codes(Text As String) As String Dim i As Long For i = 1 To Len(Text) Codes = Codes & i & ":" & AscW(Mid(Text, i, 1)) & " " Next End Function
- imogasi
- ベストアンサー率27% (4737/17069)
既に、回答者がおっしゃっているように、 原因の第1候補は (1)行削除する場合 (2)ForNextで上行から順次処理すると、行削除処理になると、コントロールが乱れるロジックになりやすい。 (2)の対策として最下行から1行ずつ上行を対象に処理をする、に改めてやって見たら。(要領的鉄則) ーー また数値・文字列などで、D,E列が全角・半角などの予想外データはないか。 >D列が0より大きいときにその式を適用するようにしました と文章で書かれてもどういう影響があるか、判らない。関係ないのでは。
- kon555
- ベストアンサー率51% (1842/3559)
>>見た目としては同じでした。 >>入っている数字を消して別の数字を入れなおすときちんと削除される この時点で、異常原因は入力内容にある事がほぼ確定したと考えていいでしょう。 見た目としては同じ、データとしては違う、というのはExcelではよくある事です。 セルの入力内容の型判定をすると、何かわかると思います。 https://xtech.nikkei.com/it/atcl/column/15/090100207/090100011/ >>入っている数字を消して〜何かVBA特有の事情でも 既にこうした検証をして何らかの仮説を考えているなら、それらを明記した質問を行った方が適切な回答が得られる確率が上がりますので、今後何か質問する際には意識してみて下さい。
- HohoPapa
- ベストアンサー率65% (455/693)
問題のコードが掲示されないとシャープなコメントができませんが、 もし、以下のコード Sub ngCode() Dim r As Long For r = 1 To 5 If Cells(r, 4).Value = Cells(r, 5) Then Rows(r).Delete Shift:=xlUp End If Next r End Sub の場合、 行を削除することで、進行中の行番号が変化してしまい 検査する行に漏れが起きます。 削除する場合は、以下のように 最下行から上方向に処理するのが鉄則です。 Sub okCode() Dim r As Long For r = 5 To 1 Step -1 If Cells(r, 4).Value = Cells(r, 5) Then Rows(r).Delete Shift:=xlUp End If Next r End Sub
- kon555
- ベストアンサー率51% (1842/3559)
具体的なコードが分からないので間違っている可能性もありますが、個人的な経験からすると『D列とE列が同じ内容じゃない』が濃厚だと思います。 Excelはデータの入力内容と見た目が違ったりする事がよくありますので、そのパターンではないかと。 ただ、まずはVBAのステップ実行を行い、「条件判定が上手くいっていない」のか「行の削除が上手くいっていない」のか確認してみることをお勧めします。 今回の事例に限らず『VBAで思ったように動かない』という時には、どこの処理で失敗しているのか特定するのが最初の一歩です。 https://www.239-programing.com/excel-vba/basic/basic023.html
お礼
有難うございます。 私もその可能性も考えました。 ただ、見た目としては同じでした。 入っている数字を消して別の数字を入れなおすと きちんと削除されるので特定の数字は削除対象に ならない、など何かVBA特有の事情でもあるのかな と感じたりもしました。
お礼
有難うございます。 おそらく、削除による行番号の変化などは 原因ではないと思いました。