• 締切済み

【VBA-AC2000】カレントプロシージャ名を取得したい

AC2000+MSSQL2000環境でVBAを使ってアプリケーション開発しています。 エラー時にユーザー定義関数を使ってカレントフォーム名やカレントコントロール名をメールで送るようにしています。 さらに追加して、どのプロシージャでえらーが起こっているのか知りたく、、コードの中でカレントプロシージャ名を取得する方法ってないでしょうか?

みんなの回答

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

> アクセス自体は絶対にどこかにこの情報(実行中のプロシージャー名) > を持っていると思うのですが それは管理してますよね。しかし、詳しいわけではありませんが、恐らく それはプロシージャのメモリ上の位置でだと思います。String 型のプロ シージャ名で管理してるわけではないでしょう。  # VBA は純粋なインタプリタ言語ではありません また、.NET だと GetCurrentMethod でプロシージャ名を取得できますが、 VB6/VBA にはこれに該当するものがありません。 つまり、実行のたび変化するであろうメモリ上の位置しか取得できないと すれば、それを人間にとって意味のある情報(文字列のプロシージャ名) にするのは非常に困難だと考えます。 したがって、取り得る方法としては #1 に示したように、全てのプロシージャ でエラーハンドリングを行い、その中でプロシージャ名をログ出力する しかないかと思います。 もちろん、On Error でトラップできないエラーもありますけどね。

t2hayashi
質問者

お礼

やはりそうですか・・・・・ なんだかニーズがありそうな気がするのですが、(たとえばプロシージャの実行ログテーブルを作りたい!とか) 現状では無理なんですね・・・・ お手数お掛けしました。ありがとうございました。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

エラーログをとるコードを書けば良いだけです。 ’// コード例 Sub ProcedureA()   On Error Goto Err_   ’// 処理 Bye_:   Exit Sub Err_:   ' // エラーを記録する   Call ErrLoging(Err.Number,"ProcedureA")   Resume Bye_   ' 復帰させるならエラーをクリアしてから Resume End Sub Public Sub ErrLoging(ByVal ErrNum as Long, _            ByVal ProcName as String _ )   ' // ここに次の内容の処理を書く   ' // 日時・エラー番号・プロシージャ名をテキスト出力する   ' // また、重要なローカル変数の内容も引数で渡すなどして   ’// 記録するのもいい。もちろんグローバル変数も。 End Sub > カレントフォーム名やカレントコントロール名を 使えるか調べてませんが、確か ActiveControl、ActiveForm などの プロパティーがあったと思います。

t2hayashi
質問者

お礼

回答ありがとうございました。 一番困っているのは >Call ErrLoging(Err.Number,"ProcedureA") このエラー関数(ユーザー定義)を汎用的にしたいので "ProcedureA" という実行中のプロシージャ名を呼び出す環境変数的なものがないかと思いまして・・ イメージ的には Call ErrLoging(Err.Number,Currentdb.ActiveProcedure.Name) みたいな感じです・・・・ アクセス自体は絶対にどこかにこの情報(実行中のプロシージャー名) を持っていると思うのですが、それを呼び出す方法が見つからず・・・

