[英]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.