• ベストアンサー

Excel:自作のセル関数でエラーが発生

Win2K、Excel97-2000-2002を使用しております。 以下のような関数を作成しました。 Public Function sss() As Boolean  On Error GoTo aaa   Range("A1").Value = "TEST"  sss = True Exit Function aaa:  MsgBox Err.Description  sss = False End Function これをSheet1のB1セルで呼びましたところ、 Rangeへのセットのところで以下のようなエラーが発生します。 「アプリケーション定義またはオブジェクト定義のエラーです。」 同関数をイミディエイトウインドウで実行しましたところ、正常に動きます。 セルの内容を変更するようなメソッドをセル関数として呼ぶことはしてはいけないのでしょうか。 御教授、御鞭撻の程、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

エクセルのユーザー関数は、値を返すだけにしないといけません。その関数を使うセルは別として、他のセルの値や プロパティ(値もプロパテイですが)を設定することは許しません。Subプロセジュアとの住み分けを厳密に規定しているようです。メソッドに当たるものも、だめでしょう。 Range以外の他のオブジェクトのプロパティに関する設定も だめでしょう。 Range("A1").Value = "TEST"の部分はエラーの素です。

o_w_nakazaki
質問者

お礼

ご教授くださいまして。ありがとうございます。 そういった関連のドキュメントがどこにも見つけられなくて 質問してめみました。 解決いたしました。ありがとうございます。

その他の回答 (1)

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.2

こんにちは。maruru01です。 ユーザー定義関数で、他のセルにデータを入力する方法です。 ちょっとイレギュラーな方法ですが。 いったん目的のセルにハイパーリンクを設定して(ここで表示文字列を設定)、その後でハイパーリンクを削除します。 Function DispData(rg As Range, str As String) As Long   ActiveSheet.Hyperlinks.Add Anchor:=rg, Address:="", TextToDisplay:=str   rg.Hyperlinks.Delete End Function これで、どこかのセル(A1以外)に、 =dispdata(A1,"TEST") と入力すると、A1に「TEST」という文字列が入ります。

o_w_nakazaki
質問者

お礼

ご回答いただきまして、ありがとうございます。 ご提示頂いた例、今後の参考にさせていただきます。

