2004年12月16日木曜日

アクセスで

マイクロソフトオフィスというソフトウェアがあるのですが、そのなかにアクセスというデータベースソフトが入ってるんですね、で、時々それでプログラム作ったりすることがあるのですが、だんだん作ってくうちにどこまで作成したか、なにを変更したか、わからんようになっていくんですわ、これが。

それで思ったのよ「フォームとモジュールのコードをテキストに全部吐き出して、ツールで差分を検査できるようにしたいな」と

まず、面白そうな命令がないか、ヘルプとかオブジェクトブラウザで調べてみたら
forms(1).Module.Lines(1,10)
この指定で1行目から10行出力
forms(1).Module.countoflines
この指定で全行カウント

フフリ、いい感じ
application.currentproject.allforms.Item(1).Name
これでフォームが全部取れる
application.forms(1)
これは起動しているもののみとらえる

なるほど
Option Explicit
dim fs,t,ac,n

Set fs = CreateObject("Scripting.FileSystemObject")
Set t = fs.CreateTextFile("testfile.txt", True)
set ac = CreateObject("Access.Application")

ac.application.OpenCurrentDatabase("C:\Documents and Settings\takitou\デスクトップ\test.mdb")
n = ac.application.Modules(1).countoflines
t.Write(ac.application.Modules(1).Lines(1,n))
ac.quit

t.Close

こんな感じかな?

しかし.....ここから苦難の道がはじまろうとは
どういうことかというとModules(1)がくせもので、変数にするととたんに受け付けなくなる、そしてなんか途中で止まると思ったら、コード環境で開きっぱなしにしてたものだけしか拾ってこないのですよ.....
それじゃ、ということでCurrentProjectからallforms(n)で参照しても取れるのは名前ぐらいで、ちゃんとしたFormオブジェクトが取れないと言うありさま、そもそもmodules自体はフォームのコードもモジュールのコードも両方格納してあるのにall系はしっかり別れていてallmodulesで取れるのもallformsと同じくやっぱりモジュール名ぐらいという有様、IsLoadedを使えとかヘルプに書いてあって、loadしてなかったらDocmdで.....ってそれマクロ起動みたいなもんだからVBAできちんと参照して処理するのとは全然ちがうでしょ、みたいな、案の定130以上あるフォームをポロポロとエラー出しながら開く始末、ドアホが!それでもallForms(n)がきちんとFormsだったらForms(n).moduleでとりだせたのに、しょうがないので、コード環境で全て手動でコード画面開いてセーブするように、運用でカバー.....とほほ
最終的にはこんな形に
Option Explicit

'モジュールダンプ(ヘタレ仕様:一旦全てのモジュールをコード側で展開してセーブしないといけない)

dim fs,t,time1,time2,ac,n,m

time1 = now

Set fs = CreateObject("Scripting.FileSystemObject")
Set t = fs.CreateTextFile("testfile.txt", True)
set ac = CreateObject("Access.Application")
ac.application.OpenCurrentDatabase("C:\Documents and Settings\takitou\デスクトップ\test.mdb")
const L1 = "' ------------------------------------------------------------------------ "
for n = 0 to ac.application.modules.count-1
set m = ac.application.modules(int(n))
t.Write(vbcrlf & L1 & vbcrlf & "' --- " & m.name & vbcrlf & L1 & vbcrlf & m.Lines(1,m.countoflines))
next
ac.quit
t.Close

time2 = now
msgbox "終了:" & minute(time2 - time1) & "分" & second(time2 - time1) & "秒経過 "

あとは読み込みも研究して、整備しておこう

0 件のコメント:

コメントを投稿