人に聞けない痔の悩み、これでスッキリ >>

教えてください。
VBで現在実行しているプロシージャ名を取得指定のですがkのようなことは可能ですか?
可能ならばどのようにすればいいか教えてください。

現在実行ファイルにて起動しているのですが、どこかで「実行エラー」が発生しています。
この実行エラーの場所の特定のために、現在起動中のプロシージャ名をログに保存しようかと考えています。
また、その他このようなエラー箇所特定方法などがありましたら教えてください。
環境:VB6.0  Win2000

A 回答 (6件)

残念ながら出来ません。



私のプロジェクトでは全てのプロシージャに On Error コーディングをして、そこでログにどのプロシージャかを書いてました。

そういう方法しかないと思います。
    • good
    • 2

#1です。



なるほど。
だとすると、やはり、#4さんがご指摘のように、On Errorでエラーを回避して、それぞれにプロシージャ名を手動で書き込んでいくしかないと思います。

月1で発生するエラーなら、頻度は高いといえますし、だからといって、実行ログは取っていられないでしょうから、エラーログで対応するしかないですね。
でも、そのエラーが発生するタイミングに、共通点はないか、とか、エラー発生時の実行環境の状況、エラーメッセージ(メッセージが出ないとお手上げですが)などから、大体の絞込みは出来ないものでしょうか?
いえ、難しいなら、エラーログを取るしかありませんが。
    • good
    • 0

さらにさらに失礼しました。



>CodeModule
実行したら、「関数名」は取れないようです。
実行していない状況に限るようです。

関数名ではなく、モジュール名なら取れそうです。


以前に「GetModuleFileNameEx」をどこかで拾いました。
実行できないのですが、そのまま張っておきます。



http://support.microsoft.com/default.aspx?scid=k …


Option Explicit

Private Declare Function WindowFromPoint Lib "user32" _
 (ByVal xPoint As Long, _
  ByVal yPoint As Long) As Long
Private Declare Function GetCursorPos Lib "user32" _
 (lpPoint As POINTAPI) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" _
 (ByVal hwnd As Long, _
  lpdwProcessId As Long) As Long
Private Declare Function GetParent Lib "user32" _
 (ByVal hwnd As Long) As Long
Private Declare Function EnumProcessModules Lib "psapi" _
 (ByVal hProcess As Long, _
  ByRef hMod As Long, _
  ByVal sizehMod As Long, _
  ByRef dwlpdwPIDsize As Long) As Long
