質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

1702閲覧

VBA クラスモジュールの値の保有範囲について

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/01/17 02:40

編集2019/01/17 02:48

前提・実現したいこと

現在VBAで開発をしており、エラーメッセージ処理をクラスモジュールにまとめて他の処理から呼び出す、という処理を考えています。
また、クラスモジュールのメンバ(変数)には、作業シートに記載してあるエラーメッセージをもたせたいと思っています。

この場合、クラスモジュールの変数(作業シートから読み取ったエラーメッセージ)の保有範囲は、クラスが生成されたときからプロシージャ処理が完了するまででしょうか。

値の読み込みを一回だけにしたいので、エクセルファイルを開いた時点で上記クラスファイルの値が設定され、エクセルファイルを閉じるまで値を保有させるというのはVBAの性質上できないのでしょうか?
(ファイルを開いた時点でクラスモジュールの静的変数にシートから読み込んだエラーメッセージをもたせておきたい、なイメージです)

解説サイトなどを見たのですが、クラスモジュールの変数はインスタンス生成時に値を破棄することから、クラスのInstancingプロパティを変更したとしても上記処理にはならないのかなと思っています…
クラスモジュールの有効範囲の認識が甘いため生じている疑問だと思うのですが
、可否や実現方法があればご回答頂けると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

標準モジュールのモジュールレベル変数で定義した変数は、Excelを開いてから閉じるまでインスタンスが保持されます。

なので、標準モジュールに
Public errObj as ErrorClass
などと宣言して、ブックを開いた時のイベントなどでインスタンスを生成すればそのインスタンスをブックを閉じるまで使用することができます。

※但し処理の途中でエラーが発生プログラムが途中で強制終了してしまった場合はインスタンスが消えてしまうので注意して実装する必要があります。

ただ、上記のやり方はやはりプログラムが強制終了してしまった場合を考えた場合に安全なプログラムとは言えないと思います。なぜならば溜め込んだエラー情報が意図せず全て失われるからです。

エラー情報をファイルで管理し、処理が呼び出される度にファイルに情報を追加 / 読み込みしていく方が安全な処理になると思います。

[追記]
ここにより具体的な参考になる情報がありますので共有致します。

投稿2019/01/17 03:34

編集2019/01/17 14:49
yamashita_yuich

総合スコア316

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/01/17 03:55

回答ありがとうございます! 回答順でベストアンサーにさせて頂いたのですが、エラー処理の観点も考慮しないといけないのですね…勉強になりました。とても助かりました!
yamashita_yuich

2019/01/17 14:49

より具体的な処理方法をシェアしましたので、よければ参考にしてください。
ExcelVBAer

2019/01/18 00:08 編集

自分も同感です。 Openイベントでクラスに保持しておく方法は使わないです。 理由としては、 デバッグのしにくさ(開発効率の低下)、 ユーザ側へ不信感を抱かせる可能性 が挙げられます。 デバッグ時に、エラー発生⇒ストップをしてしまうと、 またOpenイベントを発生させる必要があるので、 開発効率の低下を招きます。 また、ユーザー側でも、何らかのエラーがあって、 ストップすると途端にあちこちでデバッグが発生するので、 不安感も高くなると思われます。 なので、自分であれば、 各ボタンで実行される処理の初期処理で Publicクラスを生成する方法をとるかと。
TanakaHiroaki

2019/01/19 02:42 編集

baseballyamaさん、ExcelVBAerさんプログラムが途中でエラーストップする場合に備えるという視点が大変参考になります。 ユーザーのITスキル次第では、エラーログをテキストファイルに出力する仕様も選択肢としてあり得ると思っていますが、どうでしょうか。
退会済みユーザー

退会済みユーザー

2019/01/19 02:38

baseballyamaさん、詳細方法の共有ありがとうございます! とても分かりやすく、参考になりました。
ExcelVBAer

2019/01/21 05:33

TanakaHiroakiさん エラーログも場合によっては使いますが、 シート上に出力する方が見やすいかと思います。 テキストを作成するより手軽ですし、 列を分けたり、フィルタできたり、色分けも可能で便利なので、 シートの方を使う事が多いですね。
TanakaHiroaki

2019/01/21 11:24

ExcelVBAerさん エラーログについてのご意見ありがとうございました。 Excelシート(必要に応じて、一般ユーザーに見せない)に 出力するやり方が、よいですね。
guest

0

ベストアンサー

ざっとは試しましたが、

標準モジュール -> Module1
クラスモジュールの変数をPublic宣言(cf. clsobj)

[Microsoft Excel Object] -> Thisworkbook -> Workbook_Open
クラスモジュールの変数のインスタンス生成(cf. Set clsobj ... ) & 値の読み込み

するだけの話ではなくてですかね?
(例えば、Workbook_BeforeClose()とかでset clsobj = Noithingするまでは値は保持されてると思うのですが)

投稿2019/01/17 03:32

sysjojo

総合スコア325

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/01/17 03:54

ありがとうございます! 確かにWorkbook_openで設定すればいいですね… 回答が一番早かったのでベストアンサーにさせて頂きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問