我们有一个公司宏可以为我们清理数据 - 格式化和排列数据,但随着时间的推移,我们的数据集已经发生了变化。因此,宏现在给出“误报”,因为它是我想要排除的,但我不确定如何。阅读表格,我认为如果Else可能有用,但我似乎无法让它工作,我想知道它的一部分是因为事情是如此相似。
Macro有大约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”的单词被选中并在不应该的时候更改为干净数据集中的“权限”。如何告诉宏忽略以“EATH”或我想要排除的其他组合开头的placementcol中的任何内容?
答案 0 :(得分:1)
您可以在If
语句中添加其他条件。你可以使用
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,...)
开始搜索第一个字符,但可能在任何地方匹配。例如,InStr(1,"foo","o")=2
。
1,
。如果您只查找以开头给定文字的单元格值,请替换
If InStr(1, Cells(), "")
与
If InStr(Cells(), "")=1
顺便说一下,为避免出现问题,请查看this answer关于使用With
... .Cells()
而不是不合格的top with ties
{1}}。
修改2
根据您的评论,我认为您正在查找字符串中的任何位置,而不仅仅是在字符串的开头。然后尝试这样的事情,对于一个条件:
Cells
(对于其他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
和Dim
行。)< / p>
这有四点不同:
在每个测试周围使用括号以确保没有误解;
用celltext=...
快速检查ATH
,即字符串中的某处;
用>= 1
快速检查EATH
,即字符串中没有任何地方;以及
使用= 0
确保您确实拥有celltext
的真实文本结果,而不是Cells(i, placementcol)
或其他值。
我还拿出了领先的Null
。
答案 1 :(得分:1)
以下是&#34; Like
&#34; VBA:
If Cells(i, placementcol) Like "*[A-DF-Z]ATH*" Then Cells(i, sitecol) = "Authority"
*
匹配任何0个或多个字符,[A-DF-Z]
匹配除E以外的任何字母,因此它不会匹配包含EATH的字符串(除非它们包含多个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