【VBA】ユーザ定義関数が動かない

このQ&Aのポイント
  • VBEの標準モジュールに記述したVBAのユーザ定義関数が、期待通りに動作しない場合の原因と解決方法について教えてください。
  • ワークシートのセルに「=tc("aa","bb")」と入力しても、表示が「=tc("aa","bb")」ではなく「aabb」とならない理由を解説してください。
  • VBAのユーザ定義関数の引数について説明し、引数のデータ型が関数の動作に影響する可能性についても教えてください。
回答を見る
  • ベストアンサー

【VBA】ユーザ定義関数が動かない

【VBA】ユーザ定義関数が動かない 下記のようなプログラムをVBEの標準モジュールに記述して、 ワークシートの適当なセルに「=tc("aa","bb")」と入力してEnterを押した所 セルの表示が「=tc("aa","bb")」となってしまい狙った効果が得られません。 本当は、「aabb」と表示させたいのですが、なぜうまくいかないのでしょうか。 ご教授願います。 ◆関数の仕様  引数1と引数2に入力された文字列を連結して返り値として返す。 ◆コード Function tc(str1 As Range, str2 As Range) As String Dim Str As String Str = str1.Value & str2.Valuett tt = Str End Function

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

Str は、予約語として跳ねられることはないけれども、VBA関数だから、変数なのか関数か分からなくなってしまいます。だから、変数としては、Str は、使ってはいけません。 本来、ユーザー定義関数名や、プロシージャ名、このような間違いをさせないために、大文字と小文字を組み合わせ、例えば、wsJoin() などとして上げると、分かりやすいです。ws = Worksheetの意味です。Join は、配列を文字列に直す、VBA関数の名前です。小文字で入れると、変化しませんので、すぐに、自分の入力の間違いが分かります。  str2.Valuett --> str2.Value  tt -->tc 以下、元のコードを参考に同じものを作ってみました。 =tc("aa","bb") =tc(A1,A2) =tc(A1:A4) 引数に、パラメータ配列を使ったので、5個でも、10個でも引数が可能です。 エラー処理のために、戻り値は、Variant 型にします。ただ、以下は、Error のところに、コメントブロックしてあります。 '// Public Function tc(ParamArray Arg() As Variant) As Variant   Dim v As Variant   Dim c As Variant   Dim buf As String   'On Error Resume Next   For Each v In Arg     If TypeName(v) = "Range" Then       For Each c In v         buf = buf & c.Text       Next     Else       buf = buf & v     End If   Next   tc = buf   'On Error GoTo 0 End Function

bebestplay
質問者

お礼

ありがとうございます! 無事解決しました!

その他の回答 (2)

  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.3

呼び出す時の関数の引数、VBA関数の引数タイプが違います。 ・=tc("aa","bb")は文字列渡し。 ・Function tc(str1 As Range, str2 As Range)はセル渡し。 もし、文字列またはRangeのどちらも使用する場合は単純に以下の関数でできると思います。 Function tc(str1 As Variant, str2 As Variant) As String  tc = str1 & str2 End Function  

bebestplay
質問者

お礼

ありがとうございます! 無事解決しました!

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

まず, 間違い: tt = Str 正解: tc = Str それとセル側の書式設定が文字列になってます。 セルを右クリックして書式設定の表示形式を標準に変えてから,関数を打ち込み直します。

bebestplay
質問者

お礼

ありがとうございます! 無事解決しました!

