お風呂の温度、何℃にしてますか?

お世話になります。
エラー構文の雛形を作成中ですが、Public宣言変数(Public tgt As Variant)が変な動きになりましたので質問いたします。
a1)M01_Main[Module]を含むProject内別Moduleの宣言セクションでPublic tgt As Variant
a2)M01_MainのSub m01_Start[Procedur]中のCall文にブレークポイント(いかBP)を設定
a3)m01_Startからデバック/ステップイン/実行-継続(開始)
a4)⇒『tgt=ABC』~途中処理(極々簡単な処理)・・・
a5)⇒Dim arg_rslt As String,Dim arg_errInfArr(0 To 4) As String
a6)⇒Call S01_Ave.s01_01Data(arg_rslt, arg_errInfArr())【BPで停止】※
Call先へ飛び
b1)s01_01Data(ByRef arg_rslt As String, arg_errInfArr() As String)
b2)⇒『tgt=xyz』~途中処理・・・
b3))⇒EndSub⇒m01_Start
の構成で、※BPで停止後、F8キーでs01_01Dataにカーソル移動、その後に実行-継続すると、ダミーで仕込んだa側エラー/b側エラー発生に対し、意図した動作(tgt=xyz含み)でエラー表示後、終了します。
しかし、
※BPで停止後、m01_Start側から、実行-継続するとs01_01Data側でtgt=xyzとならず、tgt=””になってしまいます。
MSの言う『ほとんどの場合、・・・は保持されますが、意図しない・・・Public 変数の値が破棄され、・・・。 Public 変数がアプリケーション終了時まで有効であること・・・は、推奨されません。』とは、少し違うような・・・・

Q1:皆様は、このような事態に遭遇した事がありますか?
Q2:Public宣言変数の問題でなく他の問題か?(そうは言ってもF8キーなら意図した動作になるのだし・・・、デバックモードの問題?)
Q2:このような現象があると、ごく簡単な短期使用(数行で処理が終了する様な)であっても、Public宣言変数の使用は控えるべきなのか?

以上、よろしくお願いします。

質問者からの補足コメント

  • お騒がせしました、自己解決ました。

    エラー表示用のモジュール名称取得、プロシージャ名取得
    tgt=Application.VBE.ActiveCodePane.CodeModule 側の問題でした。
    「開いているMain」「F8で開いたSub」はOKで「継続-開始で開いていない」はNG・・・
    自己解決ではなく、あきらめです。

      補足日時:2018/09/06 15:51
  • ありがとうございます、質問不具合の本質はActiveCodePane.CodeModule問題でしたが、Public変数の予期せぬエラー発生を考えると、短期使用もPublicは控えるべきと思いました。何でPublicを教えるのだろうか?
    以前WindFallerさんとのやり取りで『汎用変数は各モジュール先頭にコピペ』と、自分で決めましたが、汎用変数が当方実力もあり、読易/使易優先で temp,temp1,temp2,temp3 str_,str1//str3,rowPos,rowCnt,i_,j_,k_, rngStr,rngStr1//rngStr3・・等々で多く、これを各モジュールにコピペは『くどくなる』ので、Project内別Module(汎用変数設定用)で宣言したまま使用していました。
    WindFallerさんは、短期使用汎用変数をどの様に定め、どの様に管理していますか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/09/10 14:10

A 回答 (2件)

こんばんは。



>お騒がせしました、自己解決ました。
一般論ではないのでしょうか?

Q1:一時期は、その変数をチェックするマクロを付けていましたが、プロシージャーであっても、パラメーター(引数)で与えたほうが安全です。

Q2:一度、内部でエラーを発生したら、Public変数など、いつの間にかなくなっています。

>Q2:このような現象があると、ごく簡単な短期使用(数行で処理が終了する様な)であっても、Public宣言変数の使用は控えるべきなのか?

Module内ならともかく、Project 全体で、変数の内容をメモリ内で共有させるのは無理があります。Public Const 以外は、Public 変数は避けたほうがよいというのは、ずっと私は変わりません。
この回答への補足あり
    • good
    • 0

こんばんは。



