1

うまく機能するコードがいくつかありますが、私が持っているものよりもはるかにきれいに記述できることはわかっています。

Sub DeleteField()
Range("A6").Select

        Do
            If ActiveCell.Value = "Actual Conveyable Cases" Or _
            ActiveCell.Value = "Projected Non Con" Or _
            ActiveCell.Value = "Actual Non Con Cases" Or _
            ActiveCell.Value = "Projected CPT" Or _
            ActiveCell.Value = "Actual CPT" Or _
            ActiveCell.Value = "Projected Store Loads" Or _
            ActiveCell.Value = "Actual Store Loads" Or _
            ActiveCell.Value = "Projected Pull Ahead" Or _
            ActiveCell.Value = "Actual Pull Ahead" Or _
            ActiveCell.Value = "Projected Loads at 08:00" Or _
            ActiveCell.Value = "Actual Loads at 08:00" Then
        ActiveCell.EntireRow.Select
        Selection.Delete
        ActiveCell.Select
            Else: ActiveCell.Offset(1, 0).Select
        End If

    Loop Until ActiveCell.Value = "" And ActiveCell.Offset(-5, 0).Value = ""

MsgBox "Done!"

End Sub

複数の Or ステートメントをクリーンアップする方法を探しています。これを配列またはおそらく「ActiveCell」セグメントのすべてをクリーンアップする方法で達成できる方法はありますか

4

4 に答える 4

5

SELECT CASEステートメントを使用してそれをクリーンアップできます。

Select Case ActiveCell.Value 
    Case "Actual Conveyable Cases", "Projected Non Con", _
         "Actual Non Con Cases", "Projected CPT", "etc..."

            ActiveCell.EntireRow.Select
            Selection.Delete
            ActiveCell.Select

    Case Else

            ActiveCell.Offset(1, 0).Select

End Select
于 2012-12-04T14:08:14.123 に答える
1

これは私がそれをきれいにするためにこれをプログラムする方法です。それが役に立てば幸い。

また、条件を削除しました:ActiveCell.Offset(-5、0).Value = ""

5つの余分なセルを下に移動するのは奇妙に思えたので

Option Explicit

Public Sub DeleteField()
    Dim sh As Excel.Worksheet
    Dim iLastRow As Long, iFirstRow As Long, i As Long

    ' define the array here so we don't have to create it over
    ' and over again in the function toDelete()
    Dim list(11) As String
    list(0) = "Actual Conveyable Cases"
    list(1) = "Projected Non Con"
    list(2) = "Actual Non Con Cases"
    list(3) = "Projected CPT"
    list(4) = "Actual CPT"
    list(5) = "Projected Store Loads"
    list(6) = "Actual Store Loads"
    list(7) = "Projected Pull Ahead"
    list(8) = "Actual Pull Ahead"
    list(9) = "Projected Loads at 08:00"
    list(10) = "Actual Loads at 08:00"

    Set sh = ActiveSheet
    iFirstRow = 6
    iLastRow = sh.Cells(sh.Rows.Count, 1).End(xlUp).Row

    ' loop through the cells from bottom to top (because if we
    ' delete the row it's easier to maintain where we are)
    For i = iLastRow To iFirstRow Step -1
        If (toDelete(list, sh.Cells(i, 1))) Then
            sh.Cells(i, 1).EntireRow.Delete
        End If
    Next

    MsgBox "Done!"
End Sub

Private Function toDelete(ByRef list() As String, ByRef r As Excel.Range) As Boolean
    Dim i As Long
    For i = 0 To UBound(list)
        If (r.Value = list(i)) Then
            toDelete = True
            Exit Function
        End If
    Next i

    toDelete = False
End Function
于 2012-12-04T14:31:50.217 に答える
1

質問を見ると、複数の値に対する一致は次を使用して実行できます

Dim value As String
Dim matched As Boolean
Dim criteria As String

'** Put all possible strings separated by comma here
criteria = "Actual Conveyable Cases, Projected Non Con, Actual Non Con Cases"

do
   matched = (InStr(1, criteria, ActiveCell.Value) <> 0)

   If matched then

   End If
...

InStr条件文字列は、文字列が別の文字列に含まれていないため、関数は機能します。

つまり、上記は機能しません

criteria = "Actual Conveyable Cases, Actual Conveyable Cases 1, Actual Conveyable Cases 2"
于 2012-12-04T14:39:33.980 に答える
0

あなたが良い答えを持っていることは知っていますが、Dictionary オブジェクトのセールスマンとして、ここで Dictionary オブジェクトを使用することがいかに楽しいかを示す義務がありました。また、非常に高速に動作するため、条件の長いリストがある場合は、これが望ましい方法になる可能性があります. 楽しみ!

Sub DeleteField()

Dim dict As Object, i As Long
Set dict = CreateObject("scripting.dictionary")

dict.Add "Actual Conveyable Cases", 1
dict.Add "Projected Non Con", 1
dict.Add "Actual Non Con Cases", 1
dict.Add "Projected CPT", 1
dict.Add "Actual CPT", 1
dict.Add "Projected Store Loads", 1
dict.Add "Actual Store Loads", 1
dict.Add "Projected Pull Ahead", 1
dict.Add "Actual Pull Ahead", 1
dict.Add "Projected Loads at 08:00", 1
dict.Add "Actual Loads at 08:00", 1

For i = range("A" & Rows.count).End(xlUp).Row To 1 Step -1
    If dict.exists(range("A" & i).Value) Then
        Rows(i).Delete
        i = i + 1
    End If
Next

MsgBox "Done!"

End Sub
于 2012-12-05T08:20:09.137 に答える