2017-10-18 155 views
0

我有在细胞工作的公式,但它是一个很长的嵌套如果。它本质上是试图检查一个单元格是否有多个不同的值。(Excel的公式VBA)嵌套IF高亮红

A2 =这是我的描述。 B2包含嵌套的if,它在A2描述中搜索多个单词。当它贯穿每条if语句时,它将打印找到的单词。

我需要使用VBA来设置这个公式到多个单元格,但我不知道为什么公式是错误的。 (Excel将其突出显示为红色。)有没有更好的方法来编写它?

(我已经做了两个嵌套如果对一条线,并使用“& _”分隔到下一行。)

Sub Search_For_Keywords() 
Do Until ActiveCell.Value = "" 

    Range(B2).Activate 
    With ActiveCell 
    .Formula = "=IF(ISNUMBER(SEARCH(""Keyword1 "",A2,1)),""1"",IF(ISNUMBER(SEARCH(""Keyword2 "",A2,1)),""2"", & _ 

...有48个关键词,多得需要在未来添加...

IF(ISNUMBER(SEARCH(""Keyword_n"",A2,1)),""n"",""No Keywords Found"")))))))))))))))))))))))))))))))))))))))))))))))" 

    End With 
Loop 
End Sub 

UPDATE:

另一种解决方案(解决方法吗?)是使用

=IFERROR(INDEX(E2:E6,MATCH(D2:D6,A2:A6,0)),"Not Found") 

=INDEX (column to return a value from, MATCH (lookup value/column, column to lookup against, 0)) 

因此,我的D2:D6包含关键字搜索,E2:E6包含每个关键字的别名,然后A2:A6举行了我想尝试的实际描述,看看关键字是否在。

此代码是现在短到可以放在VBA,唯一的缺点是你必须有一个包含此信息的列。再次

感谢所有帮助。其他更多的VBA特定解决方案可以在下面找到。

+0

请将此设为[mcve](也许关键字较少)。事实上,你只是给出你的陈述的一个片段,很难调试。 –

+0

您确定您在新行的'_'后面使用双引号吗? –

+0

我这么认为......让我发布上面的其他内容,如果我们能找到一种方法来调整它,那可能会更容易。 – mitchmitch24

回答

2

如果你想使用VBA你可以使用这个简单的代码假设你刚刚想这个词发现

arr = Array("keyword1", "keyword2", "keyword3") 'List of keywords to look for 
For i = 0 To 2 
    Set c = Sheets(1).Range("a2").Find(arr(i), LookIn:=xlValues) 
    If Not c Is Nothing Then Sheets(1).Range("b2").Value = arr(i) 'Setting the value if the keyword is found 
Next i 

但是,如果被发现,将打印只有最后一个多个单词(U可以修改代码如果你需要的话)。当然,因为这不是一个计算,你将需要在各个单元格的值发生改变时,运行代码

具体解决方案:

Sub Find_Keywords() 

Keywords = Array("Awesome", "hey", "world") 'List of keywords to look for 

Range("A2").Activate 

    Do Until ActiveCell = Range("a14") 

     For i = 0 To 2 
      Set C = ActiveCell.Find(Keywords(i), LookIn:=xlValues) 
      If Not C Is Nothing Then ActiveCell.Offset(0, 1).Value = Keywords(i) 'Setting the value if the keyword is found 
     Next i 

    ActiveCell.Offset(1, 0).Activate 

    Loop 

End Sub 
+0

嗨Raunak托马斯!这实际上可能是完美的 - 我唯一的问题是,它正在搜索的范围是否可以设置为activecell?我试图使它Activecell.Find(ARR(I),看着:= xlValues),但是没有工作(我问,因为我需要检查很多细胞的,我打算用do循环与和Activecell。抵消了。) – mitchmitch24

+0

积极做的工作,我只是试了一下。将表单(1).range(“b2”)更改为表单(“your_sheet_name”)。range(“b2”)并尝试。 –

+0

Raunak Thomas,非常感谢你!经过一些调整,我得到它的工作正是我想要的! :)(我用我的特定解决方案代码更新了您的评论,但在它出现之前必须先进行同行评议,我会将其标记为答案。) – mitchmitch24

1
Function SearchMyKeywords(rng As Range) 
    Select Case rng 
     Case _1st_keyword 
      SearchMyKeywords = Whatever_You_Like 
     Case _2nd_keyword 
      SearchMyKeywords = Whatever_You_Like2 
     ... 
     Case Else ' For all the rest 
      SearchMyKeywords = Whatever_suitable_here 
    End Select 

然后你可以使用你的功能如内置函数

+1

嗨TSion.DP感谢您发布此信息。我会在Select Case上做更多的阅读,并随身携带你的代码。我认为这也可能是一个很好的解决方案!我感谢您的帮助 :) – mitchmitch24