
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ではエラーが起こりません。
どういうことなのでしょう。関数の呼び出しと誤解される記述なのでしょうか。
関数名というより戻り値としての扱いを意図していました。
ご教授くださると幸いです。
No.3ベストアンサー
- 回答日時:
関数の中で、関数名=値、は戻り値の設定としての意味がありますが、あなたの書き方の場合、再帰呼び出しと捉えらる書き方になります。
関数名=値、の記述は最後に一回にし、さらに、値は変数に変えるのが普通。
ネットにサンプルはいくらでもあります。
ちょっと調べてみましょう。
あなたのような書き方をしている人がいない事が分かります。
さらに言うと、こういう書き方ができるのはVBAだけで、一般的はプログラムでは、returnで戻り値を返します。
VBA独特の間違いとも言えます。
ご返答ありがとうございます。
元々1つ目のIfがなく、2つ目のIfの部分でFunction1 = 20が成立した時のみMsgboxに当たる処理がしっかりなされてしまっていたので
(再帰的に呼び出すなどはされず、なぜか完全に関数名が変数として扱えてしまっていたので)
関数名は変数として使えると誤解してしまいました。
No2の方がおっしゃるエラーが発生してくれればよかったのですが、このケースではそうならないようです。
関数名というのは呼び出し元のプロシージャでは呼び出すときの1度だけ用いるものなのですね。
No.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 "てすとてすと"
では、下はあり得ますが、上はあり得ません。
丁寧にありがとうございます。
両者の違いが理解できました。
関数で戻ってきた値を参照はできるが
変数と異なりそこに代入はできないわけですね。
No.4
- 回答日時:
申し訳ございません
「If A = 20 Then Function1 = Function1 + 1」の時の「=」は代入するという意味で使われていますが「If Function1 = 20 Then MsgBox "てすとてすと"」の場合の「=」は比較する意味で使われるだけで、代入ではないのでエラーにならない。というのが正しかったですね
No.2
- 回答日時:
なにをやりたいのでしょうかね?
変数名と関数名がゴチャゴチャになってます。
「Function ○○」~「End Function」の内では「○○」は変数名として扱われますが、外ではあくまでも関数名なので代入は出来ません。ちなみに「2つ目のIfではエラーが起こりません。」ですがVBAでは全てのエラーを表示するのではなく、最初に見つかったエラーだけを表示します。試しに「If A = 20 Then Function1 = Function1 + 1」を「'」でコメントアウトすれば、今度は「If Function1 = 20 Then MsgBox "てすとてすと"」でエラーが出る筈です。
ご返答ありがとうございます。
Functionプロシージャの処理が終わった後は、呼び出し元のプロシージャにおいて関数名が"戻り値"という変数になるものと誤解していました。
尚、コメントアウトしても2つ目のIfではなぜかエラーがでません。1つ目のIfの右辺部分もでません。
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) パーソナルXLSBのfuctionを呼び出すと「Functionが定義されていません」のエラーになる 2 2022/08/22 22:51
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます 1 2022/10/15 16:30
- Excel(エクセル) エクセルで書式設定とフィルタの組み合わせでうまく行かないのですが 4 2022/10/07 10:02
- Excel(エクセル) excel2013 色付きセルの値合計 3 2023/02/28 11:48
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) VBAでファイル名を指定して保存するとき 4 2023/03/26 21:55
このQ&Aを見た人はこんなQ&Aも見ています
-
VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます
Visual Basic(VBA)
-
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
-
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
-
4
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
5
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
6
エクセルVBAで5行目からオートフィルタモードに設定したいたい
Excel(エクセル)
-
7
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
8
[VBA] Classから他のClassを呼び出す場合
Visual Basic(VBA)
-
9
テキストボックスのvalueとtextの違い
Visual Basic(VBA)
-
10
subの配列引数をoptionalで使う方法
Visual Basic(VBA)
-
11
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
-
12
ExcelのVBAでGoToの代わりに…
Excel(エクセル)
-
13
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
14
On ErrorでエラーNoが0
Visual Basic(VBA)
-
15
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
16
【Excel VBA】マクロでExcel自体を終了させたい
Excel(エクセル)
-
17
CSVファイルの中で、「 , 」カンマを使いたい
その他(コンピューター・テクノロジー)
-
18
配列の参照渡しで型が一致しません。
Visual Basic(VBA)
-
19
Excel VBAで、ユーザーフォームの値を、モジュールで使用したい。
Visual Basic(VBA)
-
20
Excel VBA 配列の分割について
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マクロOn Error GoTo ErrLabel...
-
if関数の順番 iserrorが認識さ...
-
VBA 空白行の削除
-
VBAでfunctionを利用しようとし...
-
OpenOffice Basicで簡単な関数...
-
UserForm1.Showでエラーになり...
-
On Error GoTo でエラーが発生...
-
ApplicationとWorksheetFunctio...
-
現在、HP作成業者さんがつく...
-
ExcelにSQLの結果を表示
-
WindowsのプロダクトIDを取得す...
-
検索Find処理を2重、3重とす...
-
インポート時のエラー「データ...
-
EnableWindow()後のGetLastError()
-
オブジェクト型の変数にフォー...
-
VBA データ(特定値)のある最...
-
実行時エラー'1004'の詳細と回...
-
VBA変数をFunction.VLookupの戻...
-
条件式について
-
エクセルVBAの二重ループについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
String""から型'Double'への変...
-
【VBA】ワークブックを開く時に...
-
文字列内で括弧を使うには
-
マクロで"#N/A"のエラー行を削...
-
Excel vbaについての質問
-
VBA データ(特定値)のある最...
-
On ErrorでエラーNoが0
-
ApplicationとWorksheetFunctio...
-
【Access】Excelインポート時に...
-
インポート時のエラー「データ...
-
実行時エラー 438 の解決策をお...
-
オブジェクト型の変数にフォー...
-
.VBSだとADODBのプロバイダが見...
-
実行時エラー'-2147467259(8000...
-
【VB.NET】 パワポ操作を非表示で
-
フランスの生年月日(jj/mm/aaaa)
-
【VBAエラー】Nextに対するFor...
おすすめ情報