Excel VBAのワークブック名を取得する関数の有無

このQ&Aのポイント
  • Excel VBAで複数のワークブックを開いている場合、別のワークブックのユーザーフォームを表示した状態で標準モジュールを実行すると、エラーや誤った計算が発生します。そのため、実行されるワークブック名を取得し、条件分岐に使用する必要があります。
  • ワークブックの名称は変更される可能性があり、都度書き換える必要があります。しかし、実行されるワークブックの名前を返す関数があれば、ワークブック名を手動で書き換える手間を省くことができます。
  • Excel VBAにはワークブック名を取得する関数がデフォルトで用意されていないため、自作の関数を作成する必要があります。ワークブック名を取得する関数を作成すれば、動的な判定が可能になります。
回答を見る
  • ベストアンサー

標準モジュールが入っているワークブック

Excel VBAです。 二つのワークブックを開いておいた状態で 両方のブック内のユーザーフォームを表示した状態にします。 この時、ある片方のワークブックを表示した状態でもう片方のユーザーフォームを使って 標準モジュールを実行したとします。 すると、当たり前ですが、エラーが出るか、間違った計算を行ってしまいます。 これを防ぐために、 if ActiveWorkbook.Name = xxxxx then といったものを用いる必要があります。 ワークブックの名称を書き換えるたびに このxxxxxのところも毎回書き換える必要があり、面倒なのですが、 実行した標準モジュールが入っているワークブック名を 返り値として返す関数ってありますか?

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

  • ベストアンサー
  • ap_2
  • ベストアンサー率64% (70/109)
回答No.1

モジュールの入ってるブックは、ThisWorkbook  if ActiveWorkbook.path = Thisworkbook.path then でいいと思いますが・・・ ActiveSheetじゃなくて、Thisworkbook.SHeets("xxx")の形で指定した方が良さそうですね。

