• ベストアンサー

Publicで宣言した時は「End Sub」でマクロが終わっても変数は保存されるのですか?

Public test As Boolean Sub マクロ1() test = True End Sub をステップインでデバッグしながら実行する時に 一番最初はtestにカーソルをあてるとFalseなのですが 一度「End Sub」まで到達しもう一度「Sub マクロ1()」から始めると test = True を通過する前から testにカーソルをあてるとTrueになります。 でもデバッグ中に四角ボタンで停止するとFalseに戻ります。 そもそもBoolean型の規定値はFalseですよね? これはどういうことなのでしょうか? ご教授よろしくお願いします。

  • dfghhj
  • お礼率99% (432/434)

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

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

こんばんは。 今まで、そんなことは考えてみたことはありませんが、たぶん、確保した変数が、途中で止めることで、壊れてしまうのだと思いますね。ただ、どこにも、こんな話は書かれていないと思います。あえていうなら、不完全なマクロがあるようなプロジェクトでは、Public 変数は置けないということでしょう。 例えば、このようにしてエラーを発生させても、test の値は確保できません。 '-------------------------------------- '第一テスト Public test As Boolean Sub マクロ1()   Dim a As Long   test = True   a = "A" '←エラーを発生させる End Sub ''End Sub まで、来ないと値を確保できないのです。 '-------------------------------------- '第二テスト Public test As Boolean Sub マクロ1() '1   MsgBox test   test = True End Sub Sub マクロ2() '2   Dim a As Long   test = True   a = "A" '←エラーを発生させる End Sub '1 --> 2 (エラー発生) -->3 で、チェックする。 '-------------------------------------- これで分かるのは、エラーが発生すると、今まで確保した値が飛んでしまうということです。 だから、必ず、On Error トラップで、最低でも、End Sub まで持ってこさせなくてはなりませんが、次の例の場合は、やはり、変数の値は確保できません。 '-------------------------------------- '第三テスト Public test As Boolean Sub マクロ3()   MsgBox test   test = True   Call マクロ4 End Sub Sub マクロ4()   Dim a As Long   On Error GoTo ErrHandler   a = "A" ErrHandler:   If Err.Number > 0 Then    End   End If End Sub 'マクロ3のみ '-------------------------------------- 以下の、コメントブロックして、マクロ3に戻って、End Sub をすれば、値は確保できます。 '  If Err.Number > 0 Then '   End '  End If

dfghhj
質問者

お礼

おお! 私の変わりにいろいろテストしてもらってすいません! 大変参考になりました。 ありがとうございます。

その他の回答 (1)

  • denbee
  • ベストアンサー率28% (192/671)
回答No.1

とりあえず、参考書なりネットなりでPublicの意味をもう一度調べてみてください。 Public宣言とは、変数のスコープがプログラム全体を指します。 従って、マクロ1を完了した後でも、一度設定された値を保持していますから、 再度マクロ1を動かせば、前回保持した値が有効になっていてTrueとなります。 また、デバッグ中に停止するということは、プログラム自体の停止ですから、 変数testもクリアされます。従って、規定値のFalseに戻ります。

dfghhj
質問者

お礼

ちゃんとPublicを調べてみます。 ありがとうございます。

