お世話になります。
エラー構文の雛形を作成中ですが、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宣言変数の使用は控えるべきなのか?
以上、よろしくお願いします。
No.1ベストアンサー
- 回答日時:
こんばんは。
>お騒がせしました、自己解決ました。
一般論ではないのでしょうか?
Q1:一時期は、その変数をチェックするマクロを付けていましたが、プロシージャーであっても、パラメーター(引数)で与えたほうが安全です。
Q2:一度、内部でエラーを発生したら、Public変数など、いつの間にかなくなっています。
>Q2:このような現象があると、ごく簡単な短期使用(数行で処理が終了する様な)であっても、Public宣言変数の使用は控えるべきなのか?
Module内ならともかく、Project 全体で、変数の内容をメモリ内で共有させるのは無理があります。Public Const 以外は、Public 変数は避けたほうがよいというのは、ずっと私は変わりません。
No.2
- 回答日時:
こんばんは。
>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 が関係してくるのでしょうか。何か、ここらはいつもモヤッとしています。
ありがとうございました。
当方も改めて「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変数設定用モジュール(インポート/エクスポート) で行く事にします。
(事が起きるごとに方針がフラフラしますが、会社/組織での積上/歴史/標準書・・・が無い中では致し方無いのかと。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA リボンののリカバリーでオーバーフローエラーになります 2 2023/07/04 19:07
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
- Visual Basic(VBA) vba Sleep関数について教えてください 1 2023/01/18 10:18
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBA 宣言Dimの場所
-
名前が二重に定義されています
-
vbscriptの変数宣言
-
ソケット通信で同時受信の制限?
-
VBSからのサーバサイドのEXEの実行
-
FileCopy時のエラー
-
C# try-catch でcatchに飛ばす方法
-
インクルードしたファイルの関...
-
CentOS6でyumコマンドやrpmコマ...
-
VB6でのPL/SQLの実行について
-
エラー内容について
-
ASP内で他のASPファイルを読み...
-
AutoPostBackにしているが、う...
-
SqlDataSource SelectCommand ...
-
.html ファイルでasp実行?
-
CreateObject("Excel.Applicati...
-
WinXPProにVC++6.0をイン...
-
fopenでエラーとなる
-
Tableを動的に増やしたい。
-
エラー 'ASP 0115'
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA 宣言Dimの場所
-
ソケット通信で同時受信の制限?
-
vbscriptの変数宣言
-
VBSでIEを起動し、拡大率を変更...
-
TCPサーバ bind関数のエラーに...
-
名前が二重に定義されています
-
式はメソッドではありませんと...
-
VBSにてサーバー中のエクセルフ...
-
ASPでAccessのデータを更新、削除
-
誰かVisualBasicのデータフォー...
-
golang 空文字判定について
-
十進BASICについて
-
EXCEL VBA API宣言でコンパイル...
-
標準モジュールPublic宣言変数...
-
COBOLのPERFORM文
-
10万回でも動くようにするには?
-
ダブルクォーテーションの吐き出し
-
ハンゲーム
-
Now関数が12時間表記になる
-
C# try-catch でcatchに飛ばす方法
おすすめ情報
お騒がせしました、自己解決ました。
エラー表示用のモジュール名称取得、プロシージャ名取得
tgt=Application.VBE.ActiveCodePane.CodeModule 側の問題でした。
「開いているMain」「F8で開いたSub」はOKで「継続-開始で開いていない」はNG・・・
自己解決ではなく、あきらめです。
ありがとうございます、質問不具合の本質はActiveCodePane.CodeModule問題でしたが、Public変数の予期せぬエラー発生を考えると、短期使用もPublicは控えるべきと思いました。何でPublicを教えるのだろうか?
以前WindFallerさんとのやり取りで『汎用変数は各モジュール先頭にコピペ』と、自分で決めましたが、汎用変数が当方実力もあり、読易/使易優先で temp,temp1,temp2,temp3 str_,str1//str3,rowPos,rowCnt,i_,j_,k_, rngStr,rngStr1//rngStr3・・等々で多く、これを各モジュールにコピペは『くどくなる』ので、Project内別Module(汎用変数設定用)で宣言したまま使用していました。
WindFallerさんは、短期使用汎用変数をどの様に定め、どの様に管理していますか?