Private Declare Function GetModuleFileNameEx Lib "psapi" _
 Alias "GetModuleFileNameExA" _
 (ByVal hProcess As Long, _
  ByVal hMod As Long, _
  ByVal szFileName As String, _
  ByVal nSize As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" _
 (ByVal dwDesiredAccess As Long, _
  ByVal bInheritHandle As Long, _
  ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" _
 (ByVal hObject As Long) As Long

Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const PROCESS_VM_READ = &H10
Private Const MAX_PATH = 260

Private Type POINTAPI
 x As Long
 y As Long
End Type

Private Sub Form_Load()
 Timer1.Interval = 1000
 Timer1.Enabled = True
End Sub


Private Sub Timer1_Timer()
 Dim lngApiRet As Long
 Dim lnghProcess As Long
 Dim lnghModule(512) As Long
 Dim strModuleName As String
 Dim lngcbNeeded As Long
 Dim lngStrLen As Long
 Dim i As Integer
 Dim lngProcessID As Long
 Dim pp As POINTAPI
 Dim lngParent As Long
 
 List1.Clear
 lngApiRet = GetCursorPos(pp)
 lngParent = getTopParent(WindowFromPoint(pp.x, pp.y))
 lngApiRet = GetWindowThreadProcessId(lngParent, lngProcessID)
 lnghProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or _
              PROCESS_VM_READ, _
              0&, lngProcessID)
  If lnghProcess Then
   If EnumProcessModules(lnghProcess, lnghModule(0), _
              UBound(lnghModule), lngcbNeeded) Then
    For i = 0 To lngcbNeeded / 4 - 1
     strModuleName = String(MAX_PATH, Chr(0))
     lngStrLen = GetModuleFileNameEx(lnghProcess, _
                     lnghModule(i), _
                     strModuleName, _
                     Len(strModuleName))
     strModuleName = Left(strModuleName, lngStrLen)
     List1.AddItem Format(lngProcessID, "00#") & _
            vbTab & strModuleName
    Next i
   End If
  End If
  lngApiRet = CloseHandle(lnghProcess)
End Sub

Private Function getTopParent(ByVal lnghWnd As Long) As Long
 getTopParent = IIf(CBool(GetParent(lnghWnd)), getTopParent(lnghWnd), lnghWnd)
End Function

参考URL:http://support.microsoft.com/default.aspx?scid=k …
    • good
    • 0

すいません。


VBEはEXCEL用の場合に限るようです。


VBは
CodeModuleオブジェクトがキーとなるようです。

参考URLのコメント付加アドインのサンプルがヒントとなると思います。

ただし、やはり開発環境に限りで、コンパイルしたらだめっぽいです。

参考URL:http://www.galliver.co.jp/writing/nikkei_tokushu …
    • good
    • 0

とおーい記憶で話しております。



VB6ならデバッグ限定で、確か取れたと思いますよ。

ただしコンパイルしたら取れなかったと思います。

キーワードは「VBE」だったと思います。

「思います」ばかりですいません。
    • good
    • 0

質問の回答としては、「そんなことはできません」だと思います。



ところで、質問を拝見するところ、実行エラーとのことですが、まず、実行ファイル(ってことはexeですか?)にする前に、デバッグできませんか?
デバッグでは起こらない現象ですか?
また、エラーログのとり方を、どのようにお考えですか?
補足をお願いします。

この回答への補足

実行ファイルとはEXEのことです。
エラーというのが、1ヶ月に1回出るかでないようなものです。デバック環境では現状出ていません。
実行マシン(PC)にはVB6の開発環境をインストールしていません。
エラーログは現在下記のように考えています。
あるプロシージャに入ると、そのプロシージャ名をtxt形式でファイルに保存しようと考えています。
以上、説明不足ですみません。

補足日時:2005/02/15 11:17
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBA プロシージャの名前の取得

プロシージャ名を取得できないかなと考えています。
・Form_Openプロシージャ内で「Form_Open」という文字を取得
・フォーム上に「新規登録」というボタンを作成、クリックした時にできる「新規登録_Click」プロシージャ内で「新規登録_Click」という文字を取得
不可能な場合、各プロシージャに「Form_Open」や「新規登録_Click」をベタ書きしようと考えていますが、非効率と考え、やりたくありません。
できればバージョンは2000以降で、ExcelでもAccessでも構いません。
可能かどうかだけでも教えてください。

Aベストアンサー

>不可能な場合、各プロシージャに「Form_Open」や「新規登録_Click」をベタ書きしようと考えていますが

何がしたいのか全く解りませんが、”プロシージャ名取得”の関連情報のリンクだけ紹介しておきます。


http://oshiete1.goo.ne.jp/qa1219426.html
http://park7.wakwak.com/cgi-bin/sbox/~efc21/exqalounge.cgi?print+200905/09050016.txt
http://www.officetanaka.net/excel/vba/vbe/05.htm
http://support.microsoft.com/kb/410621/ja

http://search.goo.ne.jp/web.jsp?dummy=%F3%FE%F3%FE%F3%FE&status=select&from=goo_oshiete&PT=goo_oshiete&nsMT=&MT=vba+%A5%D7%A5%ED%A5%B7%A1%BC%A5%B8%A5%E3%CC%BE+%BC%E8%C6%C0&c=0

>不可能な場合、各プロシージャに「Form_Open」や「新規登録_Click」をベタ書きしようと考えていますが

何がしたいのか全く解りませんが、”プロシージャ名取得”の関連情報のリンクだけ紹介しておきます。


http://oshiete1.goo.ne.jp/qa1219426.html
http://park7.wakwak.com/cgi-bin/sbox/~efc21/exqalounge.cgi?print+200905/09050016.txt
http://www.officetanaka.net/excel/vba/vbe/05.htm
http://support.microsoft.com/kb/410621/ja

http://search.goo.ne.jp/web.jsp?dummy=%F3%FE%F3%FE%F3%F...続きを読む

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

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

AC2000+MSSQL2000環境でVBAを使ってアプリケーション開発しています。

エラー時にユーザー定義関数を使ってカレントフォーム名やカレントコントロール名をメールで送るようにしています。

さらに追加して、どのプロシージャでえらーが起こっているのか知りたく、、コードの中でカレントプロシージャ名を取得する方法ってないでしょうか?

Aベストアンサー

> アクセス自体は絶対にどこかにこの情報(実行中のプロシージャー名)
> を持っていると思うのですが

それは管理してますよね。しかし、詳しいわけではありませんが、恐らく
それはプロシージャのメモリ上の位置でだと思います。String 型のプロ
シージャ名で管理してるわけではないでしょう。

 # VBA は純粋なインタプリタ言語ではありません

また、.NET だと GetCurrentMethod でプロシージャ名を取得できますが、
VB6/VBA にはこれに該当するものがありません。

つまり、実行のたび変化するであろうメモリ上の位置しか取得できないと
すれば、それを人間にとって意味のある情報(文字列のプロシージャ名)
にするのは非常に困難だと考えます。

したがって、取り得る方法としては #1 に示したように、全てのプロシージャ
でエラーハンドリングを行い、その中でプロシージャ名をログ出力する
しかないかと思います。

もちろん、On Error でトラップできないエラーもありますけどね。

QVBA オブジェクトが空かどうか判定する

皆様のお知恵を拝借させてください。

エクセルVBAでオブジェクトを入れる変数を定義し、その変数にオブジェクト
が入っているかどうか検査したいのですがどうしたらいいでしょうか。

例えば---
Dim a As Workbook
If a <> nothing then ←この部分が分からない。このままだとエラー。
処理
End if
---------
環境
エクセル2003
WinXPsp1

Aベストアンサー

もし、aが空だったら
If a Is Nothing Then 

もし、aが空じゃなかったら
If Not a Is Nothing Then

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

Q或るプロシージャの呼び出し元判定

MS-EXCEL2010 VBAで或るプロシージャの呼び出し元が、プロシージャかボタン操作か、また、プロシージャならプロシージャ名、ボタン操作ならボタン名を呼び出されたプロシージャ内で知る方法は有るのでしょうか。

if文で操作を変えたいのです。よろしくお願いします。

Aベストアンサー

べたな方法ですが
Sub msgTest(Optional ByVal myCaller As String = "NA")
MsgBox caller
End Sub

call msgtest → NA
call msgtest("are") → are
のように呼び出し元で渡してあげるとか・・・。

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング