Option Explictについて教えてください

このQ&Aのポイント
  • Option Explictとは、コンパイルエラーを防ぐための指定です。実行時に変数が定義されていない場合にエラーとなり、ミスを防ぐことができます。
  • 初心者はVBEの「ツール」の「オプション」で「変数の宣言を強制する」にチェックを入れることを推奨します。
  • Option ExplictはVBAのコーディングルールの1つであり、変数宣言の必要性を強調しています。マクロの記録を修正する際にも活用できます。
回答を見る
  • ベストアンサー

Option Explictについて教えてください

WEBでOption Explictを検索したら ------------------------------------ option explicit を指定して実行すると、 「コンパイルエラー変数が定義されていません。」 のエラーが出て、青色に反転します。 つまり、単純ミスが防げます。 option explicit が無いと ミスがミスと分からずに実行しますので、 間違った結果が出てしまいます。 option explicit は無条件に定義しましょう。 ---------------------------------- 変数の宣言を強制されるため、 変数のタイプミスを防ぐことができます。 ---------------------------------- 初心者はVBEの「ツール」の「オプション」 「編集」を選択して「変数の宣言を強制する」 (初期状態ではチェックがついていません) には必ずチェック。 ------------------------------------ 変数を宣言しているのはユーザーの環境が、 Option Explicit と明示的に変数を宣言することを 要求されている可能性があるので「エラーが出ました」 という場合があるからです --------------------------------- など色々と見つかりました。 一番わかりやすかったのは ↓これでした。 http://okwave.jp/qa/q4304440.html また以下のような説明もありました。 Option Explicitをつけた場合とつけない場合で 下のソースを実行してみてください。 abc = "Hello" Msgbox(adc) ↓ で説明のように試してみたら ・つけた場合→コンパイルエラー ・つけない場合→エラーにならずMsgboxは空白 でした。これは理解できました。 ですが以下の場合 Option Explicit Sub Macro1() Sheets("Sheet1").Select Columns("A:A").Select Selection.Copy Columns("C:C").Select ActiveSheet.Paste Application.CutCopyMode = False Range("A1").Select End Sub 多分変数は宣言していないので 「変数が定義されていません」とエラーが出ると 思ったのに、でませんでした。 >変数の宣言を強制されるため >Option Explicit と明示的に変数を宣言することを >要求されている可能性 の説明からの自分の解釈と合致しません。 option explicitを指定すると 【記述内に変数宣言がないとエラーになる】 と解釈したのですがそれは間違っていますか? それともSub Macro1()はどこかに変数宣言が あるのでしょうか? 凄くわかりやすく教えていただきたいです。 【追記】 退職者が残したエクセルファイルにて。 Sheet1~Sheet8まであります。 VBEで見ていくと Sheet1:Option Explict  Sheet2:Option Explict  Sheet3:Option Explict  Sheet4:Option Explict  Sheet5:Option Explict  Sheet6:何も無し Sheet7:Option Explict  Sheet8:Option Explict  次に標準モジュールを見ると Module1:Option Explict Sub Macro2() Module2:Option Explict Sub Macro3()  Module3:Option Explict Sub Macro4() Module4:Option Explict Sub Macro5()  Module5:Option Explict  Module6:Option Explict Sub Macro1() となっています。 Macro1~Macro5は全て マクロの記録のみで作成されています。 これを修正するのですが、Option Explictを 初めて見たので困惑しています。 よろしくお願いします。

  • gx9wx
  • お礼率95% (440/460)

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

  • ベストアンサー
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.3

>option explicitを指定すると【記述内に変数宣言がないとエラーになる】と解釈したのですがそれは間違っていますか?  ⇒誤りです。   変数の記述ミスによる実行時の不正を事前に防止する為に定義するオプションです。   プログラム作りを本業とはしていない一般のExcelユーザが、より早く、より簡単に、   自分のExcel作業を自動化するための目的でマクロを作りたいという場合に、標準では   ないオプションの指定をするのは全く無意味とは言いませんが煩わしいだけなので不要と   考えます。   

gx9wx
質問者

お礼

やはり解釈間違いなのですね。 でもそういう説明はあまり見かけませんでした。 ありがとうございました。

その他の回答 (4)

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.5

> ですが以下の場合 > Option Explicit > Sub Macro1() > Sheets("Sheet1").Select > Columns("A:A").Select > Selection.Copy > Columns("C:C").Select > ActiveSheet.Paste > Application.CutCopyMode = False > Range("A1").Select > End Sub > 多分変数は宣言していないので > 「変数が定義されていません」とエラーが出ると > 思ったのに、でませんでした。 定義されていない変数が使用されている場合にエラーになります。 この例の場合、変数は使用されていないので、エラーにはなりません。

gx9wx
質問者

お礼

>この例の場合、変数は使用されていないので、エラーにはなりません。 変数を使用していて宣言がされてないと エラーをお教えてくれる 親切なオプションという事で理解しました。 どうもありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

