2013-08-23 28 views
3

我正在使用一個宏,該宏使用活動單元的當前值並根據所選案例更改該值。但是,我無法確定活動單元是否包含通配符字符串。我不確定我的語法是否正確。我怎樣才能讓我的選擇案例進行比較?Excel VBA:如果ActiveCell像「* string *」那樣選擇大小寫

Select Case ActiveCell.Value 

     Case ActiveCell.Value Like "*string*" 
      ActiveCell.Value = "contains string" 

    End Select 
+1

我不認爲你在Select Case塊中使用通配符語句測試。嘗試使用'If ... then ... elseif ... end if'而不是 –

+0

用'Case Is Like'代替'Case ActiveCell.Value Like' – SeanC

回答

3

Is和like不能用作VBA中的select case語句中的比較運算符。
如果可能的話會更好,在if-then語句來代替:

If ActiveCell.Value Like "*string*" Then ActiveCell.Value = "string" 

從VBA詞彙表進行比較運算符:

的字符或符號,以表示兩個或更多 之間的關係值或表達式。這些運算符包括小於(<),小於或等於(< =),大於(>),大於或等於 (> =),不等於(<>)和等於(=)。其他比較運算符 包括Is和Like。請注意,Is和Like不能在Select Case語句中用作比較 運算符。

12

可以使用通配符。請記住以下兩點:首先,字符串比較表達式評估爲布爾型數據類型(True/False);其次,根據Select ... Case語句的開發人員參考,任何個案表達式必須「隱式轉換」爲與選擇個案測試表達式相同的數據類型。爲了演示,我們使用上面原始帖子中的代碼。

Select Case ActiveCell.Value '-->ActiveCell.Value is the test expression 

    Case ActiveCell.Value Like "*string*" '-->(ActiveCell.Value Like "*string*") is the Case expression. 
     ActiveCell.Value = "contains string" 

End Select 

如果我們選擇在任何工作表包含字符串值的單元格,則使用的即時窗口來測試使用類型名()函數這兩個表達式的數據類型,我們就得到以下:

?TypeName(ActiveCell.Value) 
String 
?TypeName(ActiveCell.Value Like "*string*") 
Boolean 

如您所見,Select ... Case在這裏不起作用,因爲數據類型不是隱式地相同的(如果宏在工作表中包含單個單元格的任何單元格上運行, - 「True」或「False」的字值,Excel自動轉換爲布爾值)。

該解決方案實際上是一個非常簡單的解決方案。只需將測試表達式更改爲True

Select Case True 

    Case (ActiveCell.Value Like "*string*") 
     ActiveCell.Value = "contains string" 

End Select 

這是基本相同的寫作:

If (ActiveCell.Value Like "*string*") = True Then ActiveCell.Value = "contains string" 

這主要是個人喜好的問題您是否使用如果...那麼或SELECT ...案例。由於代碼的可讀性,我個人喜歡Select ... Case結構,但也有其他好處(比如能夠將每個Case傳遞一個用逗號分隔的表達式列表,而不是使用OR運算符,從而使代碼更加簡潔)。

+0

這是很好解釋。我重新訪問了一段代碼,並忘了它做了什麼,這讓我記憶猶新 – user1