dポイントプレゼントキャンペーン実施中!

Dim A As Integer




Call Function1

If A = 20 Then Function1 = Function1 + 1
If Function1 = 20 Then MsgBox "てすとてすと"

End Sub
────────────────────────
Function Function1() As Integer




Function1 = Cells(1,1)
End Function
────────────────────────
このような記述で、If A = 20 Then Function1 = Function1 + 1
の左辺のFunctionが引っかかり

コンパイル エラー:
代入式の左辺の関数呼び出しは、バリアント型またはオブジェクト型の値を返さなければなりません。

なるエラーが発生します。
2つ目のIfではエラーが起こりません。

どういうことなのでしょう。関数の呼び出しと誤解される記述なのでしょうか。
関数名というより戻り値としての扱いを意図していました。
ご教授くださると幸いです。

A 回答 (5件)

代入式と式の違いです。


直感的にわかるのは

If A = 20 Then Function1 = Function1 + 1

If Function1 = 20 Then MsgBox "てすとてすと"

の=を<>に置き換えられるか考えてみてください。

If A = 20 Then Function1 <> Function1 + 1

If Function1 <> 20 Then MsgBox "てすとてすと"

では、下はあり得ますが、上はあり得ません。
    • good
    • 0
この回答へのお礼

丁寧にありがとうございます。
両者の違いが理解できました。

関数で戻ってきた値を参照はできるが
変数と異なりそこに代入はできないわけですね。

お礼日時:2019/12/17 14:01

申し訳ございません


「If A = 20 Then Function1 = Function1 + 1」の時の「=」は代入するという意味で使われていますが「If Function1 = 20 Then MsgBox "てすとてすと"」の場合の「=」は比較する意味で使われるだけで、代入ではないのでエラーにならない。というのが正しかったですね
    • good
    • 0
この回答へのお礼

補足してくださりありがとうございます。

お礼日時:2019/12/17 13:58

関数の中で、関数名=値、は戻り値の設定としての意味がありますが、あなたの書き方の場合、再帰呼び出しと捉えらる書き方になります。



関数名=値、の記述は最後に一回にし、さらに、値は変数に変えるのが普通。

ネットにサンプルはいくらでもあります。
ちょっと調べてみましょう。
あなたのような書き方をしている人がいない事が分かります。

さらに言うと、こういう書き方ができるのはVBAだけで、一般的はプログラムでは、returnで戻り値を返します。
VBA独特の間違いとも言えます。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。

元々1つ目のIfがなく、2つ目のIfの部分でFunction1 = 20が成立した時のみMsgboxに当たる処理がしっかりなされてしまっていたので
(再帰的に呼び出すなどはされず、なぜか完全に関数名が変数として扱えてしまっていたので)
関数名は変数として使えると誤解してしまいました。
No2の方がおっしゃるエラーが発生してくれればよかったのですが、このケースではそうならないようです。

関数名というのは呼び出し元のプロシージャでは呼び出すときの1度だけ用いるものなのですね。

お礼日時:2019/12/17 06:07

なにをやりたいのでしょうかね?


変数名と関数名がゴチャゴチャになってます。
「Function ○○」~「End Function」の内では「○○」は変数名として扱われますが、外ではあくまでも関数名なので代入は出来ません。ちなみに「2つ目のIfではエラーが起こりません。」ですがVBAでは全てのエラーを表示するのではなく、最初に見つかったエラーだけを表示します。試しに「If A = 20 Then Function1 = Function1 + 1」を「'」でコメントアウトすれば、今度は「If Function1 = 20 Then MsgBox "てすとてすと"」でエラーが出る筈です。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。
Functionプロシージャの処理が終わった後は、呼び出し元のプロシージャにおいて関数名が"戻り値"という変数になるものと誤解していました。

尚、コメントアウトしても2つ目のIfではなぜかエラーがでません。1つ目のIfの右辺部分もでません。

お礼日時:2019/12/17 05:56

デバックで確認すべきこと。


因数の順番が違う
定数をパブリック変数にしていない
http://shimaphoto03.com/program/vba-func-error/
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。
今回はご指摘のケースとは異なるようです。

お礼日時:2019/12/17 13:55

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A