2016-08-23 4 views
0

セル「TestChars」のすべての文字が許可されていることを確認するVBA式を作成しています。物事をさらに困難にするために、私はこの式を単一の細胞ではなく細胞の範囲に作用させたいと考えています。VBAを使用してExcelでセルを検証するためのベクトル式

現在のコードが動作するようです:

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. 式が範囲をとり、単一ブール値を返します。私はベクトル化された関数を好んでいます。ここで、入力範囲が与えられると、対応する範囲のブール値が得られます。 'EXACT'のような組込み式のように思えます(実行するにはctrl-shift-enterを押す必要があり、中括弧はどこに入力するか)。ユーザー定義関数でそれを行う方法はありますか?
  2. 私はプログラミングに初心者ではありませんが、私はVBAに完全に新しいです(私は今日始めました)。上記のコードで明らかな問題、奇妙なことはありますか?
  3. 特殊文字、極端に長いテキスト、または数式が失敗する特定の入力値がありますか?
  4. 同じ効果を達成するための簡単な方法はありますか?コードは遅いですか?
  5. excelで組み込み式を入力すると、候補と自動補完が得られます。これは私の公式ではうまくいかないようですが、私はあまりにも多くを求めているのですか、これを達成することは可能でしょうか?

この質問には弱い関連のサブ疑問がいくつか含まれていることが分かります。サブ回答も非常にうれしいです。

+0

条件付き書式設定ルールで複数の値を返す配列式を使用できないと思います。 CFは常にセル単位であり、特定の範囲のセルにtrue/falseの返された配列を「分配」するメカニズムはないと思います。 –

+0

私は最初の質問を言い換えようとします。 '= AND(EXACT(A1:A10、B1))'と入力すると、 '= AND(EXACT(A1:A10、B1))'と入力してctrl-shift-enterを押すと、 } 'とベクトル的に動作します。つまり、EXACTは入力範囲を取り、ブール値の対応する範囲(または配列?)を返します。ALL関数はこの配列を崩壊させ、範囲内のすべてのセルがB1と完全に同じかどうかを示します。現在、ある範囲の値に対して関数を使用するには、 '= AllCharsValid(A1:A10、B1)'を実行します。 '='(AllCharsValid(A1:A10、B1)) 'を実行することはできますか?' EXACT '関数については、 – JavaNewbie

+1

はい、関数からブール値の配列を返します。各ブール値は各セルの要素です。それはなぜあなたがそれをやりたいのかはっきりしません。なぜなら、許可されていない文字の最初のインスタンスでFalseを返す代わりに、すべてのセルをテストする必要があるからです。 –

答えて

1

次のコードは、最初の入力範囲から1列分オフセットしたブール値の範囲を返します。 Excelで新しいタブを作成して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)テスト文字列の長さがゼロの場合、関数は望ましくない可能性がある、問題のセルのためTrueを返します。

cf 3)Excelセルに含めることができる文字の数に制限があります。詳しくはhereを参照してください。私は、非常に長い文字列を連結して関数に渡した場合、整数の制限が+32767に達し、整数Indexの変数のために実行時エラーが発生する可能性があります。ただし、Excelセルの文字制限は+ 32767なので、関数は問題なくそのまま動作するはずです。

cf 4)私が知っていることはありません。

cf 5)これは達成するのが最も簡単なことではありませんが、が見つかりました。

関連する問題