使用VBA在Excel中进行单元validation的vector公式

我正在编写一个VBA公式来检查单元格“TestChars”中的所有字符是否允许,如果允许,则表示每个字符出现在由另一个单元“AllowedChars”定义的列表中。 为了使事情变得更加困难,我希望这个公式能够在单元格范围内工作,而不是在单个单元格上工作。

目前的代码似乎工作:

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 

我有以下问题:

  1. 公式使用一个范围并返回一个布尔值。 我更喜欢vector化函数,在给定input范围的情况下,可以得到相应的布尔值范围。 看起来像“精确”的内置公式可以做到这一点(那些公式,你必须按Ctrl-Shift-Enter来执行它们,并在那里你得到花括号)。 有没有办法做到这一点与用户定义的function?
  2. 我对编程并不陌生,但是对于VBA我是全新的(我今天就开始了)。 上面的代码有没有什么明显的问题,怪异?
  3. 是否有特殊字符,极长的文本或特定的input值会导致公式失败?
  4. 有一个更简单的方法来实现相同的效果? 代码是否慢?
  5. 当你开始在Excel中input内置公式时,你会得到build议和自动完成。 这似乎不适用于我的公式,我是要求太多还是可以做到这一点?

我意识到这个问题包含了几个相关的子问题,所以我也会对子答案感到高兴。

下面的代码将返回从初始input范围偏移一列的一系列布尔值。 只需在Excel中创build一个新选项卡,然后运行testAllCharsValid并在IDE中显示“立即”窗口,以查看它是如何工作的。

 Sub testAllCharsValid() Dim i As Integer Dim cll As Range, rng As Range Dim allowedChars As String ' insert test values in sheet: for testing purposes only With ActiveSheet ' change to Thisworkbook.Sheets("NameOfYourSheet") Set rng = .Range("A1:A10") For i = 1 To 10 .Cells(i, 1) = Chr(i + 92) Next i End With ' fill allowedChars with letters a to z: for testing purposes only For i = 97 To 122 allowedChars = allowedChars & Chr(i) Next i ' get boolean range Set rng = AllCharsValid(rng, allowedChars) ' check if the returned range contains the expected boolean values i = 0 For Each cll In rng i = i + 1 Debug.Print i & " boolean value: " & cll.Value Next cll End Sub ' Check that all characters in InputCells are among ' the characters in AllowedChars Public Function AllCharsValid(InputCells As Range, allowedChars As String) As Range Dim BoolTest As Boolean Dim Char As String Dim Index As Integer Dim RangeTestChars As Range, RangeBooleans As Range, RangeTemp As Range Dim TestChars As String For Each RangeTestChars In InputCells BoolTest = True TestChars = RangeTestChars.Value For Index = 1 To Len(TestChars) Char = Mid(TestChars, Index, 1) If InStr(allowedChars, Char) = 0 Then BoolTest = False Next Index Set RangeTemp = RangeTestChars.Offset(0, 1) ' change offset to what suits your purpose RangeTemp.Value = BoolTest If RangeBooleans Is Nothing Then Set RangeBooleans = RangeTestChars Else Set RangeBooleans = Union(RangeBooleans, RangeTemp) End If Next RangeTestChars Set AllCharsValid = RangeBooleans End Function 

cf 2)如果testingstring的长度为零,则对于所讨论的单元格,该函数将返回True ,这可能不合意。

cf 3)Excel单元格可以包含多less个字符是有限制的, 在这里阅读更多。 我想,如果连接了一些非常长的string并将它们发送给函数,则可能会达到+32767的整数限制,这会由于整数Indexvariables而导致运行时错误。 但是,由于Excel单元格的字符限制完全是+32767,因此函数应该没有任何问题。

比较4)我知道的没有。

比较5)这不是最容易实现的,但是在这里可以find帮助。