関連するQ&A

  • マクロ subプロシージャーは指定できない?

    accessのマクロの アクション:プロシージャの実行 は、 subプロシージャーは指定できないのでしょうか? 標準モジュールに Sub test1() MsgBox "プロシージャーの実行のテストです" End Sub Function test2() MsgBox "プロシージャーの実行のテストです" End Function と作り、 マクロのプロシージャの実行で プロシージャ名をtest2()にすると、うまく表示されますが、 test1()だと、失敗します。 subプロシージャーをマクロで呼び出す方法を教えてください。

  • VBA EnableEventsの動作

    Win7 Excel2013使用 Application.EnableEventsの動作でおかしな事がおきているので 解決方法を教えて頂きたいのですが、 シートの並びかえマクロを作成し、 その中で最初と最後にApplication.EnableEventsとscreenupdating を false→処理→trueで設定しています。 マクロ実行後、別のマクロ(sheetchangeイベント)を実行しようとしたところ マクロ動作せず、状況を調べるために sub test() msgbox Application.EnableEvents msgbox Application.ScreenUpdating End sub 上記testマクロでそれぞれの状況を表示させたところ、どちらもtrueがかえってきました。 ただ、もう一度このtestマクロを実行するとApplication.EnableEventsだけfalseとなります。 シートの並びかえマクロのデバッグで検証を行いましたが、特にエラーはなく、最後のtrueまで 実行される事は確認しました。 何か考えられることはありますでしょうか?

  • 元のプロシージャーを取得するプロパティ

    Sub test1() Call test2 End Sub Sub test2() If ?? Then MsgBox "test1から実行されたマクロです。" End If End Sub 上記のコードで どこから実行されたプロシージャ化を取得する方法はありますか? 現在は、 Dim bl_test1_yes As Boolean Sub test1() bl_test1_yes = True Call test2(bl_test1_yes) End Sub Sub test2(bl_test1_yes) If bl_test1_yes = True Then MsgBox "test1から実行されたマクロです。" End If End Sub としていますが、 元のプロシージャーを取得するプロパティがあれば教えてください。

  • エクセル2000で動いたマクロが2003で実行時エラー!

    会社のWindows2000、エクセル2000では問題なく動いたマクロですが Sub test01() ActiveSheet.Protect , Password:="XX", UserInterfaceonly:=True End Sub これを自宅のWindowsXP エクセル2003でうごかすと実行時エラーがでます。 「実行時エラー448 名前付き引数が見つかりません。」となってしまうのです。 Sub test02() ActiveSheet.Protect , UserInterfaceonly:=True End Sub とすれば動くのですが、そうするとシートに保護がかかっているのでパスワードを聞いてくるようになってしまいます。 エクセル2003ではどのように書くべきなのでしょうか?できれば2000も2003も共通の記述でOKになるようにしたいのですが。 ご教示をお願いします。

  • SubとEnd Subについて

    VBScriptのSubとEnd Subについて教えて下さい。 Dim LogonID Dim Password Dim URL Dim objIE Dim objINPUT Dim BodyText Dim AriNashi LogonID = "XXXXXXXX" Password = "XXXXXXXXX" URL = "https://login.yahoo.co.jp/config/login?.src=www&.done=http://www.ya..." 下記のようなプログラムはうまくいくのですがSubで囲むと何故か動作しなくなってしまいます。 使い方が間違っているのでしょうか? Set objIE = WScript.CreateObject("InternetExplorer.Application") objIE.Navigate URL objIE.Visible = True Do Until objIE.Busy = False WScript.sleep(250) Loop If objIE.document.URL = URL Then BodyText = objIE.document.body.innerTEXT AriNashi = InStr(1, BodyText, "Yahoo") If AriNashi > 0 Then Set objINPUT = objIE.document.getElementsByTagName("input") objINPUT(0).value = LoginID objINPUT(1).value = Password objINPUT(2).Click Else msgbox "NO" End If Else WScript.Echo " ダ メ" & Err.Description End If Set objIE = Nothing

  • エクセルVBAにて保存するとき

    Private Sub Workbook_BeforeClose(Cancel As Boolean) If MsgBox("エクセルを終了してもよろしいですか?", vbYesNo) = vbNo Then Cancel = True Exit Sub End If Application.DisplayAlerts = False Application.Quit End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) MsgBox "そのボタンでは保存できません。" & vbCrLf & _ "雛形は残しておきましょう" & vbCrLf & _ "" & vbCrLf & _ "ツールバーの「マクロなし出力」から保存できます。" Cancel = True End Sub という二つのマクロをThisworkbookにいれてあるんですが、 この二つを有効(今は2つ目を'でコメント状態にしてあるので保存可)にすると保存できなくて困っています。 二つを有効にした時はどのようにほぞんすればいいですか?

  • 「一定の時間間隔で5秒毎にMacro1を実行する」

    「一定の時間間隔で5秒毎にMacro1を実行する」 一応startマクロ、stopマクロは作成してみたのですが、 下記stopコマンド実行しても止まらなかったような気がします。 ここから改変するとしたらどうですか? Public timestop As Boolean Sub test() Dim tt As Double Dim wt As Double tt = Now + TimeValue("00:00:05") '5秒後 wt = TimeValue("00:00:02") 'インターバル2秒 Application.OnTime tt, "Macro1", wt If (timestop = False) Then Time = Timer Application.OnTime earliesttime:=(Now + TimeValue("00:00:01")), procedure:="test" End If End Sub ---------------------------------------- ここからstart,stopマクロ Sub t_start() timestop = False Call test End Sub Sub t_stop() timestop = True End Sub

  • エクセル ブック(マクロを含む)を保存してとじると、また開きます。

    ブックに保護をかけた状態で保存してあります。 共有状態にあり、マクロを有効にしてもらいたいので、 (1)開くときに保護解除 (2)保存のときに、保護をかけて保存後、(まだ閉じるとは限らないので)保護解除 ということをやろうとし、以下のように書きました。 エクセルごとではなく、このファイルのみ終了しようとすると、 開いた後と上書保存後に保護を解除する為、 ファイルを終了する時には必ず「変更を保存しますか?」と訊かれ、 その時に「はい」を選択すると、一度はそのファイルが終了するのですが、 すぐに マクロを含むファイルを開くときに出るメッセージ「セキュリティ警告マクロ マクロ有効 マクロ無効 詳細」が出て、また開こうとします。 保存「いいえ」を選択すると、普通に終了します。 エクセルごとを終了すれば保存「はい」にしても、普通に終了します。 このファイルのみ終了する時、保存の確認で、「はい」を選び、普通に終了するには、何を直したらよいでしょうか? その前に、根本的に間違ってたりしますでしょうか・・・。 よろしくお願いします。 ThisWorkbookに、 Private Sub Workbook_Open() ActiveSheet.Unprotect Password:="(パスワード)" End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) ActiveSheet.Protect Password:="(パスワード)" Application.OnTime Now, "保護解除" End Sub 標準モジュールに、 Sub 保護解除() ActiveSheet.Unprotect Password:="(パスワード)" End Sub

  • EXECLの変更を保存せずにブック強制的に閉じる方法を

    困り果てています VISTAとXPでマクロで EXECLの変更を保存せずにブック強制的に閉じる方法を 教えていただきたいのですがテストをしてみたマクロは 下記のようなものですがですがうまく動作しません シートの中にスピンボタンがありセルの中の数字を 変えると変更を保存しますか? となります。 Sub Auto_Close() ThisWorkbook.Saved = True End Sub Sub 例1434()   ActiveWorkbook.Saved = True ActiveWorkbook.Close End Sub Sub 13() ThisWorkbook.Close SaveChanges:=False End Sub Sub CloseBook() Application.DisplayAlerts = False ActiveWorkbook.Close Application.DisplayAlerts = True End Sub Sub CloseBook2() ActiveWorkbook.Close savechanges:=False End Sub いずれもだめでした 良い方法をお教えください。

  • ExcelのマクロでのExit Subの役割とは

    久しぶりに Excel のマクロについて 質問させていただきます。 実際に作ったマクロはとても長いのですが 問題となった部分を簡潔にまとめて記載します。 Sub test() Range("A1") = 0 入力 = Application.InputBox("入力") If 入力 = "a" Then Call test End If Call test2 End Sub Sub test2() Range("A1") = Range("A1") + 1 End Sub これにより 「a」を入力している限りは先へ進めず 「a」以外を入力したところで セルA1に「1」と表示させるつもりでした。 しかし実際には 「a」を入力した回数プラス1が セルA1に表示されてしまいます。 仕方がないので Call test の後に Exit Sub と入力したところ、希望通り セルA1には「1」と表示されました。 Exit Sub を入力しなくても 何度も test() に戻るだけで Range("A1") に影響するのは、最後の Call test2 による1回だけと思うのですが なぜこのような結果になるのでしょうか。 今回もマクロについては まだまだ素人だと痛感しているところです。 回答をよろしくお願いいたします。

専門家に質問してみよう