関連するQ&A

  • 二つのエラーを発生させたい

    ひとつのプロシージャー内で、 二つのエラートラップを仕掛ける事は出来ないのでしょうか? Sub エラーが発生した時にエラーが発生したら() Dim i As Long On Error GoTo Err1 i = "a" Exit Sub Err1: MsgBox "Err1のエラー: " & Err.Description On Error GoTo Err2 i = "b" Exit Sub Err2: MsgBox "Err2のエラー: " & Err.Description End Sub を行うと、 i = "b" で2回目のエラーが発生した時は、 実行時エラーになってしまいます。 i = "b" で2回目のエラーが発生した時に、 「Err2のエラー: 型が一致しません。」 と表示させるにはどうすればいいでしょう? Sub エラーが発生した時にエラーが発生したら() Dim i As Long On Error GoTo Err1 On Error GoTo Err2 i = "a" Exit Sub Err1: MsgBox "Err1のエラー: " & Err.Description i = "b" Exit Sub Err2: MsgBox "Err2のエラー: " & Err.Description End Sub にすると、 i = "a" のエラーで、 「Err2のエラー: 型が一致しません。」 へ移動してしまいます。

  • 自作関数からのセル操作

    お世話になります。 ExcelVBAで以下のような自作の関数を作成し、実行するとA1に”hoge”が入力されます。 <自作関数> function hoge() thisworkbook.worksheets("sheet1").range("A1").value = "hoge" end function しかし、ワークシート上のセル”A2”に「=hoge()」と入力してEnterとするとエラーになってA1には何も入力されません。 VBAで作った関数をワークシート上で関数として使う場合、任意のセルのプロパティを変更することはできないのでしょうか? よろしくお願いします。

  • Excel:SQL実行関数のエラー原因を知るには?

     年甲斐もなく昨日からSQLでExcelデータを参照、更新、削除する二つの関数の作成に挑戦しています。が、 >[Microsoft][ODBC Excel Driver] パラメーターが少なすぎます。 >1を指定してください。 とのエラーで立ち往生中。  作成しているのは、SELECT文を実行するDBLookup()とUPDATE文、INSERT文、DELETE文を実行するCnnExecute()の二つ。どちらも、添付図のようにTESTに成功。で、一旦、Excel を閉じて、もう再テスト。すると、前述のエラーに遭遇。一度だけDBLookup()が正常に動いたのでCnnExecute()も再テスト。すると、前述のエラーが発生。同時に、DBLookup()も動かなくなりました。で、その後、5時間の試行錯誤中。だが、手詰まり感強く質問することに。このようなバグ取りで他者に質問と言う形で助けを求めるのは実に情けないことです。そこは、大目に見て下さい。 【質問】どういうアプローチをすべきと思いますか? 【DBLookup()のコード】 Public Function DBLookup(ByVal strQuerySQL As String, _              Optional xlFileName As String = "", _              Optional returnValue As String = "") As Variant On Error GoTo Err_DBLookup   '   ' 【要参照設定】   '   ' Micrsoft ActiveX Data Objects 2.8 Library   '   Dim DataValue   Dim cnn As ADODB.Connection   Dim rst As ADODB.Recordset   Set cnn = New ADODB.Connection   Set rst = New ADODB.Recordset   '   ' ThisWorkbook.FullName の指定   '   If Not Len(xlFileName) Then      xlFileName = ThisWorkbook.FullName   End If   '   ' 接続設定   '   With cnn     .Provider = "MSDASQL"     '     ' 32bit     '     'cnn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _     '           "DBQ=" & xlFileName & ";" & _     '           "ReadOnly=False;"     '     ' 64bit     '     .ConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _               "DBQ=" & xlFileName & "; ReadOnly=False;"     .Open     '     ' 列の読み込み     '     With rst       .Open strQuerySQL, cnn, adOpenStatic       If Not .BOF Then         .MoveFirst         DataValue = .Fields(0) & ""       End If     End With   End With Exit_DBLookup: On Error Resume Next   rst.Close   cnn.Close   Set rst = Nothing   Set cnn = Nothing   DBLookup = IIf(Len(DataValue), DataValue, returnValue)   Exit Function Err_DBLookup:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBLookup End Function 【CnnExecute()のコード】 Public Function CnnExecute(ByVal strSQL As String, _               Optional xlFileName As String = "") As Boolean On Error GoTo Err_CnnExecute   '   ' 【要参照設定】   '   ' Micrsoft ActiveX Data Objects 2.8 Library   '   Dim isOK As Boolean   Dim DataValue   Dim cnn As ADODB.Connection   isOK = True    Set cnn = New ADODB.Connection   '   ' ThisWorkbook.FullName の指定   '   If Not Len(xlFileName) Then      xlFileName = ThisWorkbook.FullName   End If   '   ' 接続設定   '   With cnn     .Provider = "MSDASQL"     '     ' 32bit     '     'cnn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _     '           "DBQ=" & xlFileName & ";" & _     '           "ReadOnly=False;"     '     ' 64bit     '     cnn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _               "DBQ=" & xlFileName & ";" & _               "ReadOnly=False;"     .Open     .Execute strSQL   End With Exit_CnnExecute: On Error Resume Next   cnn.Close   Set cnn = Nothing   CnnExecute = isOK   Exit Function Err_CnnExecute:   isOK = False   MsgBox "SQL 文の実行時にエラーが発生しました。(CnnExecute)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strSQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_CnnExecute End Function  「あっ、これは、多分、こういうことだな!」という思われた方は、気軽にご回答ください。

  • セル範囲を返す関数

    次のようにしますと「型が一致してません」エラーになってしまいます。 どうしたらセル範囲を返す関数が作れますか? Public Function inuinu() As Range Set inuinu = Range(Cells(1, 1), Cells(3, 3)) 'Debug.Print inuinu.Count End Function 返値にAreasの指定もしてみましたが巧くいきませんでした。

  • EXCEL:ユーザー定義関数で、すぐ上のセルの参照

    簡単なユーザー定義関数を作っています。 Function TEST2(ByVal 氏名 As Range, 数 As Range, 累計 As Range) If 氏名 = 氏名.Offset(-1, 0) Then TEST2 = 累計 + 数 Else TEST2 = 数 End If End Function 氏名が同じなら、累計計算をしたいのですが、累計は、求めたいセルのすぐ上なんで、 指定せずに、関数の中で参照出来るのではないかと思うのですが、良い方法はないで しょうか? 宜しくお願いします。

  • シートモジュールからのErr.Raiseについて

    Excel(Office 2007)で以下のようにシートモジュールで 発生したエラーの詳細を標準モジュール側で取得しようとしたところ SourceとDescriptionで指定した文字列が取得できませんでした。 どうすれば指定した元の文字列を取得することができるでしょうか。 どなたかお知恵をお貸しください。 【シートモジュール(Sheet1)内のソースコード】 Public Sub Hoge()     Err.Raise Number:=1000, Source:="Fugo", Description:="Fuga" End Sub 【標準モジュール内のソースコード】 Public Sub Piyo()     On Error Goto Error1     Sheet1.Hoge     Exit Sub Error1:     MsgBox "Num=" & Err.Number & ", Src=" & Err.Source & ", Dsc=" & Err.Description End Sub 【MsgBoxの表示結果】 Num=1000, Src=VBAProject, Dsc=アプリケーション定義またはオブジェクト定義のエラーです。  

  • セルに貼り付けた自作関数での書式反映について

    引数で日付を渡し、漢字の曜日一文字が返る関数をVBAで作成しました。 どうせなら日曜日の場合は文字の色を赤色にしようと思い、日曜日の場合だけ文字色を赤にする一文を追加しました。 が、セルにこの関数を貼り付けると曜日は返ってくるのですが、日曜日の場合の赤色が反映されません。 どなたかご教授いただければ嬉しいのですが、、、 宜しくお願い致します! OS:WindowsXP Excel:OfficeXP です。 以下に作成したマクロ関数を貼り付けます。 ********************************************************* Public Function week(d) As String  On Error GoTo err_week  Select Case Weekday(d)  Case vbSunday   week = "日"   Worksheets(Application.Caller.Worksheet.Name).Cells(Application.Caller.Row, Application.Caller.Column).Font.ColorIndex = 3  Case vbMonday   week = "月"  Case vbTuesday   week = "火"  Case vbWednesday   week = "水"  Case vbThursday   week = "木"  Case vbFriday   week = "金"  Case vbSaturday   week = "土"  Case Else   week = "×"  End Select Exit Function   err_week:  week = "ER"  Exit Sub 'End End Function *********************************************************

  • 「Err.Description」と「Error$」は同じ意味ですか?

    MsgBox Err.Description MsgBox Error$ この2つは同じ結果が返るのですが なにか違いはありますか?

  • Excel2010 イベントプロシージャが動かない

    VBAはほとんどいじったことのない初心者です。 イベントプロシージャをインターネットから探してきて、コピペして使おうとしてます。 Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ERR_HANDLER If Target.Address(False, False) = "E2" Then ActiveSheet.Name = Range("E2").Value End If Exit Sub ERR_HANDLER: MsgBox "現在のE2セルの値はシート名にできません。" End Sub やりたいのは、セルE2の値に変更があったら、そのセルの値をシート名にしたいということです。 初心者には難しいでしょうか? ご教示いただけると幸いです。 よろしくお願いします。

  • ファイルの有無を確認した際のエラーについて

    VB6です。以下の様な関数を使っています。 用途としては、ファイルの有無を調べています。 で、関数の値として実際のパソコンに存在しないフォルダを指定した際、 下のエラー処理(AAA)に飛びません。 わかる方いらしたら、よろしくお願いします。 Public Function files(ByVal strPathName As String) As Boolean On Error GoTo AAA If (GetAttr(strPathName) And vbDirectory) = vbDirectory Then Stop Else Stop End If Exists2 = True Exit Function AAA: Stop End Function

専門家に質問してみよう