ここから本文です

【VBA】 例えば変数 mypath=Thisworkbook.path があります. これを複数のモ...

aka********さん

2015/7/3100:26:55

【VBA】
例えば変数
mypath=Thisworkbook.path
があります.

これを複数のモジュールから使いたいのですが,

例えばこれをブックを開いた時に定義するとデバッグ・リセット(中止?)すると
このMypathの値が消えてしまい,参照できなくなります.

これを解決するにはどうすればいいでしょうか?

条件は
①変数は全てのモジュールから参照できる
②デバッグ・リセットしても大丈夫
③デバッグ・リセットした後どのモジュールから始めるかはわからない.
④変数とはいっても最初に定義した後は変わることはない
⑤綺麗
です.

現状は
Public mypath
sub 最初に実行()
mypath=Thisworkbook.path
end sub

として全てのプロシージャの一番最初に
call 最初に実行
をつけています.

でもこのやり方はなんか綺麗じゃないので

またClassを使う場合でもプロシージャの一番最初に
Dim ○○ as new □□
を付けないといけない?みたいなので使いたくありません.

イメージとしては
const mypath=Thisworkbook.path
みたいにできれば良いのですが・・・


何か方法がありましたらお願い致します.

閲覧数:
776
回答数:
3
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

hot********さん

2015/7/3107:38:38

最終的にしたい事が不明ですが、


[ その1 ]

標準モジュールで

Public Function mypath() As String
mypath = ThisWorkbook.path
End Function

としておけば、どこからでも mypath モジュールが呼び出せるので、
どこででも

MsgBox "パスは" & mypath & "です"

などで使えます。
これが一番簡単綺麗だと思います。




[ その2 ]

意図的に設定出来て、変数をクリアしても消えないという場合は、セルに埋め込むのが簡単ですが、ワークブックのプロパティの中で、あまり使わない「タグ」に埋め込んで記憶させる方法です。
[ファイル][情報]のプロパティのタグに記憶します。(図参照)
標準モジュールに

Public Function mypath(Optional path As String = "") As String
If path <> "" Then ThisWorkbook.BuiltinDocumentProperties("keywords") = path
mypath = ThisWorkbook.BuiltinDocumentProperties("keywords")
End Function

を用意します。
そして、ThisWorkbookに

Private Sub Workbook_Open()
mypath ThisWorkbook.path
End Sub

を用意して、起動時に1度だけ実行します。
後は、どこででも

MsgBox "パスは" & mypath & "です"

などで使えます。
ちなみに、[ファイル][情報]で、手動でも変更できます。

最終的にしたい事が不明ですが、


[ その1 ]

標準モジュールで

Public...

質問した人からのコメント

2015/8/1 01:06:57

皆さん有難うございました.

ClassをPublicにして使うことにしました
public ○○ as new □□

実は変数がいっぱいあったためFunctionでは見づらくなると思い断念しました.

もう少しClassを勉強してみようと思います.

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

riv********さん

2015/7/3109:10:07

デバッグリセット時にも対応できる方法は変数では無理ですね。

いままでのコードの変更が最小になる方法は「関数」にしてしまうことでしょう。

Public Function Mypass()
Mypass=Thisworkbook.path
End Function

参照するコードのMypassをMypass()と変更。

kak********さん

2015/7/3101:51:45

>2、デバッグ・リセットしても大丈夫
これを満たそうと思ったら、変数に格納する方法ではできません。

>またClassを使う場合でもプロシージャの一番最初に
>Dim ○○ as new □□
>を付けないといけない?みたいなので使いたくありません.
クラスをExcel以外でも使う予定なら質問者さんの考えに同意できますが、Excel以外では使う予定がなければクラスごとに初期化で変数へ値を設定するのは適切だと思います。

>変数は全てのモジュールから参照できる
一見便利そうですが、グローバル変数として利用するのなら「依存性」の観点からは避けた方が賢明です。
Excelで言えば、他のBookにモジュールをエクスポートして利用しようとすると、依存性の影響がよくわかります。

わたしも最初の頃は、「実装上便利」にコードを書いていましたが、経験を積むと「構造的に理解しやすい」「テストが容易」という方向に変わっていきます。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる