プロが教える店舗&オフィスのセキュリティ対策術

【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

A 回答 (3件)

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/05/16 22:59

呼び出す時の関数の引数、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
 
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/05/16 22:59

まず,


間違い:
tt = Str

正解:
tc = Str


それとセル側の書式設定が文字列になってます。
セルを右クリックして書式設定の表示形式を標準に変えてから,関数を打ち込み直します。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/05/15 18:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!