関連するQ&A

  • ACCESS VBAで別のプロシージャを呼びだした後

    いつもお世話になります。 ACCESS VBAで、別のプロシージャを呼びだし、 フォームを開き、あるコマンドボタンをクリックすると、 もとに戻ってくるようにしたいのですが、 call で別のプロシージャを呼びだし、フォームを開くところまではうまくいくのですが、コマンドボタンをクリックする前に戻ってきてしまいます。 コマンドボタンにはイベントプロシージャを設定しているのですが、 それではダメなんですよね? どのようなコードになるのでしょうか?よろしくお願いします。

  • VBA ユーザーフォームのイベントプロシージャ

    いつもお世話になっております。 VBAを勉強中の初心者です。 最近ユーザーフォームの作成について学習しております。 ユーザーフォームモジュールにコードを記述しているのですが、何かの拍子?ブックをオープンした場合などに、自動でプロシージャが作成されてしまい困っています。 (1)どのタイミングでプロシージャが作成されるのでしょうか? (2)何故自動で作成されるのでしょうか? (3)自動でプロシージャが作成されないようにすることはできるのでしょうか? 以上についてご教授ください。 よろしくお願いします。

  • access vbaのコンパイルエラーについて

    お世話になります。 vbaは超初心者なので、説明が良くないかもしれませんがご容赦ください。 フォーム上のレコード数を一件に制限する必要があり、下記サイトを参考に作成中のデータベースに構文をあてはめてみました。 http://hatenachips.blog34.fc2.com/blog-entry-189.html サブフォーム移動時のプロシージャは、 Public Sub Form_Current() Me.AllowAdditions = Me.Recordset.RecordCount < 1 End Sub メインフォーム移動時の動作として、対象のサブフォーム名を入れて下記のような構文を 作りました。 Private Sub Form_Current() Me.新規入力 サブフォーム.Form.Form_Current End Sub ところが、「コンパイルエラー 変数が定義されていません」となってしまいました。 サブフォームコントロール名はデザインビューのプロパティで、タブの「すべて」の名前の欄にあるものだと思っているのですが、もしかしてこれが違っているのでしょうか? エラーの意味がよくわからず、困り果てています。 どなたかお力をお貸しください。 よろしくお願いします。

  • VBAでのオブジェクト名の付け方で困っています。

    私が知りたいのはユーザフォームを一度作成した後にオブジェクトを追加したときのオブジェクト名の処理の仕方です。 今、EXCEL VBAでアンケート入力フォームを作成しています。テキストボックスやチェックボックスが全部で70ほどあります。以下のようにControlsコレクションを用いてユーザフォームに入力した文字列などをワークシートに追加しています。 ……<略> For i = 1 To 10 Cells(Row, i).Value = Me.Controls("CheckBox" & i ).Value Next i ……<略> しかし、入力フォームの画面構成を変更して、新たにテキストボックスやチェックボックスを追加すると、例えば、ユーザフォーム上で隣り合ったTextBox1とTextBox2の間にTextBox35が入ってきて以下のようにコードを書き換えねばなりません。 ……<略> Cells(Row, 1).Value = Me.CheckBox1.Value Cells(Row, 2).Value = Me.CheckBox35.Value For i = 2 To 10 Cells(Row, i+1).Value = Me.Controls("CheckBox" & i ).Value Next i ……<略> プロパティからオブジェクト名のひとつひとつを編集してユーザフォームのテキストボックスの表示順にするのも手間ですし……まだ、設計の試行錯誤の段階なのでまだまだテキストボックスやチェックボックスを追加・削除をすると思いますし…… 何か効率のよいオブジェクト名の付け方はないでしょうか? みなさんはどのようにされていますか?

  • access vba プロシージャの呼び出し

    access vba についての質問です。 フォームにテキストボックスが二つあるのに対して、 オプションボタンが三つあります。(グループです) テキストボックス1に文字列を入力し、コマンドボタンを押すと 選択されているオプションボタンのcaptionをテキストボックス1の文字列と合わせる形でテキストボックス2に反映させたいです。 コマンドボタンのクリックで以上の動きをするfunctionプロシージャを呼び出したいのですが、呼び出す側プロシージャと呼び出される側プロシージャの変数の設定がわかりません。 超初心者のため初歩的、かつ説明がわかりづらくて恐縮ですが、理解のため省略などをしない形でコードの見本等お教え願えませんでしょうか。 よろしくおねがいします。

  • VBとVBAのコードの違い プロシージャー呼び出し方法

    何度かお世話になっておりおります 毎回アドバイスありがとうございます 早速なのですがまた躓いてしまいアドバイスお願いします。 ~質問内容~ 標準モジュールからフォームのプロシージャーを呼び出す エラー内容 オブジェクトが必要である       オブジェクト修飾が必要など 出てきました オブジェクト修飾 というのが もう理解出来ず 本当にスタートの時点ではありますが アドバイスお願いします VBのコード 標準モジュール Sub Main() MainForm.Initialize End Sub フォームのコード Public Sub initialize()  ”コード内容”  End Sub ↑上記で記入しました フォームで宣言されているInitialize を呼び出したいのですが VBでは このままで出来るはずなのですが VBAでは オブジェクト修飾が必要です CALL をつけても エラーのままでした 少し質問がわかりにくくなってしまいましたが 標準モジュールから フォームのプロシージャーを呼び出すには なんと入れれば宜しいでしょうか? アドバイスお願いします

  • Propertyプロシージャの使い道

    Excel VBAのPropertyプロシージャについてご質問します。 Propertyプロシージャはどういったときに使うものなのでしょうか? 解説本には設定値の保存だけではなく、プロパティの設定時にコードを実行させることが可能、とあります。 ですが、設定値の保存だけでよければ(コードは実行しない)、設定値を保存するPrivate変数を用意して、そこに設定するPublic関数を用意すれば事が足りる気がします。 また、いろんなサイトを見て回ると「読み取り専用のプロパティにもできる」とありますが、それだとどんな使い道があるのかというのがピンときません。 どのようなときにPropertyプロシージャを使うべきで、そうしたほうがいい理由を教えてください。 よろしくお願いします。

  • サブフォームのコントロールの値を取得したい(VBA)

    連続投稿失礼します。 ファーム1のなかにサブフォーム(フォーム2)を設置しました。 フォーム2の中にはテキスト1があります。 VBAでテキスト1の値を取得したいのですがうまくいきません。 フォーム2を開いた状態で、 Sub test1() MsgBox Forms("フォーム2").Controls("テキスト1") End Sub を行なうと、 「あああ」 が返ってくるのですが、 フォーム2を閉じて、 フォーム1を開き、上のコードを実行すると、 「マクロの式、またはVisual Basicのコードで参照されている 'フォーム2'フォームが見つかりません。」 となってしまいます。 普段はフォーム2は閉じ、フォーム1を開いて使うため、 この状態でのVBAコードが知りたいです。 ちなみに変数を代入したいので 「Form_フォーム2.テキスト1」の書き方よりカッコでくくる書き方でご回答いただければ助かります。 よろしくお願いします。

  • subプロシージャーは標準モジュールではなくフォームのコードを書く部分

    subプロシージャーは標準モジュールではなくフォームのコードを書く部分に書いても問題ないのでしょうか? エクセルにVBAでフォームを挿入し、 「Private Sub UserForm_Initialize()」 などのフォームのモジュールに、 Sub test() MsgBox "あああ" End Sub という標準モジュールに書くべきのsubプロシージャーを書いてもなにもエラーにならないし正常に動きます。 subプロシージャーは標準モジュールではなくフォームのコードを書く部分に書いても問題ないのでしょうか? それともエラーにならなくても標準モジュールに書いた方がいいですか?

  • エクセルVBA イベントプロシージャに引数を渡せま

    お世話になります。 エクセル2003/XP 使用です。 イベントプロシージャに引数を渡せまるかどうか教えていただけますでしょうか? 下記のコード中の変数mysheetnameを ユーザーフォーム、→ CommandButton1のプロシージャに 引数として渡して行きたいのですが、 実行すると、一番最初のWorkbook_SheetBeforeRightClickの時点で、 コンパイルエラー:  プロシージャの宣言が、イベントまたはプロシージャの定義と一致していません。 とエラー表示されます。 イベントプロシージャに引数を渡すことはできますでしょうか? ---------- ThisWorkBook内 ---------- Public mysheetname As String Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) mysheetname = ActiveSheet.Name UserForm1.Show (mysheetname)     '←変数mysheetnameの値をユーザーフォームに渡したい。 End Sub ---------- ユーザーフォーム ---------- Private Sub UserForm_Initialize(ByVal mysheetname As String ) 処理 End Sub Private Sub CommandButton1_Click(ByVal mysheetname As String ) 処理 End Sub ’--------- ここまで 引数について少し理解し始めたばかりの者です。 よろしくお願いします。

専門家に質問してみよう