如何在IF语句中使用AND

时间:2012-02-04 10:51:45

标签: excel vba

我想查一下:

IF 单元格(i,“A”)包含文本'Miami' AND (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

4 个答案:

答案 0 :(得分:9)

简短的语法课程

Cells(Row, Column)标识一个单元格。行必须是1到您正在使用的Excel版本的最大值之间的整数。列必须是标识符(例如:&#34; A&#34;,&#34; IV&#34;,&#34; XFD&#34;)或数字(例如:1,256,16384)< / p>

.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*"如果该单元格是&#34;迈阿密&#34;,&#34;南迈阿密&#34;,&#34;迈阿密,北部&#34;或任何类似的东西。

如果单元格与#34;迈阿密&#34;完全相同,

Cells(Row,Column).Value = "Miami"将给出True。 &#34; MIAMI&#34;例如,将给出假。如果您想接受MIAMI,请使用小写字母功能:

Lcase(Cells(Row,Column).Value) = "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"

如果你想接受,例如,&#34;南迈阿密&#34;和#34;迈阿密,北部&#34;。

使用

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

如果你想接受,#34;迈阿密&#34;和&#34;佛罗里达&#34;。

使用

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

如果你不关心案件。

答案 1 :(得分:4)

如果问题中没有拼写错误,则说明条件错误:

你这样说:

  

IF cell(i,&#34; A&#34;)包含文字&#39; Miami&#39;

...但你的代码说:

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

- &GT; <>表示该单元格的值不等于&#34;迈阿密&#34;,因此您不会检查您认为自己正在检查的内容。

我想你想要这个:

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

修改

抱歉,但我无法为您提供更多帮助。正如我在评论中已经说过的那样,我没有Excel VBA专家 通常我会立即打开Excel并自己尝试代码,但我甚至不能在家里的任何机器上使用 Excel(我使用OpenOffice)。

只是一个普遍的事情:你能识别出不起作用的行吗? 也许这有助于其他人回答这个问题。

它是否曾执行(或至少尝试执行)Cells(i, "C").Value = "BA"行? 或If Cells(i, "A") like "*Miami*"内容已经False? 如果是,请尝试仅检查一个单元格,看看是否有效。

答案 2 :(得分:1)

如果您只是在字符串中查找“Miami”或“Florida”的出现(因为您在两端都放了*),最好使用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保持联系! ^^

答案 3 :(得分:0)

我认为你应该在IF语句中附加.value:

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