我想查一下:
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
答案 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;或任何类似的东西。
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