2009年4月29日水曜日

ヘルプを眺めてて初めて知ったVBスクリプトのバッチモード。
忘れないようにメモ。

WScript.Interactive = False

"WScript.Echo"や"Msgbox"コードを無視してくれます。

とりあえずこれを使って、Cscriptの場合だけ
デバッグメッセージを表示するような感じにしてみた。

'WScriptだったらメッセージを表示しないように
If Ucase(Right(WScript.FullName,11)) = "WSCRIPT.EXE" Then
WScript.Interactive = False
End if

今度TimeOutプロパティの使い道を検討してみよう。

フィルタオプションの使用

EXCELでオートフィルタをかけるとき、条件は2つまでしか設定できないが、
フィルタオプションを使用することで解決できることがある。

フィルタオプションを使うと、好きなだけ条件を並べられるし、
AND条件、OR条件も柔軟に指定できる。

例えば、ある一覧からキー"管理番号"が
"A001"
"A002"
"B005"
"C009"
にヒットするやつをフィルタリング。なんてことも簡単にできる。

ただし、フィルタオプションでは作業用セルが必要となってくるので、
もしVBAで処理化するならその辺も考えないといけない。

VBAではAdvancedFilterを使う。

2009年4月22日水曜日

VBAからVBAのコード編集

マクロを仕込んだブックを使っていて、古いコードを一括で編集したいときがあります。

そんなときは、コードを編集するマクロを書いてやればいいのです。

ここでは簡単な編集をメモっときます。

ヘルプを見るとわかるけど、プロシージャ作ったりなんかもできるみたい。

個人的にはコードをVBAで作っていくより、ファイル読み込ませるほうが確実で早いと思うんだけど。。。


'指定ブックのVBAコード編集する
Public Sub UpdateCode()
Dim path As String
Dim wb As Workbook
Dim tgt_mod As String
Dim in_path As String

'指定ブックのパス
path = "C:\WORK\Target.xls"
'追加したいモジュール名称
tgt_mod = "Module1"
'対象ブックを開く
Set wb = Application.Workbooks.Open(path)

With wb.VBProject.VBComponents(tgt_mod).CodeModule

'5行目に文字列を挿入する
.InsertLines 5, "msgbox cstr(5)"

'テキストファイルから追加する

in_path = "C:\WORK\input.bas"
.AddFromFile in_path

'文字列を追加する
.AddFromString ("'コメントを追加する")

'そのモジュール内のコードを削除する
.DeleteLines 1, .CountOfLines

End With

'対象ブックを保存して閉じる
wb.Save
wb.Close

Set wb = Nothing
End Sub
あとは、対象ブックを探すロジックを入れるだけ。

ただし、コード編集をしたいブックのVBAProjectがロックされてる場合はエラーになります。

ネットを色々調べてみたけど、どうやらVBAからVBAProjectのロック解除はできなさそう。

まぁできたらロックの意味あんまりないよね。

今度からは後々のことを考えて作ります。

※ブックのロック設定・解除はVBAからもできます。