VBAですが、VBE1行目に宣言(Option Explicit)を書いてから、Sub~End Subとプロシージャを書いていくと習いました。
ですが、仕事で使用しているファイルのVBEを見たところ、この宣言が書かれておらず、その代わりに
Public ◎◎
Public △△
…と、無数の「Public~」が書かれていました。
※◎◎や△△は、たしかSubやBooksだったと思います。
これ以降の行にはもちろん、プロシージャが書かれているのですが、これはどういうことでしょうか?
宣言がなくてもプロシージャは動くんですか?
ちなみに、このブックにはたくさんSheetやModuleがあるのですが、Option Explicitが書かれたVBEは一つもありませんでした・・・
A 回答 (8件)
- 最新から表示
- 回答順に表示
No.8
- 回答日時:
こんばんは
すでに的確な回答は出ておりますが、私的意見です。
>宣言がなくてもプロシージャは動くんですか?
動きます。
>無数の「Public~」が書かれていました。
同じモジュールに複数のプロシージャを書く事は可能です。
経験上、7~800行程度なら問題なく動くと思います
(遠い昔、同じモジュールに大量に書くと不具合が出ると聞いたことがあります)
Typeステートメント
Type
End Type みたいな記述もあったりして、、
Option Explicit 私は書くようにしています。
VBEのオプション設定(チェックボックス)は編集後の継続以外は全てONです。
プロの方やハイレベルの方はどうなのか分かりませんが、少しでもデバッグに時間をかけたくないので付けています。
確かに私も一時期は宣言の強制はしていませんでしたが、スペルミスや適切でない場所でのプロパティ入力ミス、型エラーなどでのデバッグ時の不要な実行時エラーを防ぐ為、付けるようになりました。原因が判りやすい(実行前にコンパイルエラーで確認できる)
不要と言えば不要で宣言は面倒ですが、べた書きの場合はあった方が良いように思います。
参考サイトのコードサンプル(プロシージャ)も敢えてなのかも知れませんが、コンパイルできないサンプルがよくありますね。
No.7
- 回答日時:
>Public ◎◎
>Public △△
>…と、無数の「Public~」が書かれていました。
Public ◎◎ As ~ は変数の宣言ですが、この書き方は複数のモジュール間で共用する場合の書き方なので無闇に消すと他のモジュールに支障をきたす可能性があります。
本来そのモジュールのみでグローバル変数として宣言するなら普通 Private を用いますし。
No.6
- 回答日時:
こんばんは。
>Public ◎◎
>Public △△
>…と、無数の「Public~」が書かれていました。
>※◎◎や△△は、たしかSubやBooksだったと思います。
改めて内容を確認してみました。
下記はプログラムですね。 これは削除するとエラーになるかと思います。
Public Sub ○○ ’これは、消すとエラーになりますね。
処理
End Sub
下記は、変数の宣言ですね。 こちらは、消しても大丈夫な事が多いかと。
Public ○ As ~
No.5
- 回答日時:
『Option Explicit』ってコード作成時に『書く・書かない』で考える事は少ないかと。
そもそも私もわざわざ書いた事ないです。
それは、
Option Explicitって何?
http://officetanaka.net/excel/vba/beginner/11.htm
[変数の宣言を強制する]にチェックを入れる(最初は入ってない)事により書く必要がなくなるからです。
初心者向けにはまずチェックする事を推奨してますが、多分そのExcelアプリのVBE画面ではチェックしなかったのでしょう。
ご回答ありがとうございます。そうなんですね!!
宣言のチェックについては、参考書に必ずといっていいほど書かれていますよね。書かないといけないものだと思っていたので、ご意見が意外でした…
そしてオフィス田中の田中先生のサイトのご紹介ありがとうございます。
やはり人気ですね!拝見します!
No.4
- 回答日時:
No.1の者です。
簡単な実験?ですが、例えば、下記の様なプログラム、Dim I As Long:Iを
宣言して、全体的に使用すると明示しています。
test()を実行すると、プログラム内から、test2へCallして、プログラムが
移行しますが、Dimで宣言していないと、変数:Iの情報が引き継がれ
なくなります。
【結果】
Dim I As Long を宣言すれば、1が表示される。 引き継がれている。
Dim I As Long を宣言していないと、何も表示されない。
test2では、Iが初めて出てきたので、Iには何も情報が入っていないため
Dim I As Long
Sub test()
I = 1
Call test2
End Sub
Sub test2()
Msgbox I
End Sub
下記が参考になるでしょうか?
http://officetanaka.net/excel/vba/beginner/06.htm
https://www.tipsfound.com/vba/02015
mygoonicknameさん、再びありがとうございます!!
実験したところ、たしかに宣言のありなしで、MsgBoxの値に影響が出ますね…
自分が見ていたファイルは、さらにエラーメッセージが出たのでそこが謎ですが、引き続きデバックでよく観察したいと思います。
そして参照URLもありがとうございます!!
紹介くださったのはオフィス田中の田中先生のサイトですよね?
実は田中先生の動画がわかりやすくてよく見てるのですが、こちらのページは読んだことがありませんでした…冒頭から田中節が出ていて面白いですね(笑)。
そしてもう一つの方も、まさにPublic、Private等の違いが知りたかったです。
これから自主勉に入るので、サイトじっくり読ませて頂きます。
No.2
- 回答日時:
こんばんは
>宣言がなくてもプロシージャは動くんですか?
動きます。
「Option Explicit」はそのモジュール内で変数を明示的に宣言することを意味するものです。
(この場合は、宣言されていない変数を使用しようとすると、コンパイル時にエラーになります)
一方で、このステートメントがない場合は、明示的に宣言されていない変数も使用可能になります。
https://docs.microsoft.com/ja-jp/office/vba/lang …
おはようございます。
ご回答ありがとうございます!
動くんですね(というか思えば、自分のPCで実験すればよかったです。すみません・・・)
Option~は、変数を定義していないとエラーが出るというのは、わかりやすいアラートで良いですね。
今ふと思ったのですが、ひょっとするとあえてこのOption~を宣言しないのは、設定した変数を他のモジュールでも使えるようにするためという場合もあるんでしょうか(・・;)?
※Option explicitを書いてしまうと、どのモジュールにも、一々「Dim」「Public」を書かないとエラーが出てしまう?
たった今実験をしたのですが、モジュール1にPublic i という変数を設定して、適当なプロシージャを作りました。
その後、モジュール2を新たに作り、こちらには冒頭にPublic iの表記はいれずに、プロシージャをいきなり書きました。すると2に書いたプロシージャの方も作動しました!
たしか職場のファイルは、VBAが書かれたSheetやModuleすべてに、冒頭にPublic~は書かれていなかったような気がします。
そのため、「Dim ~がないのに、どこでこの変数を設定してるんだろう?」と悩んだような気がします。
変数の設定はどこかのモジュールにしておいて、他のモジュールはプロシージャを書くだけでOKの状態にするために、あえて宣言なしなのでしょうか。
謎すぎます…
今日引き続き自主勉します。
No.1
- 回答日時:
こんばんは。
Option Explicitは、使用する変数の宣言を、強制する命令文になります。
Dim ○ As ~とか、Public ○ As ~ ○は変数です。
これがあると、宣言していない変数があるとエラーがでます。
無くても動きますが、仮に、どこかで変数を間違えて書いても、中々気付け
ないという事があります。 ですので、書かれるのを推奨しています。
おはようございます。さっそくありがとうございます!
そうなんですね!
そのマクロを作ったのは、私は面識がないのですが、周囲から相当の上級者と聞いてきた方です。
そんな方がなぜ宣言しなかったんですかね…よっぽど自分の腕を信じていたのか(^▽^;)
追加で恐縮なのですが、ただ、宣言をしなくてもエラーを出ることはありますか?
というのも、現在このファイルをコピーした実験ファイルを作り、VBAの中身の書き換えを行っています。
Sub~以降のプロシージャ部分はコピペしたのですが、冒頭に書かれた変数(Public ◎ As~)などは意味がわからなかったのでコピペをしませんでした。
すると、「SubまたはFunctionが定義されていません」というエラーが出ました。
そこで、ためしに冒頭のPublic~をすべてコピーして、実験ファイルの冒頭に貼ったところ、このエラーが消えました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 標準モジュール Public mOnTime As Date Sub sample() '実行プロシ 1 2023/02/22 15:44
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- その他(Microsoft Office) VBA メール送信済で実行されるはずが、実行されない時があります。 2 2023/02/02 14:05
- Visual Basic(VBA) VBAに関する質問です 2 2022/03/30 22:44
- Visual Basic(VBA) vbaのvlookup関数エラー原因を教えていただけないでしょうか。 3 2022/04/25 16:16
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- Android VBA、フォルダのパスに環境文字 ㉑ があり、VBAが機能しません。 2 2022/07/27 09:16
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAなくなるの?
-
vba 削除
-
Geogebraの操作方法について
-
現在のブックを閉じないで、マ...
-
Vba SelStart、SelLen教えてく...
-
VBA 複数条件の分岐処理の上手...
-
VBA初心者 Ctrl+での操作、ボタ...
-
VBA指定行削除
-
Vba 実数および実数タイプの変...
-
VBA レジストリの値の読み方に...
-
VBAに詳しい方教えてください。
-
VB.net(VB)で、フォームにExcel...
-
Excelのマクロについて教えてく...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
ExcelのVBAコードについて教え...
-
VBA一覧取得 再投稿
-
2つのマクロでチェックボックス...
-
VBAで各列の"+"と"o"の合計数を...
-
VBA listBoxについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA 宣言Dimの場所
-
ソケット通信で同時受信の制限?
-
vbscriptの変数宣言
-
VBSにてサーバー中のエクセルフ...
-
VBSでIEを起動し、拡大率を変更...
-
TCPサーバ bind関数のエラーに...
-
式はメソッドではありませんと...
-
名前が二重に定義されています
-
golang 空文字判定について
-
ACCESSのAutoKeysマクロでアク...
-
CreateObjectの同時実行時について
-
EXCEL VBA API宣言でコンパイル...
-
SumIFsとDateSerial vba
-
ASPエラー時の内容を任意で...
-
エクセル同一セル内の指定文字...
-
COBOLのPERFORM文
-
C# try-catch でcatchに飛ばす方法
-
FileCopy時のエラー
-
Response.Redirectで引数2つの...
-
EXECLマクロでshapeがグルーフ...
おすすめ情報