1

ユーザーが参照番号のリストを列 A に貼り付けられるようにしたい空白のワークブックがあります。これらの参照番号の一部には、最後に「+」が付いています。

Sub texter1()
    With Sheets("texter")
    ll = .UsedRange.SpecialCells(xlCellTypeLastCell).Row
    For i = 1 To ll
      If InStr(1, .Range("a" & i).Value, "+", 1) Then
        .Range("b" & i).Formula = "=LEFT(A" & i & ", LEN(A" & i & ")-1)"
        .Range("c" & i).Value = Sheets("texter").Range("b" & i).Value
        .Range("d" & i).Formula = "=VLOOKUP($c" & i & ", _
            [Current_Master.xlsm]Master!$A$3:$BB$20000,14,FALSE)"
        .Range("e" & i).Formula = "=VLOOKUP($c" & i & ", _
            [Current_Master.xlsm]Master!$A$3:$BB$20000,15,FALSE)"
      Else
        Cells(i, "a").EntireRow.Delete
      End If
    Next i
    End With
End Sub

行全体を削除するには、「+」のない参照番号が必要です。「+」が付いた参照番号は正常に機能します。

これは機能しているようですが、「+」のないすべての行を削除するには、複数回実行する必要があり、その理由がわかりません。助けてください

ありがとうございました

4

1 に答える 1

1

繰り返しに影響する限り、ループ内の行を削除することはできません。これを想像してみてください。4 つの行があります。2 行目は条件を満たし、削除されます。次の繰り返しではカウンターは 3 ですが、行番号 3 は 4 行目です (行を削除すると、下のすべての行が 1 つ上がります)。したがって、行番号 3 は分析されません。したがって、解決策は簡単です。

Cells(i, "a").EntireRow.Clear()

行全体を実際に削除したい場合は、メインループの外でそれを行う必要があります。例: 削除するすべての行を配列に格納し、メイン ループの完了直後にこの配列を反復処理します。

別の代替手段は、メインループで逆の順序 (最大行から最小行) で反復を実行することですが、このオプションは常に適用できるわけではなく (あなたの場合は不明)、さらなる問題を引き起こす可能性があります。上記の 2 つのオプションで十分です。この最後の選択肢を、知っておく価値のあるものとして言及しました。

- - アップデート

メインループの後に行を削除するには、次の行で何かを使用できます。

'Declaration of variables
ReDim allRows(ll + 1) As Long
Dim allRowsCount As Long: allRowsCount = 0

メインループでは、指定された行を保存します(現在の場所Cells(i, "a").EntireRow.Delete):

For i = 1 To ll
'etc.

else
    allRowsCount = allRowsCount + 1
    allRows(allRowsCount) = i

ループが完了したら、格納されているすべての行を (逆の順序で) 調べて、それらを削除します。

If (allRowsCount > 0) Then

    Dim curRow As Long: curRow = allRowsCount + 1

    Do
        curRow = curRow - 1
        .Rows(allRows(curRow)).Delete
    Loop While (curRow > 1)

End If
End With
End Sub
于 2013-08-05T16:14:00.053 に答える