2

数式だけを使用してループ内の文字列を実行する方法がわかりません。

これは、数式に変換しようとしている vba コードです。この数式をさまざまなセルのデータ検証に使用したいと考えています。

方式:

Function Test(pValue) As Boolean
    If Len(pValue) < 2 Or Len(pValue) > 99 Then
        AlphaNumeric = False
        Exit Function
    End If
    LPos = 1
    LValid_Values = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.0123456789"
    While LPos <= Len(pValue)
        LChar = Mid(pValue, LPos, 1)
        If InStr(LValid_Values, LChar) = 0 Then
            Test = False
            Exit Function
        End If
        LPos = LPos + 1
    Wend
    Test = True
End Function

私が書いた式の簡単な部分:

=IF(AND(LEN(E4)>1,LEN(E4)<100,____Formula_Here____),TRUE,FALSE)

を選択E4:E50000してクリックすると、ドロップダウンからDataValidation選択Customして上記の式を入力すると、E4、E5、E6.. E50000 にも自動的に適用されると想定しています。私が間違っている場合は修正してください。

また、これを Excel 2003 以降で実行したいと考えています。

4

4 に答える 4

6

で空白を埋めます

NOT(ISERROR(SUM(SEARCH(MID(E4,ROW($1:$99),1)," ABCDEFGHIJKLMNOPQRSTUVWXYZ.0123456789"))))

これは配列数式なので、ワークシートで使用する場合は ctrl-shift-enter で入力します。ただし、データ検証のカスタム数式 (少なくとも 2003 年) は、これを自動的に配列数式として処理するため、通常どおり入力するだけです。

内側から分解してみましょう。ROW($1:$99)配列数式内では、ループ メカニズムが提供されます。これにより、周囲の配列数式が のそれぞれで評価されるi = 1, 2, ..., 99ため、 の番目の文字が順番MIDに取得されます。は大文字と小文字を区別しないため、省略できます。番目の文字が見つかった位置を返すか、それ以外の場合はエラーを返します。これらの位置を集約し、エラーを伝播します。そのため、文字が見つからない場合は全体がエラーになります。iE4SEARCHa..zA..ZA..Z.0..9iSUMSUM

私の知る限り、カスタム検証式で UDF を使用できるので、あなたの反対意見に従うかどうかはわかりません。

于 2013-02-03T20:01:45.733 に答える
0

これを行うために私が見つけた方法は、ヘルパー列を使用することでした。

あなたのデータがあると仮定してE4:E50000

F4 は=Test(E4)
この値を最後までコピーするため、ヘルパー列ができました (確認したい場合は、最後の列が になります=Test(E50000)) 。

データ検証カスタム数式は次のようになります=F4(範囲 E4:E50000 を選択してこれを入力すると、それがコピーされ、その隣の対応するセルを指すように参照が調整されます)。

あなたのコードにもエラーがありAlphaNumeric = FalseますTest = FalseOption Explicitを設定すると、これらのエラーを見つけるのに役立ちます。


テスト スプレッドシートで使用したルーチンのわずかに変更されたバージョン:

Option Explicit

Function Test(pValue) As Boolean
Dim lPos As Long
Dim lValid_Values As String
Dim LChar As String

If Len(pValue) < 2 Or Len(pValue) > 99 Then
    Test = False
    Exit Function
End If
lPos = 1
lValid_Values = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.0123456789"
While lPos <= Len(pValue)
    LChar = Mid(pValue, lPos, 1)
    If InStr(lValid_Values, LChar) = 0 Then
        Test = False
        Exit Function
    End If
    lPos = lPos + 1
Wend
Test = True
End Function
于 2013-02-04T18:17:18.873 に答える
0

私が持っていたアイデアは、ネストされた代替関数の束を使用して有効なエントリを "" に減らし、それが "" であることを確認するためにデータ検証を行うことでした。

これがネストされた置換です。

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(B1," ",""),"a",""),"b",""),"c",""),"d",""),"e",""),"f",""),"g",""),"h",""),"i",""),"j",""),"k",""),"l",""),"m",""),"n",""),"o",""),"p",""),"q",""),"r",""),"s",""),"t",""),"u",""),"v",""),"w",""),"x",""),"y",""),"z",""),"A",""),"B",""),"C",""),"D",""),"E",""),"F",""),"G",""),"H",""),"I",""),"J",""),"K",""),"L",""),"M",""),"N",""),"O",""),"P",""),"Q",""),"R",""),"S",""),"T",""),"U",""),"V",""),"W",""),"X",""),"Y",""),"Z",""),".",""),"0",""),"1",""),"2",""),"3",""),"4",""),"5",""),"6",""),"7",""),"8",""),"9","")

それをコピーしてデータ検証に貼り付けることができなかったため、あまり役に立たないことがわかりましたが、すべてが失われるわけではありません。これをVBAで書きました。

Sub jf()
Dim lValid_values As String
Dim rowcount As Long
lValid_values = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.0123456789"
Dim form As String
Dim desired_column As String
Dim desired_rowMin As Long
Dim desired_rowMax As Long
Dim InitialCell As String
Dim temp As String
desired_column = "E"
desired_rowMin = 4
desired_rowMax = 50000
InitialCell = desired_column & desired_rowMin
form = "substitute(||cell||," & """" & " " & """" & "," & """" & """" & ")"

Do While lValid_values <> ""
form = "substitute(" & form & "," & """" & Left(lValid_values, 1) & """" & "," & """" & """" & ")"
lValid_values = Right(lValid_values, Len(lValid_values) - 1)
Loop
form = "=AND(LEN(||cell||)>1,LEN(||cell||)<100," & form & "=" & """" & """" & ")"

For rowcount = desired_rowMin To desired_rowMax
temp = Replace(form, "||cell||", desired_column & rowcount)

With Range(desired_column & rowcount).Validation
    .Delete
    .Add Type:=xlValidateCustom, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:=temp
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = ""
    .ErrorTitle = ""
    .InputMessage = ""
    .ErrorMessage = ""
    .ShowInput = True
    .ShowError = True
End With
Next rowcount
End Sub

これを 50000 まで実行し始めましたが、かなり遅いので 4000 付近で停止しました。必要に応じて、desired_column、desired_rowmin、および desired_rowmax 変数を変更する必要があります。

于 2013-02-03T17:56:06.060 に答える
0

数式で関数を使用できます: http://office.microsoft.com/en-us/excel-help/creating-custom-functions-HA001111701.aspx

于 2013-02-01T07:51:32.133 に答える