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

VBAですが、VBE1行目に宣言(Option Explicit)を書いてから、Sub~End Subとプロシージャを書いていくと習いました。
ですが、仕事で使用しているファイルのVBEを見たところ、この宣言が書かれておらず、その代わりに
Public ◎◎
Public △△
…と、無数の「Public~」が書かれていました。
※◎◎や△△は、たしかSubやBooksだったと思います。

これ以降の行にはもちろん、プロシージャが書かれているのですが、これはどういうことでしょうか?
宣言がなくてもプロシージャは動くんですか?
ちなみに、このブックにはたくさんSheetやModuleがあるのですが、Option Explicitが書かれたVBEは一つもありませんでした・・・

A 回答 (8件)

こんばんは


すでに的確な回答は出ておりますが、私的意見です。
>宣言がなくてもプロシージャは動くんですか?
動きます。
>無数の「Public~」が書かれていました。
同じモジュールに複数のプロシージャを書く事は可能です。
経験上、7~800行程度なら問題なく動くと思います
(遠い昔、同じモジュールに大量に書くと不具合が出ると聞いたことがあります)
Typeステートメント
Type
End Type みたいな記述もあったりして、、

Option Explicit 私は書くようにしています。
VBEのオプション設定(チェックボックス)は編集後の継続以外は全てONです。
プロの方やハイレベルの方はどうなのか分かりませんが、少しでもデバッグに時間をかけたくないので付けています。
確かに私も一時期は宣言の強制はしていませんでしたが、スペルミスや適切でない場所でのプロパティ入力ミス、型エラーなどでのデバッグ時の不要な実行時エラーを防ぐ為、付けるようになりました。原因が判りやすい(実行前にコンパイルエラーで確認できる)
不要と言えば不要で宣言は面倒ですが、べた書きの場合はあった方が良いように思います。
参考サイトのコードサンプル(プロシージャ)も敢えてなのかも知れませんが、コンパイルできないサンプルがよくありますね。
    • good
    • 0

>Public ◎◎


>Public △△
>…と、無数の「Public~」が書かれていました。

Public ◎◎ As ~ は変数の宣言ですが、この書き方は複数のモジュール間で共用する場合の書き方なので無闇に消すと他のモジュールに支障をきたす可能性があります。
本来そのモジュールのみでグローバル変数として宣言するなら普通 Private を用いますし。
    • good
    • 0

こんばんは。



>Public ◎◎
>Public △△
>…と、無数の「Public~」が書かれていました。
>※◎◎や△△は、たしかSubやBooksだったと思います。

改めて内容を確認してみました。
下記はプログラムですね。 これは削除するとエラーになるかと思います。
Public Sub ○○ ’これは、消すとエラーになりますね。
処理
End Sub

下記は、変数の宣言ですね。 こちらは、消しても大丈夫な事が多いかと。
Public ○ As ~
    • good
    • 0

『Option Explicit』ってコード作成時に『書く・書かない』で考える事は少ないかと。


そもそも私もわざわざ書いた事ないです。

それは、
Option Explicitって何?
http://officetanaka.net/excel/vba/beginner/11.htm
[変数の宣言を強制する]にチェックを入れる(最初は入ってない)事により書く必要がなくなるからです。
初心者向けにはまずチェックする事を推奨してますが、多分そのExcelアプリのVBE画面ではチェックしなかったのでしょう。
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。そうなんですね!!
宣言のチェックについては、参考書に必ずといっていいほど書かれていますよね。書かないといけないものだと思っていたので、ご意見が意外でした…
そしてオフィス田中の田中先生のサイトのご紹介ありがとうございます。
やはり人気ですね!拝見します!

お礼日時:2021/11/22 18:35

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

mygoonicknameさん、再びありがとうございます!!
実験したところ、たしかに宣言のありなしで、MsgBoxの値に影響が出ますね…
自分が見ていたファイルは、さらにエラーメッセージが出たのでそこが謎ですが、引き続きデバックでよく観察したいと思います。