#3さんと表現は違いますが、Option Explicit というのは、建前のようなものです。変数について、「私は間違って使わないです」というなら、それはなくても良いのです。 ここの掲示の回答者でも、Option Explicit という所から書く人はいませんね。入れる入れないは、ユーザーの自由だ、というものだと思います。 #初心者はVBEの「ツール」の「オプション」「編集」を選択して「変数の宣言を強制する」 そもそも、この書いている人が間違っています。入門レベルで、明示的な変数を入れるということをお勧めしません。きちんと変数の意味を理解しないままに入れるものではありません。入れても、Variant 型以外に、ほとんど区別が付かないと思います。 #option explicit が無いとミスがミスと分からずに実行しますので、間違った結果が出てしまいます。 ミスがミスというほどのものは、ないと思います。  abc = "Hello"  Msgbox(adc) 確かに、Helloは返ってきていませんが、結果ははっきりしていますから、分かりますでしょう。だいたいは、変数のスペルを間違えたら分かるものです。 この問題で、本当のトラブルというのは、めったに出てくるものではありません。具体的には、主にCurrency(Decimal)型とDouble型等の浮動小数点演算の中で起こるもので、Currency(Decimal)型って何?というレベルでは、変数の強制など意味がありません。また、そういうのは、入門レベルでは分からなくて良いのです。それを、無理に変数とデータ型を入れても意味がありません。 それと、ちょっとリンク先を皮肉ってよいなら、こういうのに、喩え話というのは、難しいと思います。Option Explicit と変数の宣言とデータ型を決めることとは、まったく別の論議です。すでに名前を付けているものに、あらたに、間違えてはいけませんよ、ということ自体は、自己責任でもあります。 変数のスペルだけの問題なら、検索すればよいだけです。変数の宣言するだけなら、ほとんど意味がありません。データ型を入れたら、入門者では、逆に使い分けしにくくなるだけだと思います。したがって、Option Explicit は、それほど重大な意味を持ちません。

gx9wx
質問者

お礼

詳しく説明していだきまして ありがとうございます。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.2

Macro1には変数が使われていません。 従って、モジュールに Option Explicit とあっても Macro1の実行時にエラーにはなりません。 エラーになるのは 変数が使われているにも関わらず宣言がされていない という場合です。 変数とは数値や文字列などを一時的に格納する入れ物です。 ≪参考≫ Excel VBA 入門講座 変数 http://excelvba.pc-users.net/fol5/5_1.html

gx9wx
質問者

お礼

>エラーになるのは >変数が使われているにも関わらず宣言がされていない >という場合です。 大変わかりやすかったです。 ありがとうございました。

回答No.1

Option Explict は、書かれているとおりの内容です 既に動いているプログラムなら 片っ端から先頭に Option Explict を追加しても問題ありません。 で、コンパイルを掛けると 変数宣言しないで いきなり使用しているところがあればそこでエラーが出ます。 マクロへのリンクばかりならエラーは、出ないはずです。 付けて構いません。 基本的に、付けてコンパイルエラーが出たらそこを修正するべきです。 Cindy.

gx9wx
質問者

お礼

お礼が遅れました。 ありがとうございました。