>Project内別Module(汎用変数設定用)で宣言したまま使用していました。
>WindFallerさんは、短期使用汎用変数をどの様に定め、どの様に管理していますか?
 私も同じようにしていました。しかし、結果的には、変数は、どんどん減ってしまいました。

具体例ですが、ここの『教えて!goo』を利用するためのマクロで、'Initiation' というモジュールのグローバル定数等の、もっとも最初の部分です。

'Module1
Public Const BaseName As String = "oshiete.goo.ne.jp"
Public Const BaseUrl As String = "http://oshiete.goo.ne.jp/"
Public pageCnt As Variant '←死んでいる*
'Module2
Public Const Editor As String = "C:\Program Files\Hidemaru\Hidemaru.EXE"
Public Const DOCPATH As String = "C:\Users\xxxxx\Documents\Excel\"
Public Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Public editFlg As Boolean '←これは生きています**
Public Const editTEXT As String = "C:\Users\xxxx\Documents\Text\"

**生きている方は、一つのマクロが起動する時に、editFlg のTrue / False で挙動を変えるというものですから、長くその値をとどめて置く必要がありません。変数で渡してやらないと、CheckBox で取るというのはコードの流れとしてうまくないと思いました。それと、以下のコードのプロシージャのPasteTextEditorは、サブルーチンではなく、まったく独立して使えるわけです。

Sub isLog2Edit() ' こちらで指示して
'****省略****
If ActiveSheet.CheckBoxes(n).Value > 0 Then
gEditFlg = True
Else
gEditFlg = False
End If
End Sub
Public Sub PasteTextEditor() 'こちらで命令を替える
If editFlg Then
Shell """C:\Program Files\Hidemaru\Hidemaru.EXE""/z /m5 /j5 """ & editTEXT & "log2.txt" & "", vbNormalFocus
Else
'**** 省略 ******
End If
Call CopyBuftoClip(buf) 'エディタに貼り付け

End Sub

とまあ、大したモノではありませんが、このようにして行っています。

>何でPublicを教えるのだろうか?
実務では、標準モジュールに関して、変数において、Public 変数が特に必要だということはありませんね。Public 定数のみにほとんどは限られるような気がします。ここらが、私は本当にはよく分かっていないかもしれません。Class で生成したインスタンスや、そのオブジェクトの中のプロパティを利用した場合を考慮していないからです。

手元の教本では、Public 変数の値を失う原因として、
・イレギュラーなトラブル発生(内部エラー)
・新しいプロシージャを使いするなどの変更を行う
・マクロの実後を中断して終了する
・End ステートメントを実行する
・ワークシートにActiveX コントロールを使いする命令を含んだプロシージャの実行が終了

となっています。

ところで、私自身の疑問は、複数のプロジェクトをひとつの変数で共有できないだろうか、と思うことがありますね。直接、そんな必要は起きないでしょうけれども。やはり、Class が関係してくるのでしょうか。何か、ここらはいつもモヤッとしています。
    • good
    • 0
この回答へのお礼

ありがとうございました。
当方も改めて「Public変数」の破棄等に関してネット確認しました、いろいろなパターンが有る様です。
Public変数:temp,temp1,temp2,temp3 str_,str1//str3,rowPos,rowCnt,i_,j_,k_, rngStr,rngStr1//rngStr3・・は
●『短期使用:数行で処理が終わる物、他処理を跨がない(跨ぎはbyRef/セル渡し)、値再設定からはNG(temp=temp+1:NG⇒temp=1,temp=temp+1:OK)での【イレギュイラーな破棄リスク】』と
●『Public変数設定用モジュール(各Prj毎に最新版をインポート)に対し、各モジュールorプロシージャ用にPrivate扱い/重複記述の【手間】【見苦しさ】【統一性の無さ】・・・』
のバランスで決めれば良いのかと。

仮に【破棄】で?迷路になった場合、『深追いせずセル渡しにする。』事とし、
現状の自分のPrgレベル/課題レベル(ClassはDeviceXPlorer OPC Serverで使用したばかり)に合わせPublic変数設定用モジュール(インポート/エクスポート) で行く事にします。

(事が起きるごとに方針がフラフラしますが、会社/組織での積上/歴史/標準書・・・が無い中では致し方無いのかと。)

お礼日時:2018/09/14 08:24

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


おすすめ情報