忍者ブログ
28 March

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

16 October

【VBA/Access2010】ProcOfLineプロパティで永ルプった話。

やられちまったぜTANAKAさん…!

CodeModuleのプロパティ
http://officetanaka.net/excel/vba/vbe/05.htm

~あらすじ~

環境毎にフロントファイルを分けたり検証したりしているうちに、ソースのバージョン管理がメタメタになったm_o_coは、各プロシージャの行数を収集するため、VBEオブジェクトという未知の領域に踏み込んだ。そこで永久ループに、はまったのであった。




----------------------------------------------------------------------
ProcOfLineプロパティは、指定した行を含むプロシージャの名前を返します。

>CodeModule.ProcOfLine(line, prockind)

引数lineには行数を指定します。
引数prockindは、ProcBodyLineプロパティと同じようにプロシージャの種類を表す数値を指定します。

>Sub Sample12()
> Dim ProcName As String
> ProcName = ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.ProcOfLine(9, 0)
> MsgBox ProcName
>End Sub

----------------------------------------------------------------------
引数prockindには、そのプロシージャの種類を表す次の数値を指定します。

>値 内容
> 3 プロパティの値を取得するプロシージャ
> 1 プロパティに値を設定するプロシージャ
> 2 オブジェクトへの参照を設定するプロシージャ
> 0 上記以外のすべてのプロシージャ

一般的なSubプロシージャやFunctionプロシージャを指定するときは0を指定します。

----------------------------------------------------------------------



>引数prockindは、ProcBodyLineプロパティと同じようにプロシージャの種類を表す数値を指定します。

そんなこと無かったぜ!!!


subや、Functionを収集しているうちはベタ0でエラーにはならないが、クラスオブジェクトのプロシージャは、同名のプロシージャ(プロパティ)が存在する。

つまり、Letと、Get。(VBAだと、さらに Set を区別する)


引用元の説明だと解りずらいんですけど、引数prockindは、Let(1)、Get(3)、Set(2)と、それ以外(Sub、Function)(0)を示す数値である訳なんですよ。

でもさー、ソース見ないでいじるためのプロパティなのに、クラスにゲッターセッターが完備かなんてわかんないじゃないですか…!

そうなると、総当たりするやん…?


----------------------------------------------------------------------
With Application.中略.VBComponents(中身見たいモジュール名).CodeModule

' モジュールの行数 の、ヘッダー行分飛ばしたところ から、最後の行まで
for i = .CountOfDeclarationLines To .CountOfLines

for j = 0 to 3 ' 引数prockind値
buf = .ProcOfLine(i, j) ' プロシージャ名
debug.print buf ' プロシージャ名
debug.print .ProcCountLines(buf, j) ' 行数
next

next

end With

----------------------------------------------------------------------

これやると、.ProcOfLine(i, j) の行で、j値がそのi行の prockind に変わるので、3でない限り脱出不能になります。


つまり、.ProcOfLine の 引数prockind値は、渡し値でなく、受け値だってことだったんすわー!
引数prockind値指定してるのは、エンジニアじゃなくて、Appicationオブジェクトだったんだね!びっくりだ!

って、書いてるけども、ExcelとAccessで仕様が違うってありますかね…?
ちなみに、これはExcelの手引きみながらAccessで書いてるんですけども。普段は全然問題ないけど、変なところで仕様違いあったりするからなー……。

まぁ、固定値でなく、適当な変数を渡しておいた方が無難ってことっすなー…。

拍手

PR