関連するQ&A

  • VBのフォームモジュールと標準モジュールの使い分け

    VBのフォームモジュールと標準モジュールの使い分けが今一つわかっていません。 フォームモジュールとは、フォーム(画面)上で起こったイベント(例えば、ボタンをクリックした時とか、ユーザーが行を選択したりだとか)の処理を、記述するところと解釈しています。 標準モジュールは、フォームが2つ以上あって、その2つが共通する処理(関数)などを、記述したり、フォームが1つでも、同じ処理を繰り返す場合、その処理を標準モジュールに書いたり・・・・という解釈をしています。 あってますでしょうか? フォームが一つしかない場合、もしくは2つあっても、あまり共通する処理がない場合、なんかは標準モジュールはあまり使わないのでしょうか? それとも、フォームが1つとかでも、今後のメンテの事など考慮して、標準モジュールを作ってそこにグローバル変数なんかで処理を書いた方がよいのでしょうか? どなたか、教えてくださいませんか? いろいろBBSなどで見てみるんですが、いろいろ書いてあって、どれが理想か わかりません。よろしくお願いいたします。

  • Excel VBA 標準モジュール内でイベント

    ワークブックのイベントWorkbook_Openを標準モジュールのAuto_Openで代用できるように ワークシートのイベントWorksheet_Changeを標準モジュールで実行できるようにすることは できなものでしょうか。 その他のイベントに関しても情報があれば教えてください。

  • 標準モジュールにコピーして、実行・・・??

    エクセルVBA初心者です。 VBAを勉強すべく関連サイトを見て勉強しようと思ったのですが、 早くもつまづいてしまいました。 コードの例で、 『下記を標準モジュールにコピーして、実行してみてください。』 とあるのですが、 新しいエクセルブックを開いて標準モジュールに、ここでいう "下記"部分をコピペしたところまでは良かったのですが、その先の "実行"の仕方が分かりません。 初心者な質問でお恥ずかしいのですが、どなたか教えてください。 お願いします。

  • エクセルマクロユーザーフォームのtxtbox値を標準モジュールに保持

    宜しくお願いします。 ユーザーフォームのtxtbox値を標準モジュールに渡してマクロを実行 るのですが、一度値をセットしたら20~30回変更が無いので標準モジュール のみショートカットで実行したいのですが値を保持してくれません。 何か良い方法は無いのでしょうか。? 'フォーム起動 Sub フォーム() UserForm1.Show End Sub +++++++++++++++++++++++++++ Private Sub CommandButton1_Click() Call モジュール '標準モジュールを呼ぶ Unload UserForm1 ++++++++++++++++++++++++++ モジュール内 Static ufX As Byte ufX = UserForm1.XXX.Text 'ufXの値を保持したい。

  • AccessVBAの標準モジュール

    標準モジュール Public PSwMdel As Boolean Public Function PMsgDel() If (MsgBox("削除してよろしいですか?", 1 + 48 + 256, "削除処理確認メッセージ゛") = vbOK) Then PSwMdel = True Else PSwMdel = False End If End Function と作成し、削除前の確認処理を共通で使えるようにしています。 (メッセージボックスでOKを押すとPSwMdelがTrueになって削除モジュールが動くようにする) 普通は全く問題なくモジュール通りに動くのですがここ最近急に正しく動かないものが出てきました 普段フォーム内のモジュールで Call PMsgDel If PSwMdel = True Then  ~以下削除処理~ END IF としているのですがメッセージボックスでOKを押しても削除が実行されなかったのです おかしいと思いブレークポイントで確認するとOK押した後PMsgDel内ではPSwMdel = True フォームモジュールに戻るといきなりPSwMdel = Falseに変わってしまいIF後の削除処理を通っていませんでした また、PSwMdelをウォッチ式に入れて確認もしてみたのですがOKを押した後は ずっとTrueのまま変わっていませんでした 今まで何年も同じようなコードを使用していますがこんな事は一度も無かったので困惑しています どうすればOK押した後でも確実にPSwMdel = Trueを元のフォームモジュールに持って行けるのでしょうか?

  • Access VBA標準モジュールについてです。

    Access VBA標準モジュールについてです。 現在、仕事上必要にかられAccessVBAを勉強中の初心者です。初歩的な質問で申し訳ありませんが、ご存知の方教えて下さい。 フォーム上のコマンドボタンを押した時に標準モジュールを作動させたいのですが、そんな方法はありますか?【クラスモジュールについての本は沢山あって何とか理解できつつありますが、標準モジュールに関しての記述があまり無い気がします。】 宜しくお願いします。

  • 【VBA】SUBプロシージャーは標準モジュール以外に書いてもいい?

    ThisWorkbookのコードを書く場所や Sheetのイベントプロシージャーが実行されるところに Sub test() MsgBox "あああ" End Sub と書いて実行するとメッセージボックスが表示されます。 クラスモジュールとフォームのイベントプロシージャーを書くところではできませんでした。 ということはSUBプロシージャーは 標準モジュールでなくてもいいのでしょうか?

  • VBA 標準モジュールとフォーム

    ある標準モジュール内で生成した変数の値をフォームのコマンドボタンをクリックしたら表示されるプログラムはどうやってつくるのですか? 標準モジュール sub test() dim a as integer dim b as integer dim sum as string a=5 b=1 sum=a+b End sub フォームのコマンドボタンクリック Sub CommandButton1_Click() MsgBox sum End Sub 標準モジュールで計算した答えがフォームのコマンドボタンをクリックしたら答え6が表示されるようにしたいのですが、どうしたらできますか?

  • フォームのイベントを標準モジュールから呼び出す

    フォームのイベントを標準モジュールから呼び出す事は出来ないのでしょうか? ちなみにアクセスです。 例えば、 Private Sub Form_Load() MsgBox "test" End Sub というのはフォームを開いたときにしか発生しないですよね。 でもフォームを開いている状態でForm_Loadと全く同じ事をしてほしい時は どうすればいいですか? 標準モジュールで Sub a() Call Form_フォーム1.Form_Load End Sub としてみましたが、メソッドまたはデータ メンバが見つかりません。 (Error 461)になりました。 MsgBox "test" だけなら、 Sub a() MsgBox "test" End Sub にすりゃいいじゃん!って思われがちですが、 実際はForm_Loadイベントにはたくさんのコードが書かれています。 標準モジュールからイベントの呼び出しを教えてください。

  • ユーザーフォームのリストボックスの設定を標準モジュール内で取得した配列

    ユーザーフォームのリストボックスの設定を標準モジュール内で取得した配列にしたい。 題名のままの説明ですが、ユーザーフォームのリストボックス値を配列にして動的に動作させるようにしたいのですが、標準モジュールでPublicで配列を宣言しているのですが、うまくユーザーフォームモジュールに渡っていないというか、その配列変数をユーザーフォームモジュール内に書くと配列が存在しません。 というエラーが出てしまいます。 かといってユーザーフォームでPublicで配列を宣言することもできないのでどうやってリストボックスに 配列を設定すればいいのかわかりません。 配列は2次元配列で視覚的に説明するとは列数が3行、行数は標準モジュール内でRedimにより可変します。この配列をそのままレコードセットみたいにリストボックスに設定したのですが、 なにか良い方法はありますでしょうか?