Excel VBA负IF条件
我们有一个公司macros,为我们清理数据 – 格式化和安排数据,但随着时间的推移,我们的数据集已经转移。 因此,这个macros现在给出了“误报”,因为它是我想要排除的,但是我不知道如何。 仔细阅读各种表格,我认为如果其他人可能会工作,但我似乎无法使其工作,我想知道它的一部分是因为事情是如此相似。
微距大致有15条线,与下面类似
If InStr(1, Cells(i, placementcol), "RES") Then Cells(i, sitecol) = "Resolution" If InStr(1, Cells(i, placementcol), "FBK") Then Cells(i, sitecol) = "Facebook" If InStr(1, Cells(i, placementcol), "ATH") Then Cells(i, sitecol) = "Authority"
问题是最后一个问题,包括“ATH”在内的词汇正在被挑选出来,并在不应该成为清洁数据集的时候变成“权威”。 我如何告诉macros忽略以“EATH”或其他我想排除的组合开头的placecol中的任何内容?
你可以添加额外的条件到你的If
语句。 你可以使用某种forms
If
你想要的条件
And
Not
你不想要的条件
And
Not
一些其他的情况,你不想…
Then
无论你想做什么。
例如:
If InStr(1, Cells(i, placementcol), "ATH") _ And InStr(1, Cells(i, placementcol), "EATH")<>1 Then Cells(i, sitecol) = "Authority" End If
(用_
来打破多行的陈述)。
在这种情况下, InStr(...)<>1
与Not (InStr(...)=1)
但写入时间更短。
编辑在@ Jeeped的问题上展开, InStr(1,...)
开始在第一个字符处search,但可能匹配任何地方。 例如, InStr(1,"foo","o")=2
。
- 如果你正在searchstring的任何地方,你可以删除
1,
,。 -
如果您只查看以给定文本开头的单元格值,请replace
If InStr(1, Cells(), "")
同
If InStr(Cells(), "")=1
顺便说一句,为了避免出现问题,请关注使用With
… .Cells()
而不是不合格的Cells
答案 。
编辑2
根据你的评论,我认为你正在寻找string的任何地方,而不只是在string的开始。 然后尝试这样的事情,为一个单一的条件:
Dim celltext As String celltext = CStr(Cells(i, placementcol).Value) If ( InStr(celltext, "ATH") >= 1 ) _ And ( InStr(celltext, "EATH") = 0 ) Then Cells(i, sitecol) = "Authority" End If
(对于其他If
语句,可以重复使用celltext
– celltext
不必重复Dim
和celltext=...
行。)
这有四点不同:
-
在每个testing周围使用括号来确保没有误解;
-
用
>= 1
检查ATH
,即在string中的某处; -
用
= 0
检查EATH
,即EATH
string中; 和 -
使用
celltext
来确保实际上有来自Cells(i, placementcol)
的真实文本结果Cells(i, placementcol)
而不是Null
或其他值。
我也拿出了领先的1,
s。
这里是如何“ Like
”VBA:
If Cells(i, placementcol) Like "*[A-DF-Z]ATH*" Then Cells(i, sitecol) = "Authority"
*
匹配任何0个或多个字符, [A-DF-Z]
匹配除E之外的任何字母,因此不会匹配包含EATH的string(除非它们包含多个ATH)
另外, ElseIf
可以用来忽略其余的检查:
If Cells(i, placementcol) Like "*FBK*" Then Cells(i, sitecol) = "Facebook" ElseIf Cells(i, placementcol) Like "*EATH*" Then ' ignore ElseIf Cells(i, placementcol) Like "*ATH*" And Then Cells(i, sitecol) = "Authority" End If