関連するQ&A

  • Option Compare Database

    vbaで Option Explicit がないと、変数の宣言が強制されないけど、 アクセスには Option Compare Database がありますが、 これはどういう役目をなしてるのでしょうか? これがないとどうなるのでしょうか?

  • 「変数の宣言を強制する」にチェックがついてませんで

    win7、オフィス2010を使っています。 VBE画面でモジュールを追加したら 「Option Explicit」 がありませんでした。 ツール→オプションを見てみたら 「変数の宣言を強制する」にチェックがついてませんでした。 これは、デフォルトでチェックはつかないのでしょうか? それとも誰かが外したのでしょうか? このPCは複数人で使っています。

  • On Error Resume Nextを複数のプロシージャーで使うことは不可能ですか?

    Module1に ------------------------------------------- Option Compare Database Option Explicit Sub マクロ1() End Sub Sub マクロ2() End Sub ------------------------------------------- があるのですが ------------------------------------------- Option Compare Database Option Explicit Sub マクロ1() On Error Resume Next End Sub Sub マクロ2() On Error Resume Next End Sub ------------------------------------------- ではなく ------------------------------------------- On Error Resume Next Option Compare Database Option Explicit Sub マクロ1() End Sub Sub マクロ2() End Sub ------------------------------------------- これはできないのでしょうか? エラーになります。 dimもつけても駄目でした。 ひとつづつやっていくしかないのでしょうか?

  • 気のせいでしょうか?

    エクセルVBAで Module1にもModule2にも「Sub test()」がある場合 Module1のtestを実行しようとしたらエラーになったのですが 今も同じ状況ですがエラーになりません。 同じプロジェクト名に同じ名前のプロシージャーがあってもエラーになるのでしょうか? ならないのでしょうか? もしかしてエラーになった時は、 同じモジュール内に同じ名前のプロシージャー名を使ってたのでしょうか? Option Explicit を先頭に置いています。

  • JavaScriptでVBのOption Explicitのように変数の明示的な宣言を強制することは不可能?

    たぶんできないのだとは思いますが、ダメ元で質問です。 JavaScriptでVBのOption Explicitステートメントのように、変数の明示的な宣言を強制することはできないのでしょうか? 調べた限りでは、なさそうですが、将来的に言語使仕様が変わる云々の可能性も含めてコメント頂けると幸いです。 できないとすると、変数のタイプミスによるバグの発見が大変だと思いますが、皆さんはどのように工夫してデバッグされていますか?

  • VBAでワークシートを変数にするとき

    たとえばSheet1とSheet2を一度に選択する場合、 Sub Macro6() Sheets(Array("Sheet1", "Sheet2")).Select End Sub と書くと思います。 ワークシートを変数で書く場合は Sub test() Dim ws1 As Worksheet, ws2 As Worksheet Sheets(Array(ws1.Name, ws2.Name)).Select End Sub と、いちいち名前で指定しなければならないのでしょうか? それとももっと別の書き方があるのでしょうか?

  • excel vba

    vbaプロジェクトで module1,2とフォルダがあって その中でmodule1のmacro_AAからmodule2のmacro_BB をcallできますか。 またコールした場合macro_BB は、macro_AAの変数を利用するには、どのような記述がいりますか。 (1)単に読むだけ (2)macro_AAの変数を書き換える 各場合について教えてください。

  • VBの初心者で、仕事で必要になり、現在、勉強中です。

    VBの初心者で、仕事で必要になり、現在、勉強中です。 VB2005で開発したシステムを、VB2010でリビルドして 実行してみたところ。 TypeInitializationException はハンドルされませんでした。 amest2.ModDeclare のタイプ初期化が例外をスローしました。 『 関連のあるソースは以下の通りです。 Option Strict On Option Explicit On Imports System.IO Module ModMain Sub Main() ' 起動カレントフルパスの取得 psFullPath = Application.StartupPath ←ここで発生。 End Sub ↓ End Module Option Strict On Option Explicit On Imports Microsoft.DirectX Module ModDeclare '共通領域宣言モジュール Public psFullPath As String = "" ' 起動端末のカレントフルパス End Module 』 のエラーがでて実行できませんでした。 このエラーは何が原因で発生するのでしょうか? また、VB2005とVB2010の互換性はどうなのでしょうか? リビルドすれば問題ないと思ったのですが? VBでお勧めの書籍があれば教えていただけませんか?  1)初心者向け   (初めてなので、まずは、初心者向けから)  2)VBのことなら何でも載っている   (何かわからないことがあった場合のために、辞典的に使用したい) よろしくお願いします。

  • Excel VBA Worksheets(())

    Excel2016をWindows10で使用しています。 以下のマクロが実行できません。 Option Explicit Sub raco() Worksheets("Sheet(3)").Range("$B$2:$D$4").FormulaR1C1 = "=Sheet(2)!RC" End Sub Sheet(3)をSheet3,Sheet(2)をSheet2 と書くとSheet3にSheet2の内容がコピーできます。 Sheet(3)のままだと、アプリケーションの定義またはオブジェクトの定義のエラーです。 と出ます。 Sheet(3)のままで、コピーできるようにする方法を教えてください。お願いします。

  • Excel VBA 実行時エラー'1004':

     どちらの処理がより高速であるのかを調べるため、以下の2つのVBAを試作致しました。 Sub Macroコピペ乱数() 'コピペ乱数 Sheets("Sheet4").Select Range("A1:A99999").Formula = "=RAND()" Columns("A").Value = Columns("A").Value Range("B1").Select End Sub 及び Sub Macro繰り返し乱数() '繰り返し乱数 Dim i As Long Randomize Sheets("Sheet4").Select For i = 1 To 99999 Range("A" & i).Value = Rnd Next i Range("B1").Select End Sub  処が、これらのVBAを実際に動作させ様としますと、どちらの場合においても「Microsoft Visual Basic」ダイアログボックスが開いて 「実行時エラー'1004': 'Range'メソッドは失敗しました:'_Global'オブジェクト」 と表示されてしまいます。  さりとて、 Sub Macroコピペ乱数() 'コピペ乱数 Sheets("Sheet4").Select ActiveSheet.Range("A1:A99999").Formula = "=RAND()" Columns("A").Value = Columns("A").Value Range("B1").Select End Sub 及び Sub Macro繰り返し乱数() '繰り返し乱数 Dim i As Long Randomize Sheets("Sheet4").Select For i = 1 To 99999 Range("A" & i).Value = Rnd Next i Range("B1").Select End Sub 或いは Sub Macro繰り返し乱数() '繰り返し乱数 Dim i As Long Randomize Sheets("Sheet4").Select For i = 1 To 99999 Range(Cells(i, 1)).Value = Rnd Next i Range("B1").Select End Sub 等としましても、今度は 「実行時エラー'1004': アプリケーション定義またはオブジェクト定義のエラーです。」 となってしまいます。  どの部分がどの様に悪いのでしょうか?  そして、どの様に修正すれば良いのでしょうか?  尚、使用しておりますExcelのバージョンはExcel2010です。

専門家に質問してみよう