そして参照URLもありがとうございます!!
紹介くださったのはオフィス田中の田中先生のサイトですよね?
実は田中先生の動画がわかりやすくてよく見てるのですが、こちらのページは読んだことがありませんでした…冒頭から田中節が出ていて面白いですね(笑)。
そしてもう一つの方も、まさにPublic、Private等の違いが知りたかったです。
これから自主勉に入るので、サイトじっくり読ませて頂きます。

お礼日時:2021/11/22 18:29

「vba public private」で検索してみましょう。



Option Explicit の有無は関係ありません。
    • good
    • 1
この回答へのお礼

ありがとうございます!検索してみます!

お礼日時:2021/11/21 07:04

こんばんは



>宣言がなくてもプロシージャは動くんですか?
動きます。

「Option Explicit」はそのモジュール内で変数を明示的に宣言することを意味するものです。
(この場合は、宣言されていない変数を使用しようとすると、コンパイル時にエラーになります)

一方で、このステートメントがない場合は、明示的に宣言されていない変数も使用可能になります。
https://docs.microsoft.com/ja-jp/office/vba/lang …
    • good
    • 1
この回答へのお礼

おはようございます。
ご回答ありがとうございます!
動くんですね(というか思えば、自分のPCで実験すればよかったです。すみません・・・)
Option~は、変数を定義していないとエラーが出るというのは、わかりやすいアラートで良いですね。

今ふと思ったのですが、ひょっとするとあえてこのOption~を宣言しないのは、設定した変数を他のモジュールでも使えるようにするためという場合もあるんでしょうか(・・;)?
※Option explicitを書いてしまうと、どのモジュールにも、一々「Dim」「Public」を書かないとエラーが出てしまう?

たった今実験をしたのですが、モジュール1にPublic i という変数を設定して、適当なプロシージャを作りました。
その後、モジュール2を新たに作り、こちらには冒頭にPublic iの表記はいれずに、プロシージャをいきなり書きました。すると2に書いたプロシージャの方も作動しました!

たしか職場のファイルは、VBAが書かれたSheetやModuleすべてに、冒頭にPublic~は書かれていなかったような気がします。
そのため、「Dim ~がないのに、どこでこの変数を設定してるんだろう?」と悩んだような気がします。
変数の設定はどこかのモジュールにしておいて、他のモジュールはプロシージャを書くだけでOKの状態にするために、あえて宣言なしなのでしょうか。

謎すぎます…
今日引き続き自主勉します。

お礼日時:2021/11/21 07:04

こんばんは。



Option Explicitは、使用する変数の宣言を、強制する命令文になります。
Dim ○ As ~とか、Public ○ As ~  ○は変数です。
これがあると、宣言していない変数があるとエラーがでます。
無くても動きますが、仮に、どこかで変数を間違えて書いても、中々気付け
ないという事があります。 ですので、書かれるのを推奨しています。
    • good
    • 1
この回答へのお礼

おはようございます。さっそくありがとうございます!
そうなんですね!
そのマクロを作ったのは、私は面識がないのですが、周囲から相当の上級者と聞いてきた方です。
そんな方がなぜ宣言しなかったんですかね…よっぽど自分の腕を信じていたのか(^▽^;)

追加で恐縮なのですが、ただ、宣言をしなくてもエラーを出ることはありますか?
というのも、現在このファイルをコピーした実験ファイルを作り、VBAの中身の書き換えを行っています。
Sub~以降のプロシージャ部分はコピペしたのですが、冒頭に書かれた変数(Public ◎ As~)などは意味がわからなかったのでコピペをしませんでした。
すると、「SubまたはFunctionが定義されていません」というエラーが出ました。
そこで、ためしに冒頭のPublic~をすべてコピーして、実験ファイルの冒頭に貼ったところ、このエラーが消えました。

お礼日時:2021/11/21 06:41

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