動作はある程度しかシミュレートできませんが、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つが編集モードになります。
申し訳ありませんが、コードにいくつかのバグがあるようです。 (メソッドまたはデータメンバーが見つかりません)、コンパイラがこの行を強調表示しました:ThisWorkbook.setErrorToshow Application.Caller、 "関数COUNT2の引数が多すぎます" –
@HaythamAmairah指定した各コード最初のコメント行、 'Code Module'を追加する必要があります。それを適用しましたか? –
いいえ、私は前にそれを適用しなかった、明確化のおかげで。あなたのソリューションはうまく動作します。 –