簡體   English   中英

如果語句有多個條件,如何解決

[英]If statement with multiple conditions, how to fix

我希望能夠解析工作表並根據其中一個單元格中的“注銷”條件刪除某些行。 訣竅是,它不可能是它的每個實例,而僅僅是下一行顯示“狀態”數組的一個參數的實例。 工作表的大約大小為4列,大約10000〜行。

Dim firstRow As Long
Dim nextRow As Long
Dim currentDate(1 To 5) As String
Dim totalDelete As Long
Dim p As Integer
Dim i As Integer
Dim status(1 To 5) As String

status(1) = "Available"
status(2) = "Email"
status(3) = "Available, No ACD"
status(4) = "Aux, Technical Issues"
status(5) = "Aux, Client Callback"

currentDate(1) = Sheets("Cover").Range("E12")
currentDate(2) = Sheets("Cover").Range("F12")
currentDate(3) = Sheets("Cover").Range("G12")
currentDate(4) = Sheets("Cover").Range("H12")
currentDate(5) = Sheets("Cover").Range("I12")

firstRow = 2
nextRow = 3
totalDelete = 0

For i = 1 To 5
    For p = 1 To 5

        Do While firstRow <= 10000
            If Cells(firstRow, "C") = "Logged Off" And Cells(nextRow, "C") = status(p) And Cells(nextRow, "B") = currentDate(i) Then
                Rows(firstRow).Delete
                totalDelete = totalDelete + 1

            Else
                firstRow = firstRow + 1
                nextRow = nextRow + 1
            End If

        Loop
        Debug.Print currentDate(p)
        Debug.Print status(p)

    Next p

Next i

Debug.Print totalDelete

現在,我期望它可以遍歷大約10000行並檢查我上面描述的內容。 它經過幾個循環來檢查我擁有的兩個數組中所有可能的日期和狀態。 我只是檢查代碼中的調試,以查看狀態和currentDate是否正確輸出。 這使我相信我的IF語句可能有問題。 但是,我並不是最擅長此事的人,所以我只是看不到我要去哪里錯了。

   A    |  B        |  C          |  D 

1 data  | 3/25/2019 | Logged Off  | data

2 data  | 3/25/2019 | Logged Off  | data

3 data  | 3/25/2019 | email       | data

4 data  | 3/25/2019 | email       | data

因此,運行代碼后,我希望它至少刪除第2行。

您的代碼中有幾個問題。

1)當您計划刪除循環中的行時,請向后工作。

想象一下,您擊中了第3行並且必須將其刪除( firstRow = 3 )。 刪除它,現在第4行是第3行,然后將firstRow迭代到4 本質上,跳過了WAS4行(現在是第3行)的行,並且不對其進行檢查。

代替

 FirstRow = 10000
 Do While firstRow >= 2 

並在每個循環中遞減firstrow

firstRow = firstRow - 1 

確保您不會從自己的下方拉地毯。 這可能會或可能不會解決您所看到的問題,但這是代碼中的確定錯誤。

2)你的循環在循環內

那是5 x 5 x 10000循環或250000循環。 那是非常進取的。 相反,只需循環10000次並進行如下測試:

If Cells(firstRow, "C") = "Logged Off" And inStr(1, Join(status, "|"), Cells(firstRow+ 1, "C").value, 1) And InStr(1, Join(currentDate, "|"), Cells(firstRow + 1, "B"), 1) Then

您可以使用Join()函數將數組轉換為由|分隔的單個字符串| 每個元素之間。 然后, Instr()測試以查看您的單元格值是否在該String中。 我們將Instr()的最后一個參數設置為1 ,以使其不區分大小寫。 10000個循環將更快。

3)您不需要nextRow變量 (盡管這只是挑剔,所以您可以忽略是否已結婚)。

而是使用Cells(firstRow + 1,“ C”)或Cells(firstRow,“ C”)。Offset(,1)進行檢查。 較少的變量以這種方式遞增和跟蹤。

這是重寫:

Dim firstRow As Long
Dim currentDate(1 To 5) As String
Dim totalDelete As Long
Dim status(1 To 5) As String

status(1) = "Available"
status(2) = "Email"
status(3) = "Available, No ACD"
status(4) = "Aux, Technical Issues"
status(5) = "Aux, Client Callback"

currentDate(1) = Sheets("Cover").Range("E12")
currentDate(2) = Sheets("Cover").Range("F12")
currentDate(3) = Sheets("Cover").Range("G12")
currentDate(4) = Sheets("Cover").Range("H12")
currentDate(5) = Sheets("Cover").Range("I12")

firstRow = 10000
totalDelete = 0


Do While firstRow >= 2
    If Cells(firstRow, "C") = "Logged Off" And inStr(1, Join(status, "|"), Cells(firstRow+ 1, "C").value, 1) And InStr(1, Join(currentDate, "|"), Cells(firstRow + 1, "B"), 1) Then
        Rows(firstRow).Delete
        totalDelete = totalDelete + 1                    
    End If
    firstRow = firstRow - 1  
Loop

Debug.Print totalDelete

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM