• ベストアンサー

ステートメントについて

お世話になります。 Option Explicitステートメント を記述するのとしない場合の違いが今一良く 分かりません。 どなたかサルにでも分かるようにご教示 頂けませんか? よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

うー。サルでも分かる様にだから。 仮に、工具箱にナイフが沢山入っている。 このナイフをだれの許可も得ず自分は自由に使える事が出来る。 だれも文句を言わない。いわゆる自由きままで大変楽だ。 ナイフを完全に自分のものに出来る。 この様な使い方が 「Option Explicit を記述しない」時の使い方です。 しかし、この方法でなにも悪い所がないと思う。自由に使えるのだから、 むしろ大変便利に思うが。 しかし、そうもいかない所がプログラムの世界なのです。 どうして上手くいかないかって。 もしもだよ。工具箱に沢山入っているナイフが見た目がみな殆ど同じ大きさで 同じ形だ。しかし、ナイフAは、金属を切るナイフ。ナイフBは木を切るナイフ。 ナイフCは紙をきるナイフとした場合、見た目は皆同じ形だし、大きさも同じだと 使う時にあなたならどうする。今回は金属を切るのだけど、ナイフA、ナイフB、 ナイフCどれを使ったらいいのか悩む。 この時、一番に浮かぶのが、ナイフAは金属用、ナイフBは木工用、ナイフCは紙加工用 とナイフにラベルを貼ればいいと思いませんか?。 この沢山のナイフにラベルを貼る作業は、プログラムでは、変数宣言だ。VBでいうと Dim 変数 As 型  です。 じゃー。ナイフに用途別のラベルを貼れば、問題がない。使う時にラベルを見て使えばいいの だから。しかしそーもいかないのが、プログラムの世界だ。 なぜなら、仮にだよ。ナイフが20本程工具箱に入っている。そのナイフにはすべて用途別の ラベルが貼ってあってとしても、あなたは今回、1分間に、金属を切り、次に木を切り、 次に紙を切り、次にまた金属、また紙、木とナイフを6回持ち替えて順番に作業するとしよう。 1分間に6回もナイフを持ち替えるのだから、ナイフに貼っているラベルを確実に確認しながら 順番に作業に適したナイフを探せばいいのだが。しかしだな。所詮人間のする事だ。 人間は完璧なマシンではない。僕なら、ラベルを見間違えることだってある。 金属を切る作業の時に、ラベルを見間違って、紙を切るナイフを勘違いして、金属加工用だと 思って、金属を切ってしまった。当然紙を切るナイフなので、相手が金属だからナイフの刃が折 れてしまった(これがバグだ)。 ナイフを1本全く損をしてしまった。 なぜ、この様な事になってしまったかと言うと。工具箱に入っているナイフを自分一人ですべて 自由に使えるからこの様な事故が起こってしまったのです。 じゃー。この様な事故が起こらない様にするには?。 そう。工具箱に入っているナイフを自分で管理するのではなく、誰かもう一人、雇って工具箱 のナイフを管理する人間をおけばいいのです。この管理する人間をAさんとする。 その人は、ナイフのラベルを管理するだけの人で、あなたが、ナイフを用いて作業する人です。 色んな加工作業で、あなたは、工具箱から、作業に適したナイフを探してその都度作業します。 なにも間違いがない時は、管理する人間Aさんは黙っている。Aさんはいないのと同然だ。 しかし、なにかの拍子にあなたが間違ったナイフで金属を切ろうとした場合、ここではじめて、 管理しているAさんが出てきて、「きみ。ナイフが間違っている。金属をきるナイフはこれだよ」 と注意してくれる。 これなら、あなたは安心して作業出来ないかね。いくら間違っても、管理するAさんがいつも 注意してくれるのだから。 この管理する人間を、「Option Explicit」を宣言する事で、無条件で雇う事が出来るのです。 実際、雇うのは、人間ではなく、コンパイラなのです。 コンパイラに、私がコーディング途中でミスをするから、ミスしない様に見張っていてくれと頼む作業が 「Option Explicit」を宣言すると言う意味です。だから大変重要な宣言文になるのです。 出来るだけ、宣言する様にして下さい。事故(バグ)がおこらない様に。

miruchoko
質問者

お礼

大変詳細にまた分かりやすいご回答頂き 誠に感謝致します。理解致しました。 本当にありがとうございました。

その他の回答 (2)

  • Ishiwara
  • ベストアンサー率24% (462/1914)
回答No.3

サルに分かるかどうか、自信がないのですが、 Option Explicitを宣言しない場合: どんな変数名も使えます(システムが予約した語を除く)。 Option Explicitを宣言した場合: Dim などで変数宣言をしないと、その変数は使えません。 目的は、ミスタイプの防止、異なる変数間のウッカリ同名の防止です(特に複数人で開発する場合など)。

miruchoko
質問者

お礼

なるほどです。 そうですね、複数人の場合など起こりやすいかも 知れませんね。 ありがとうございました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

Option Explicitを記述しない場合変数宣言の有無をチェックしません Sub Macro1   Sum = 0   for n = 0 to 100     Sum = Sum + n   next   MsgBox Sum End Sub といったプロシージャあった場合 変数 sum,nなどが宣言されていなくても Variant型の変数として扱ってくれます このプロシージャで sum = sum + n をタイプミスして sum = sm + n と記述しても エラーになりません しかし実行結果は 期待に反することになります Option Explicitが記述されている場合 このMacro1を実行しようとした時点でコンパイルエラーになります

miruchoko
質問者

お礼

なるほど。 わかりました。 早々ご回答頂きありがとうございました。

