2016-11-08 56 views
1

我試圖寫在其中一列包含一個字符串,並且不包含另一個字符串的函數。Excel公式:如果單元格中包含字符串「this」和不包含子串「即」

在波紋管,我想我的函數返回1,如果我的行包含「一些項目」,不包含「開銷」的例子。

row| example strings    | desired return value 
0 |some project,other project | 1 
1 |some project     | 1 
2 |overhead      | 0 
3 |some project, overhead  | 0 
4 |some project, other, boo  | 1 

我試圖用精確的字符串,例如第一制訂它:

=IF(AND((E3="some project"),NOT(E3="overhead")),1,0) 

但這只是給出了行1和2正確的結果,因爲它不僅會確切馬赫的字符串,而不是匹配在子字符串上。

回答

3

你需要的是某種子串的功能。我認爲FIND可能工作。看看這個頁面:https://exceljet.net/excel-functions/excel-find-function

你的功能將是這樣的: =IF(AND(ISERROR(FIND("some project", E3))=FALSE,ISERROR(FIND("overhead",E3))),1,0)

編輯:上面的功能測試後,工作

這裏

棘手的部分是FIND返回字符串的起始位置,如果失敗則返回#VALUE,我相信你可以搭配ISERROR()函數。這絕不是一個美麗的解決方案。我會嘗試利用後面的代碼,並寫出這是VBA,因爲我確定在VBA中有適當的substring函數。

+0

上面的例子訣竅。謝謝! – Marta

2

實際上,你可以使用搜索功能,類似這樣的:

=IF(ISNUMBER(SEARCH("some project",B2)),NOT(ISNUMBER(SEARCH("overhead",B2)))*1,0) 

考慮

  • SEARCH函數:返回一個數字或錯誤(這就是爲什麼我用ISNUMBER,你可以實際上也使用了ISERROR)。此功能是不區分大小寫。對於區分大小寫,您可能只需要使用FIND,在前面的公式中可以是=IF(ISNUMBER(FIND("some project",B2)),NOT(ISNUMBER(FIND("overhead",B2)))*1,0)
  • ISNUMBER函數:返回FALSE或TRUE。我轉換的結果爲1或0簡單地通過1乘以TRUE或FALSE

希望幫助

3

如果你可以插入一個小VBA代碼,那麼你可以使用自定義功能,像這樣:

=StrContains(E3, "some project", "overhead") 

,這將返回True如果在E3值包含的子串的。該功能主要依賴於VBA的Instr function,這

功能代碼:

Public Function StrContains(ByRef cl As Excel.Range, ParamArray strings() As Variant) 
'Function returns TRUE if the range contains ALL of the passed substring items 
' uses ParamArray to allow varying number of substring items 
' Ex: 
' =StrContains(A1, "something", "else", "foo") 
' 
Dim val$ 
Dim s 
Dim i As Integer 
Dim ret As Boolean 
Dim length As Integer 

length = UBound(strings) + 1 
val = cl.Value2 

For Each s In strings 
    If InStr(1,val, s) <> 0 Then 
     i = i + 1 
    End If 
Next 

ret = (i = length) 
StrContains = ret 
End Function 

您可以修改這個比較容易是不區分大小寫的,或可選擇接受部分匹配等,這裏是什麼樣子延長二者的那些概念:

=StrContains(E3, False, True, "some project", "overhead") 

功能代碼:

Public Function StrContains(ByRef cl As Excel.Range, MatchCase As Boolean, MatchAll as Boolean, ParamArray strings() As Variant) 
'MatchAll is matching switch, use True to require ALL matching items, or False to allow for fewer. 
'MatchCase is the Case-sensitive switch, use False to ignore case. 
' uses ParamArray to allow varying number of substring items 
' Ex: 
' =StrContains(A1, "something", "else", "foo") 
' 
Dim val$ 
Dim s 
Dim i As Integer 
Dim ret As Boolean 
Dim length As Integer 

length = UBound(strings) + 1 
val = cl.Value2 

If Not MatchCase Then 
    val = LCase(val) 
    For i = lBound(strings) to UBound(strings) 
     strings(i) = lcase(strings(i)) 
    Next 
Next 


For Each s In strings 
    If InStr(val, s) <> 0 Then 
     i = i + 1 
    End If 
Next 

ret = (i = IIF(MatchAll, length, 1)) 
StrContains = ret 
End Function 
+1

這裏真正的解決方案。儘管excel功能可能起作用,但它們很醜並且很難理解。 – wbrugato

+0

謝謝@wbrugato - 我打算用這樣的東西來修改你的帖子,但是作爲一個單獨的答案感覺它更好,因爲它在概念上與根據你的以及上面的其他答案使用工作表函數有點不同。乾杯。 –

相關問題