2017-06-25 3 views
2

ユーザーがCOUNTBLANK機能のためにあまりにも多くの引数を入力すると、関数はこのエラーメッセージが表示され、編集モードに戻ります:ユーザーが予想以上の引数を入力したときにMboxを表示するには、VBAのUDFを強制しますか?

あなたはこの機能のためにあまりにも多くの引数を入力しました。

どのようにUDFを作成するのですか?例えば

:デフォルトでは

Function COUNT2 (c As Range) 
    COUNT2 = c.Count 
End Function 

このUDFは、ユーザーが複数の引数を入力したときに#VALUE!エラーを返します。

COUNTBLANKのように機能させるにはどうすればいいですか?

答えて

0

動作はある程度しかシミュレートできませんが、Excelのビルトイン機能の動作とまったく同じにはなりません。

UDFで構文エラーが検出されると、計算が終了したときにブックが操作するいくつかのエラーデータ(表示するメッセージ、アクティブにするセル)が開始されるように、メカニズムを追加できます。もちろん、エラーフォーミュラを保持している各セルではなく、一度だけ表示する必要があります。なぜなら、ユーザにとっては非常にストレスがかかるからです。 =COUNT2(A1:A20, B1:B20)または=COUNT2(12345)のような間違った数式を入力してみてください、これをテストするために

' Code module Module1 
Option Explicit 
Function COUNT2(ParamArray args()) 
    Application.Volatile 
    If UBound(args) > 0 Then 
    ThisWorkbook.setErrorToshow Application.caller, "too many args for function COUNT2" 
    ElseIf Not TypeOf args(0) Is Range Then 
    ThisWorkbook.setErrorToshow Application.caller, "wrong argument type for COUNT2" 
    Else 
    COUNT2 = args(0).count 
    End If 
End Function 

、エラーメッセージが表示され、セルは以下となります。UDFは、構文をチェックし、適切なエラー情報を設定します

' Code Module ThisWorkbook 
Option Explicit 
Private errorCell As Range 
Private errorMsg As String 

Public Sub setErrorToshow(cel As Range, msg As String) 
    If Not errorCell Is Nothing Then Exit Sub ' To display a msg only once, not per cell 
    Set errorCell = cel 
    errorMsg = msg 
End Sub 

Private Sub Workbook_SheetCalculate(ByVal Sh As Object) 
    Application.EnableEvents = False 
    On Error GoTo Cleanup 
    If Not errorCell Is Nothing Then 
    Application.Goto errorCell 
    MsgBox errorMsg 
    SendKeys "{F2}" 
    End If 

Cleanup: 
    Application.EnableEvents = True 
    Set errorCell = Nothing 
    errorMsg = "" 
End Sub 

ESC apeを押さない限り、再び編集モードにしてください。エラーセルが多数ある場合(エラーセルをコピーして他の多くに貼り付ける)、F9を押すと、が1回だけと表示され、それらのセルの1つが編集モードになります。

+0

申し訳ありませんが、コードにいくつかのバグがあるようです。 (メソッドまたはデータメンバーが見つかりません)、コンパイラがこの行を強調表示しました:ThisWorkbook.setErrorToshow Application.Caller、 "関数COUNT2の引数が多すぎます" –

+0

@HaythamAmairah指定した各コード最初のコメント行、 'Code Module'を追加する必要があります。それを適用しましたか? –

+0

いいえ、私は前にそれを適用しなかった、明確化のおかげで。あなたのソリューションはうまく動作します。 –

関連する問題