関連するQ&A

  • Setステートメントの使い方について

    いつもお世話になっています。 私は普段あまりVBを使わないので、素人同然なのですが、たまたま 業務でVBを使う事になったのですが、一つ疑問に思う事があります。 オブジェクトを扱う際に Set ステートメントと言うものがありますが、 この Set ステートメントを付けた時と、付けなかった時で何が違うのでしょうか? おそらく、メモリの利用方法が違うのかと思いますが、どなたか簡潔にお答え 頂けないでしょうか? 素人考えでは、普通に代入(Setステートメントを使わない)した場合は、 オブジェクトのリファレンスが渡り、Setステートメントを使用した場合は、 内容が渡るのかなぁ。。。 と、おぼろげに考えてはいるのですが。。。 よろしくお願い致します。

  • Excel Setステートメントについて

    Setステートメントの使いかたがよくわかりません。 普通に代入する場合。 SetStr = Range("A2") Setステートメントを使う場合。 Set SetStr = Range("A2") この2つに違いはあるのでしょうか? よろしくお願いします。

  • ExcelVBAのSetステートメントについて

    お世話になります。 この土日で、ExcelVBAの勉強でもしようと思っていたのですが 掲題の件で躓いてしまいました。 具体的には、オブジェクト変数には、Setステートメントを使って 「オブジェクトへの参照」を代入するということらしいのですが、 恥ずかしながら理解できませんでした。 当方、財務・法務を担当しているのでプログラミングとは無縁の キャリアを歩んできました。 Setステートメントについて、知見のある方からご指導いただけると 幸いです。どうぞ、よろしくお願い申し上げます。

  • ActionScript3.0でメールリンクのステートメントを教えてください。

    いつもお世話になっています。 ActionScript3.0でメールリンクのステートメントを教えてください。 URLへのジャンプの方法はわかったのですが、メールリンクのステートメントがわかりません。 例えば、ボタンのインスタンス名がmail_btnという名前で、メールアドレスがxxx@xxx.xxの場合のステートメントを教えてください。 宜しくお願いします。

    • ベストアンサー
    • Flash
  • ステートメントの末尾に半角空白は何故あるのか?

    JavaScriptのコーディング上、 ステートメントの末尾に半角空白は何故あるのか? 書籍では、そのような記述は見たことがありません。 あるWEbの技術解説ページには、下記のように書かれています。 例(□:半角空白) // 絶対指定 scrollTo( 0, 100 )□; // 相対指定 scrollBy( 0, 100 )□ ; この半角空白に関して、 1なぜ入っているのか? (OS,エディターのせい?) 2それがあるメリットは何か? (無いほうが見慣れている) くわしい方に ご教示いただけましたら幸いです。

  • エクセルVBA Callステートメントについて教えてください。

    いつもお世話になっております。 IF ○○○○ Then Call ○○○○なときのマクロ Else Call ××××なときのマクロ Endif というマクロを書きました。 (実際はかなり長くて複雑です) Callを使用すると、 見た目がすっきりする以外に何かメリット またはデメリットがあるのでしょうか。 以下の場合と何か異なるでしょうか? IF ○○○○ Then '○○○○なときのマクロの内容を記述 ~~~~~~~ Else '××××なときのマクロの内容を記述 ~~~~~~~ Endif ご教示いただければ幸甚です。

  • 「:=」の意味

    お世話になります Workbooks.Open FileName:="hogehoge.xls" よく、こう言うステートメントを記述しますが、 この場合の「:=」はどういう意味なんでしょうか。 たとえば「=」と比べて何が違うんでしょうか。

  • ファイル操作の記述について

    度々質問させていただいております。 また不明なステートメントです。 ファイル操作プログラムを見ていると$tFileSizeA = (-s "$sNewsData[20]");のような箇所があります。 おそらくファイルサイズを調べていると思いますが、(-e "file")のような記述も見られます。 これらはどのような事を行っているのでしょうか? またどうように-eや-sの他オプションはございますでしょうか。 どなたかご教示お願いいたします。

    • ベストアンサー
    • Perl
  • excelのifステートメントのテストで…

    御観覧ありがとうございます。 スパテクという本を買って、excelを勉強しようと、 サンプルを打ち込んでいて、何度かエラーになったりしましたが、 調べることや、入力ミスの確認で回避出来ていたのですが、 本通りに打っているのに、 「エラー438、オブジェクトは、このプロパティまたはメソッドをサポートしてません。」 と出ます。 エクセル2007です。入力したプロシージャは、 Option Explicit Dim nSample1_12 As Integer Sub Sample1_12() nSample1_12 = nSample1_12 + 1 ThisWorkbook.Worksheets("sheet1").Range("A1") = nSample1_12 End Sub Sub Sample1_13() Dim sA2 As String sA2 = ThisWorkbook.Worksheets("sheet1").Range("A2") If sA2 = "" Then ThisWorkbook.Worksheets("sheet1").Renge("A2") = "Sample1_13" ElseIf sA2 = "Sample1_13" Then ThisWorkbook.Worksheets("sheet1").Range("A2") = "基本の文法 ifステートメント" Else ThisWorkbook.Worksheets("sheet1").Range("A2") = "" End If End Sub このサンプル13を実行すると、A2にsample1_13と出るはずなそうなんですが…エラーになります。

  • WSFではスクリプティングエラーが検出できない??

    WSHで作成した処理を、単体に切り出したくてWSF化しようとしています。そこで質問があります。WSFファイルでは、明らかに存在しない関数をscriptノードに記述しても、実行時エラーどころかコンパイルエラーすら発生しません。また、Option Explicitなどのステートメントも機能しない模様です。ソースは下記のサイトから拝借して試しています。 http://www.atmarkit.co.jp/fwin2k/win2ktips/324wsfhelp/wsfhelp.html cscriptの実行オプションを色々きりかえてみましたが、やはり現象は再発しました。やはりWSFは過渡期の技術で、antのように要素化した処理を外部から呼び出すといったワザはできないのでしょうか・・・ なにかご存知の方がいたらよろしくお願いします。

専門家に質問してみよう