簡體   English   中英

如何在IF語句中使用AND

[英]How to use AND in IF Statement

我想查一下:

IF單元(i,“A”)包含文本'Miami' (i,“D”)包含文本' Florida'THEN將單元格(i,“C”)更改為BA。

Sub ABC()
Dim wsh As Worksheet, i As Long, lngEndRowInv As Long
Set wsh = ActiveSheet

i = 2
lngEndRowInv = wsh.Range("A" & wsh.Rows.Count).End(xlUp).Row
While i <= lngEndRowInv
    If Cells(i, "A") like "*Miami*" And Cells(i, "D") like "*Florida*" Then
        Cells(i, "C").Value = "BA"
    End If
    i = i + 1
Wend
End Sub

語法課程簡短

Cells(Row, Column)標識單元格。 行必須是1到您正在使用的Excel版本的最大值之間的整數。 列必須是標識符(例如:“A”,“IV”,“XFD”)或數字(例如:1,256,16384)

.Cells(Row, Column)標識在早期With語句中標識的工作表中的單元格:

With ActiveSheet
  :
  .Cells(Row,Column)
  :
End With

如果省略點,則Cells(Row,Column)位於活動工作表中。 所以wsh = ActiveWorkbook wsh.Range不是絕對必要的。 但是,我總是使用With語句,所以當我在六個月后返回我的代碼時,我不知道我的意思。 所以,我會寫:

With ActiveSheet
  :
  .Range.  
  :
End With

實際上,除非我真的希望代碼在活動工作表上工作,否則我不會寫上面的內容。 如果用戶在啟動宏時激活了錯誤的工作表,該怎么辦? 我會寫:

With Sheets("xxxx")
  :
  .Range.  
  :
End With

因為我的代碼僅適用於工作表xxxx。

Cells(Row,Column)標識單元格。 單元格(行,列).xxxx標識單元格的屬性。 Value是一種財產。 Value是默認屬性,因此您通常可以省略它,編譯器將知道您的意思。 但在某些情況下編譯器可能會混淆,因此包含.Value的建議是好的。

如果單元格是“邁阿密”,“南邁阿密”,“邁阿密,北方”或類似的單元格,那么Cells(Row,Column) like "*Miami*"將給出True。

如果單元格完全等於“邁阿密”,則單元Cells(Row,Column).Value = "Miami"將給出True。 例如,“邁阿密”將給予假。 如果您想接受MIAMI,請使用小寫功能:

Lcase(Cells(Row,Column).Value) = "miami"  

我的建議

當您嘗試不同的建議時,您的示例代碼會不斷變化 當我開始輸入時Cells(Row,Column) <> "Miami"您正在使用Cells(Row,Column) <> "Miami"

采用

If Cells(i, "A").Value like "*Miami*" And Cells(i, "D").Value like "*Florida*" Then
  Cells(i, "C").Value = "BA"

如果你想接受,例如,“南邁阿密”和“邁阿密,北”。

采用

If Cells(i, "A").Value = "Miami" And Cells(i, "D").Value like "Florida" Then
  Cells(i, "C").Value = "BA"

如果你想接受“邁阿密”和“佛羅里達”。

采用

If Lcase(Cells(i, "A").Value) = "miami" And _
   Lcase(Cells(i, "D").Value) = "florida" Then
  Cells(i, "C").Value = "BA"

如果你不關心案件。

如果問題中沒有拼寫錯誤,則說明條件錯誤:

你說的這個:

IF單元格(i,“A”)包含文本'Miami'

...但你的代碼說:

If Cells(i, "A") <> "Miami"

- > <>表示單元格的值不等於 “邁阿密”,因此您不會檢查您認為正在檢查的內容。

我想你想要這個:

If Cells(i, "A") like "*Miami*"

編輯:

對不起,但我真的無法幫助你。 正如我在評論中已經說過的那樣,我不是Excel VBA專家。
一般情況下我現在打開Excel和嘗試你的代碼自己,但我甚至不具備的Excel在家里(我使用OpenOffice)我的任何機器。

只是一個普遍的事情:你能識別出不起作用的行嗎?
也許這有助於其他人回答這個問題。

它是否曾執行(或至少嘗試執行) Cells(i, "C").Value = "BA"行?
或者If Cells(i, "A") like "*Miami*"這樣的If Cells(i, "A") like "*Miami*"已經False嗎?
如果是,請嘗試僅檢查一個單元格,看看是否有效。

如果您只是在字符串中尋找“邁阿密”或“佛羅里達”的出現(因為您在兩端都放了*),最好使用InStr函數而不是Like。 結果不僅更可預測,而且我相信你會獲得更好的表現。

此外,VBA沒有短路,因此當您使用AND關鍵字時,它將測試AND的兩側,無論第一次測試是否失敗。 在VBA中,在這些情況下使用2個if語句更為理想,如果您沒有找到“Miami”,則不會檢查“Florida”。

我的另一個建議是for-each循環比for循環更快。 使用.offset,您可以實現相同的目標,但效率更高。 當然,還有更好的方法(如變體數組),但這些方法會增加本例中不需要的復雜層。

以下是一些示例代碼:

Sub test()

Application.ScreenUpdating = False
Dim lastRow As Long
Dim cell As Range
lastRow = Range("A" & Rows.Count).End(xlUp).Row

For Each cell In Range("A1:A" & lastRow)
    If InStr(1, cell.Value, "Miami") <> 0 Then
        If InStr(1, cell.Offset(, 3).Value, "Florida") <> 0 Then
            cell.Offset(, 2).Value = "BA"
        End If
    End If
Next

Application.ScreenUpdating = True
End Sub

我希望你能找到一些有用的東西,並與VBA保持聯系! ^^

我認為你應該在IF語句中附加.value:

If Cells(i, "A").Value <> "Miami" And Cells(i, "D").Value <> "Florida" Then
    Cells(i, "C").Value = "BA"
End IF

暫無
暫無

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

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