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(...)<>1Not (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语句,可以重复使用celltextcelltext不必重复Dimcelltext=...行。)

这有四点不同:

  1. 在每个testing周围使用括号来确保没有误解;

  2. >= 1检查ATH ,即在string中的某处;

  3. = 0检查EATH ,即EATHstring中; 和

  4. 使用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