質問

お世話になります
イメージを描きやすいように、例を挙げます
Function sample()
  MsgBox("こんにちわ")
End Function

こんな関数をエクセル上で
Visual Basic Editorアイコンを押すと
VBA画面が開きますから、コードを書くところに
上の3行の関数、sample()、を記入します

左のイミディエイトウィンドウ(環境によるかも知れません)

sample(Enterキー)
と入力すると
Sub または Function が定義されていません
と、エラーが出ます
ACCESSのVBAであれば、これで実行できる、とおもいますが
エクセルの場合はどうするのでしょうか

通報する

回答 (4件)

こんにちは。

>ACCESSのVBAであれば、これで実行できる、とおもいますが

>Function sample()
>  MsgBox("こんにちわ")
>End Function

初歩的なことですが、Access は、実際には、コントロール側から、ユーザー定義関数を働かせますが、Excelの場合は、通常は、実行型のプログラムは、ユーザー定義関数ではなく、マクロ型(Sub ~End Sub)にします。もし、Excelで実行型のプログラムが必要な場合は、直接コントロール(例:Sub CommandButton1_Click() ~End Sub)に入れてしまえばよいからです。

また、Excelの場合、Function は、複雑な計算に用いるもので、いわゆる設定させたりする、実行型のプログラムは、静的な空間では、通常は不可能なのです。(それを起動させているのは、通常は、それをサブルーチンにして、Enter や別のプロシージャなどの外部的な命令です。)

したがって、例えば、書式を変えたり、入力させたり、メッセージを出したりというのは、ユーザー定義関数では不可能です。(絶対的ではありまんせが、それは、めったに用いられない裏技です。)

Excel の場合、

なぜ、[イミディエイトウィンドウ]から、そのようなコードを実行しなくてはならないのか、意味が分かりませんが、

Call sample()

とすればよいです。
ただし、そのまま、その関数を実行させるには、標準モジュールに書いてないといけません。

通常は実行型にするためには、以下のようにします。

Sub TestPrc1
   MsgBox "こんにちは"
End Sub

Excel上では、実行型のユーザー定義関数は、なるべく、マクロ型(Sub ~End Sub[引数のない完結型])にした方がよいです。また、Accessからコードを移植する場合は、多少、両方のVBAの知識が必要です。

この回答へのお礼

ありがとうございました
ACCESSとの違いをわかりやすく
していただき、助かりました

>Sub または Function が定義されていません

ということはコードが標準モジュールではなくてシートモジュールに書かれているはずです。
VBEのタイトルバーに、Sheet1[コード]などとシート名が表示されてませんか?

シート名が表示されていればそのシートモジュールにコードが書かれているわけですから、
実行する場合は、Sheet名.Procedure名となります。

   Sheet1.Sample  Enterキー

ただ、質問のようなコードは通常「標準モジュール」に書きますから、「標準モジュール」に書けば、質問のように

   Sample  Enterキー

で実行できます。

この回答へのお礼

よくわかりました
実行できました
助かりました

#1です。一つ忘れてた。
イミディエイトウィンドウ上で実行させる場合は
Msgbox sample()
とか
Print sample()
のように結果をどのように処理するか設定すれば確認できます。

この回答へのお礼

ありがとうございました

ユーザー定義関数ならセル上で
=sample()
と入力してEnterですね。
でも内容が計算の結果でなくメッセージの表示ならマクロとして登録のうえ
マクロの実行(登録したボタンorショートカットキー)の方がいいのでは?

この回答へのお礼

ありがとうございました

このQ&Aは役に立ちましたか?0 件

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

新しく質問する

このQ&Aを見た人が検索しているワード


新しく質問する

このカテゴリの人気Q&Aランキング

毎日見よう!教えて!gooトゥディ

べんりQ&A特集