関連するQ&A

  • エクセルユーザー定義関数(1)

    エクセル初心者です。 複数のセル範囲(例えばRange("A1:A100"))を入力させ、入力されたセル範囲すべてのセルを3乗した総和を求めるユーザー定義関数は作ること可能でしょうか? Function Y(a As Range) As Variant ここに、aで選択されたセル全てを3乗して総和を求める関数Yを定義したい。 End Function よろしくお願い致します。

  • 【EXCEL VBA】ユーザー定義関数の設定

    ネットより拝借した下記ユーザー定義関数を使用して、複数の選択したセルの値を区切り文字(セミコロン)で連結する仕組みを作成している途中です。 (例えば、A;B;C;D のように) Function myJoin(範囲 As Range, Optional 区切り文字 As String) As Variant Dim c As Range, buf As String If 範囲.Rows.Count = 1 Or 範囲.Columns.Count = 1 Then For Each c In 範囲 buf = buf & 区切り文字 & c.Value Next c If 区切り文字 <> "" Then myJoin = Mid$(buf, 2) Else myJoin = buf End If Else myJoin = CVErr(xlErrRef) 'エラー値 End If End Function セル(F6)からセル(Fxx)までデータが入力されています。(xxは変動します。) これらのデータをユーザー定義関数を使ってセル(F1)に[=myJoin (F6:Fxx,";")]を 入力するためのマクロを組んでみたのですが 「コンパイルエラー修正候補:区切り文字または)」となってしまいます。 (添付画像を参照願います。) 手入力でセル(F1)にユーザー定義関数(例:=myJoin (F6:F8,";"))を設定すると問題なくデータの連結が出来ます。このエラーを解消するにはVBE上でどのように定義したらいいのか、ご教授の程宜しくお願い致します。

  • excelユーザー関数で

    同じブック内の全てのシートの、引数で指定したセルの文字列をconcatenateするユーザー関数を作成しました。が引数でセルを指定する時に""をつけなければならず少々不便を感じています。どのように修正すれば""をつけなくてよいようになるでしょうか? VBA初心者です。よろしくお願いします。 Function allbookscont(ContCell As String) As String Dim strRet As String For a=2 to Worksheets.Count strRet = strRet & Worksheets(a).Range(ContCell).Value Next a allbookscont = strRet End Function

  • Excelのユーザー定義関数について。

    ネットで調べて「アルファベットのみを半角にする」というユーザー定義関数を発見し使用していますが、 この関数にある特定の文字を変換する条件を追加することはできますでしょうか。 例えば、リンゴ という文字がセル内にある場合、ミカン に変換されて表示されるという条件を下記のユーザー定義関数に加える事ができますか。 もしくは、新たに別のユーザー定義関数を作るしかないのでしょうか。アドバイスよろしくお願いします。m(_ _ )m Function ASC_A(str As String) As String Dim i As Integer For i = 1 To Len(str) If Mid(str, i, 1) Like "[a-zA-Z]" Then Mid(str, i, 1) = StrConv(Mid(str, i, 1), vbNarrow) End If Next ASC_A = str End Function

  • Excelユーザー定義関数が書き込まれているセルアドレス

    Excelのユーザー定義関数で、自分自身が書き込まれているセルのアドレスって取得出来るのでしょうか? 例えば、 Function test(MyString As String) As String test = "入力された文字は、「" & MyString & "」です" End Function とユーザー定義関数を作り A1のセルに =test("てすと") と書くと 入力された文字は、「てすと」ですと出てきます。 そこで、ユーザー定義関数のなかで、ユーザー定義関数を呼び出した式が入力されている(上記の例ですと、「A1」)アドレスを取得する方法ってありますか? どなたか、詳しい方いらっしゃいましたら教えてください。

  • ExcelのVBAでセルに指定したユーザ関数につい

    ExcelのVBAのユーザ関数について 例えば、 Excelのあるセル、例えば、C1セルの値を引数として、「Function 練習()」 という、ユーザ関数に渡します。 関数内では、引数で渡されてきた値のセル番号を判断し、その次のセルに 値を設定します。 つまり、C1セル(1,4)の値をわたしているので、D1セル(1,5)に値を 設定したいのですが、うまくいきません。 「1つ以上の循環参照が発生しています。循環参照とは、数式が直接的 または間接的に自身のセルを参照している状態を指します。これにより、 計算が正しく行われない可能性があります。 循環参照を削除または変更するか、数式を別セルに移動してください。」 が最初に表示されますが、その後、期待した結果になっていません。 何が起きていて、何がたりないのでしょうか。 よろしくお願いします。 ■内容 A B C D 1 111 222 あ =練習(C1,"-") 2 333 444 い 3 555 666 う 4 777 888 え 5 999 000 お ■関数 Function 練習(myTar As Range, word As String) As String If Len(myTar) = 0 Then 練習 = "" Exit Function End If On Error GoTo era CurRow = myTar.Row CurCol = myTar.Column MsgBox CurRow & ":" & CurCol & ":" & Cells(CurRow, CurCol) Cells(CruRow, CurCol + 1) = "a" 練習 = "○" Exit Function era: 練習 = "#VALUE!" End Function

  • VBAでのユーザ定義関数の返り値

    VBAでのユーザ定義関数の返り値をエクセルのセルに表示させる際、 色を変更して表示するにはどうすれば良いのでしょうか? つきのような関数のerrorの時だけ赤色にしたいのです。 functin test(ss as double) if ss >10 then test=ok else test =error! end if end function

  • VBA関数の使い方がわからないです

    A1にはハイパーリンクとしてhttp://www.yahoo.co.jp/ が入っていて、標準モジュールで Sub Macro1() MsgBox HyperlinkAddress End Sub Function HyperlinkAddress(target As Range) As String HyperlinkAddress = target.Hyperlinks(1).Address End Function としたら、引数は省略できません。になるのですが、 どうすればいいですか? Sub Macro1() MsgBox Selection.Hyperlinks(1).Address End Sub これと同じような事を、関数を使って表現したいです。

  • ユーザー定義関数の再計算

    ユーザー定義関数を作りました。 ところが、この関数が自動再計算をしてくれません。 どうしたら自動再計算するようになるのでしょうか? よろしくお願いします。 ちなにこの関数は、自分のシートのB2とsheet1~sheet4のB9を比較して、正しければB9の4つ右のセルの値を合計して返すものです。 =SheetLook($B$2,"sheet1,sheet2,sheet3,sheet4",B9,4) コードです。 Function SheetLook(参照元 As Variant, 比較対象シート As String, 比較対象セル As Range, 参照セル位置 As Integer) As Variant   Dim i As Integer   Dim rng As Range   Dim sss As Variant   Dim kei As Variant   Dim cnt As Integer   sss = Split(比較対象シート, ",")   kei = 0   cnt = 0   For i = 0 To UBound(sss)     Set rng = Sheets(sss(i)).Range(比較対象セル.Address)     If 参照元 = rng Then       kei = kei + rng.Offset(0, 参照セル位置)       cnt = cnt + 1     End If   Next   If cnt <> 0 Then     SheetLook = kei   Else     SheetLook = ""   End If End Function

  • Excel VBA ユーザー定義関数をイベントマクロで使用する

    Excel VBA ユーザー定義関数をイベントマクロで使用する Excel2003を使用しています。 あるセルと同色に塗りつぶされたセルの値を合計したく、下記1のユーザー定義関数を作成しました。 このユーザー定義関数を下記2のイベントプロシージャ内で呼び出して使用したいのですが、可能でしょうか? 可能であれば、どのようにコードを書いたらいいでしょうか? Call を使用するのかな?と思い、コードを追加してみましたが、引数の型が一致しないといった内容のエラーメッセージが表示されてしまいました。 よろしくお願いします。 ------------------------------------------------------------- 1.ユーザー定義関数(同色セルの合計) Function SumColor(hanni As Range, iro As Range) As Double   Dim myrng As Range   SumColor = 0    For Each myrng In hanni     If myrng.Interior.ColorIndex = iro.Interior.ColorIndex Then      SumColor = SumColor + myrng.Value     End If    Next myrng End Function 2.イベントマクロ(C列3行目以下ダブルクリックで塗りつぶし) Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)   If Target.Column = 3 And Target.Row >= 34 Then    Range(Cells(Target.Row, 3), Cells(Target.Row + 1, 38)).Interior.ColorIndex = 36   End If End Sub

専門家に質問してみよう