繁体   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