我正在編寫一個VBA公式以檢查單元格「TestChars」中的所有字符是否允許,其中允許表示每個字符出現在由另一個單元格「AllowedChars」定義的列表中。爲了讓事情變得更加困難,我希望這個公式能夠在單元格範圍內工作,而不是在單個單元格上工作。在Excel中使用VBA進行單元格驗證的矢量公式
當前的代碼似乎工作:
Option Explicit
Public Function AllCharsValid(InputCells As Range, AllowedChars As String) As Boolean
' Check that all characters in InputCells are among
' the characters in AllowedChars
Dim Char As String
Dim Index As Integer
Dim RangeTestChars As Range
Dim TestChars As String
For Each RangeTestChars In InputCells
TestChars = RangeTestChars.Value
For Index = 1 To Len(TestChars)
Char = Mid(TestChars, Index, 1)
If InStr(AllowedChars, Char) = 0 Then
AllCharsValid = False
Exit Function
End If
Next Index
Next RangeTestChars
AllCharsValid = True
End Function
我有以下問題:
- 該公式需要一個範圍,並返回一個布爾值。我更喜歡矢量化函數,在給定輸入範圍的情況下,您會得到相應的布爾值範圍。看起來像'精確'這樣的內置公式可以做到這一點(這些公式,你必須按Ctrl-Shift-Enter來執行它們,並在那裏你得到花括號)。有沒有辦法用用戶定義的函數來做到這一點?
- 我對編程並不陌生,但我對VBA來說是全新的(我今天就開始了)。有沒有任何明顯的問題,上面的代碼怪異?
- 是否有會導致公式失敗的特殊字符,極長文本或特定輸入值?
- 有沒有更簡單的方法來達到相同的效果?代碼是否慢?
- 當你開始在Excel中輸入內置公式時,你會得到建議和自動完成。這似乎不適用於我的公式,我是要求太多還是有可能實現這一目標?
我意識到這個問題包含了幾個弱相關的子問題,所以我也會很滿意與子答案。
我不認爲你可以使用一個數組公式在條件格式規則中返回多個值的數組公式,並按照你想要的方式工作。 CF始終是單元格的,我不認爲有任何機制可以在特定範圍的單元格中「分配」返回的真/假數組。 –
我嘗試重寫我的第一個問題。如果您可以輸入'= AND(EXACT(A1:A10,B1))'並按下ctrl-shift-enter,這會使公式顯示爲'{= AND(EXACT(A1:A10,B1)) }'並且向量工作,也就是說EXACT將接受輸入範圍並返回布爾值的相應範圍(或數組?)。然後ALL函數將摺疊這個數組,並告訴你該範圍內的所有單元格是否與B1完全相同。目前,要使用我的函數的一系列值,我做'= AllCharsValid(A1:A10,B1)'。我可以做'= AND(AllCharsValid(A1:A10,B1))','EXACT'功能嗎? – JavaNewbie
是的,你會從你的函數返回一個布爾值數組,每個單元格有一個元素。目前尚不清楚爲什麼你會這樣做,因爲這意味着每個單元格都必須進行測試,而不是在不允許的角色的第一個實例上退出並返回False。 –