2017年9月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
無料ブログはココログ

« 2007年9月 | トップページ | 2007年11月 »

2007年10月31日 (水)

バッチファイルで、テキストファイルの先頭行を削除する。

バッチファイルで、「作業ファイルを使わず」に、テキストファイルを編集するのは、コツが要ります。

例えば、テキストファイルの先頭行を削除する。

more +1 %1 | sort /+10000 | sort /+10000 /o %1

あるいは、

@echo off
setlocal disabledelayedexpansion
set LINE=
for /f "skip=1 delims=" %%0 in ('find /n /v "" ^<%1') do (
if not defined LINE call >%1
set LINE=%%0
setlocal enabledelayedexpansion
>>%1 echo;!LINE:*]=!
endlocal
)

前者は、sort が入力をすべて読み込んでから、/oのファイルに出力することを利用します。
また、/+で実際の行より大きい桁を指定すると、入力の逆順に出力されます。それを2回繰り返すと入力順に戻ります。

後者は、for /f in ('コマンド') do の 'コマンド' が先に実行されて、結果がどこかに蓄えられて、後から do が処理されることを利用します。

2007年10月30日 (火)

IEで開いているページのリンクを iframe src= に変えて書き出す。

IEで開いているページのリンクの <a href=url>innerText</a> を <iframe src=url>innerText</iframe> に変えて、標準出力に書き出します。

コマンドプロンプトで、

a2iframe.cmd > ファイル

@if(0)==(0) ECHO OFF
CScript.exe //NoLogo //E:JScript "%~f0"
GOTO :EOF
@end
var ie=new ActiveXObject("Shell.Application").Windows().Item();
for(var k=0;k<ie.Document.links.length;k++){
  var a=ie.Document.links.item(k);
  WScript.StdOut.WriteLine('<iframe src="' + a.href + '">' + a.innerText + '</iframe>');
}

これには、すべてのリンクが含まれているので、必要なものだけに編集します。

2007年10月29日 (月)

たくさんのリンク先を一度に保存する。

目次ページのようにリンク先がたくさんあるとき、それらを一度に保存するにはどうするしたものか。
ひとつずつ、保存してたのでは。。。

下のようなhtmlを作って、IEで開き、「完全」で保存すると、.filesフォルダにリンク先が保存されます。

<!-- saved from url=(0014)about:internet -->
<html>
<body>
<iframe src=url1 />
<iframe src=url2 />
<iframe src=url3 />
・・・
</body>
</html>

2007年10月27日 (土)

リソースキットの soon.exe 擬似のバッチファイル(AtNow.CMD)

コマンドを即時に実行します。

AtNow.CMD [/INTERACTIVE] "コマンド"

@if(0)==(0) ECHO OFF
FOR /F "delims=[] tokens=1*" %%x IN ('AT.EXE %TIME% %*^|FIND.EXE /V /N ""') DO (
ECHO=%%y
IF %%x==1 (
FOR /F "tokens=1-4" %%1 IN ("%%y") DO (
IF "%%1"=="新しいジョブをジョブ" (
CScript.exe //NoLogo //E:JScript "%~f0" %%4
AT.EXE %%4 /D
))))
GOTO :EOF
@end
var Shell=new ActiveXObject("Shell.Application");
var Folder=Shell.NameSpace("::{d6277990-4c6a-11cf-8d87-00aa0060f5bf}");
for(var j=0;j<Folder.Items().Count;j++){
  var FolderItem=Folder.Items().Item(j);
  if(FolderItem.Name=="At" + WScript.Arguments.Item(0)){
    FolderItem.InvokeVerb("タスクの実行(&U)");
    WScript.Sleep(1000);
    WScript.Quit();
  }
}
WScript.Echo("At" + WScript.Arguments.Item(0),"Not Found.");

リソースキットの soon.exe 擬似のバッチファイル(AtSoon.CMD)

コマンドを次の分00秒に実行します。

AtSoon.CMD [/INTERACTIVE] "コマンド"

@echo off
setlocal
set s=%TIME::=%
set /a ss=s%%100
set /a m=(s/100)+(ss/55)
set /a mm=m%%100
set /a hh=(m/100)+(mm/60)
set /a mm=mm%%60+100
set /a hh=hh%%24
echo on
AT.EXE %hh%:%mm:~-2% %*

※ 2007年12月17日 時間の計算方法を修正。

リソースキットの soon.exe の入手先

at.exe は、バッチファイルなどを非表示に実行するのに利用できます。
ただし、直近の未来の時刻を指定するのが面倒です。
これを簡便にするのが、リソースキットの soon.exe です。

ftp://ftp.microsoft.com/ResKit/win2000/soon.zip

2007年10月23日 (火)

Office 2007 ヘルプの「関連項目」や「使用例」がエラーになる。

インターネットゾーンのセキュリティレベルが高だと、
Excel2007ヘルプ
オフライン開発者用ヘルプ
Visual Basic ランゲージ リファレンスの
例えば、Abs関数の「関連項目」や「使用例」がエラーになります。

JavaScript:hhobj_1.Click()

---------------------------
エラー
---------------------------
ランタイム エラーが発生しました。
デバッグしますか?

行: 0
エラー: オブジェクトでサポートされていないプロパティまたはメソッドです。
---------------------------
はい(Y)   いいえ(N)   
---------------------------

インターネットゾーンのセキュリティレベルを下げれば動きますが、
下げないで、Excel2007ヘルプだけ、何とかするには?

MSDNライブラリのドキュメントエクスプローラで開くとよいようです。

start dexplore.exe /helpcol ms-help://MS.EXCEL.DEV.12.1041

2007年10月20日 (土)

Excelブックをマクロ有効で開く。

以下のVBSファイルにドロップするか、SendToに入れて「送る」。
あるいは、関連付けに追加する。

Set Application=CreateObject("Excel.Application")
Application.Visible=True
Application.UserControl=True
For Each Arg In WScript.Arguments
  Set Book=Application.WorkBooks.Open(Arg)
  Book.RunAutoMacros 1
Next

スクリプトから開くと、デフォルトでマクロ有効になります。
ただし、auto_open()が実行されないので、キックします。

ちなみに、マクロ警告を出すには、
Const msoAutomationSecurityByUI=2
Application.AutomationSecurity=msoAutomationSecurityByUI

マクロを無効にするには、
Const msoAutomationSecurityForceDisable=3
Application.AutomationSecurity=msoAutomationSecurityForceDisable

デフォルトは、
Const msoAutomationSecurityLow=1

2007年10月17日 (水)

MIMEヘッダをデコードする。

MIMEヘッダのエンコードにはいろいろありますが、簡単にデコードするには、CDO.Messageが便利です。

Set Msg=CreateObject("CDO.Message")
Do
  Text1=InputBox("エンコードされたテキストを入力","MIMEヘッダをデコード",Text2)
  If Text1="" Then Exit Do
  Set Stm=Msg.GetStream
  Stm.WriteText "Subject: " & Text1
  Stm.SetEOS
  Stm.Flush
  Text2=Msg.Subject
Loop

2007年10月16日 (火)

テキストを正規表現で置換する。

メモ帳では、正規表現による置換や改行を含む置換ができません。
そのためにわざわざ多機能エディタを揃えるのも何です。
それぐらいなら、HTAの<textarea>をJScriptのStringオブジェクトの
replace()メソッドで置換してやればよいのです。

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=shift_jis">
<title>テキストを正規表現で置換</title>
<script language="vbscript">
Option Explicit
resizeTo 600,400
Sub change()
On Error Resume Next
TEXT2.value=Me.eval("TEXT1.value.replace(" & ARG1.value & "," & ARG2.value & ")")
If Err Then TEXT2.value=Err.Description
End Sub
</script>
<script language=jscript>
</script>
</head>
<body scroll="no" style="background:menu;">
<div>入力:</div>
<textarea id="TEXT1" style="width:100%;" rows="8" onfocus="Me.select()"></textarea>
<div align=center>結果=入力.replace(/hoge/ig,'hage')</div>
<div>.replace(<input type=text id=ARG1 size=98>,
<input type=text id=ARG2 size=101>)<button onclick="change()">実行</button></div>
<div>結果:</div>
<textarea id="TEXT2" style="width:100%;" rows="8" onfocus="Me.select()"></textarea>
</body>
</html>

2007年10月15日 (月)

Explorer.exeを起こして、そのエクスプローラのオブジェクトを正確に捕捉する。(VBA編)(その3)

Shell.Windows()の中から、起動したエクスプローラのオブジェクトを正確に捕捉するのは、なかなか厄介です。
特に、エクスプローラのインスタンスは、デスクトップシェルのプロセスに同居するので、識別が困難です。
そこで、fso.GetTempName()のテンポラリの名前でフォルダを作って、エクスプローラでそのフォルダを開き、フォルダ名で識別します。

Dim fso As Object
Dim TempName As String
Dim Folder As Object
Dim Shell As Object
Dim ie As Object

Set fso = CreateObject("Scripting.FileSystemObject")
TempName = fso.GetTempName()
Set Folder = fso.GetSpecialFolder(2).SubFolders.Add(TempName)
Call VBA.Shell("Explorer.exe """ & Folder.Path & """", vbHide)
Set Shell = CreateObject("Shell.Application")
Do
  For Each ie In Shell.Windows()
    If ie.Visible Then
    ElseIf ie.LocationName = TempName Then
      Exit Do
    End If
  Next
  Application.Wait [NOW()+"0:00:00.1"]
Loop
ie.Navigate2 0
Do While ie.Busy Or ie.ReadyState <> 4
  Application.Wait [NOW()+"0:00:00.1"]
Loop
Folder.Delete
ie.Visible = True
MsgBox TempName

2007年10月14日 (日)

Explorer.exeを起こして、そのエクスプローラのオブジェクトを正確に捕捉する。(VBA編)(その2)

Shell.Windows()の中から、起動したエクスプローラのオブジェクトを正確に捕捉するのは、なかなか厄介です。
特に、エクスプローラのインスタンスは、デスクトップシェルのプロセスに同居するので、識別が困難です。
しかし、もし、Explorer.exeを/separateで起こすなら、アプリパス名で識別することもできます。

アプリパス名は同じですが、大文字小文字をランダムに変えて、1/2**19の精度で特定します。
例) c:\winDOwS\exPlORer.ExE
これならWin32APIを使わずにできます。

Dim Shell As Object
Dim wShell As Object
Dim FullName As String
Dim k As Long
Dim ie As Object
Set Shell = CreateObject("Shell.Application")
Set wShell = CreateObject("WScript.Shell")
FullName = wShell.ExpandEnvironmentStrings("%windir%\explorer.exe")
Randomize
For k = 1 To Len(FullName)
  If Fix(Rnd * 2) Mod 2 Then
    Mid(FullName, k, 1) = UCase(Mid(FullName, k, 1))
  Else
    Mid(FullName, k, 1) = LCase(Mid(FullName, k, 1))
  End If
Next
Call VBA.Shell("""" & FullName & """ /separate", vbHide)
Do
  For Each ie In Shell.Windows()
    If ie.Visible Then
    ElseIf ie.FullName = FullName Then
      Exit Do
    End If
  Next
  Application.Wait [NOW()+"0:00:00.1"]
Loop
ie.Visible = True
MsgBox ie.FullName

2007年10月13日 (土)

Explorer.exeを起こして、そのエクスプローラのオブジェクトを正確に捕捉する。(VBA編)

Shell.Windows()の中から、起動したエクスプローラのオブジェクトを正確に捕捉するのは、なかなか厄介です。
特に、エクスプローラのインスタンスは、デスクトップシェルのプロセスに同居するので、識別が困難です。
しかし、もし、Explorer.exeを/separateで起こすなら、プロセスIDで一意に識別できます。
VBAでは、Win32APIが使えるので、ウィンドウハンドルとプロセスIDを対応させて、一意に特定できます。

Option Explicit

Private Declare Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As Long, ByRef ProcessId As Long) As Long

Function GetWindowProcessId(ByVal hwnd As Long) As Long
Dim ProcessId As Long
GetWindowThreadProcessId hwnd, ProcessId
GetWindowProcessId = ProcessId
End Function

Sub aaa()
Dim Shell As Object
Dim ProcessId As Long
Dim ie As Object
Set Shell = CreateObject("Shell.Application")
ProcessId = VBA.Shell("explorer.exe /separate", vbHide)
Do
  For Each ie In Shell.Windows()
    If ie.Visible Then
    ElseIf GetWindowProcessId(ie.hwnd) = ProcessId Then
      Exit Do
    End If
  Next
  Application.Wait [NOW()+"0:00:00.1"]
Loop
ie.Visible = True
End Sub

2007年10月11日 (木)

ExcelオートメーションでDDE要求を無視する。(その2)

Excelオートメーションで処理しているときに、Excelファイルを関連付けで開いたり、印刷すると、Excelオートメーションの処理中にDDE要求が入って来て、困ります。

なので、Excelオートメーションの処理中は「他のアプリケーションを無視する」とよいでしょう。ただし、「他のアプリケーションを無視する」のは、そのオートメーション処理中のExcelだけで、他のExcelの設定を変えないようにするには若干コツが必要です。

Set Application=CreateObject("Excel.Application")

の代わりに、

Set Application=GetApplication()

とします。

以下のVBSファイルは、そういうExcelを起こして、ブックを開きます。

IgnoreRemoteRequests.VBS [ブック...]

Option Explicit

Dim Application
Dim Arg

Set Application=GetApplication()
Application.Visible=True
Application.UserControl=True
For Each Arg In WScript.Arguments
  Application.WorkBooks.Open Arg
Next

Function GetApplication()
Dim wShell
Dim CurVer
Dim Key
Dim Options

Set wShell=CreateObject("WScript.Shell")
CurVer=wShell.RegRead("HKEY_CLASSES_ROOT\Excel.Application\CurVer\")
CurVer=Mid(CurVer,InStrRev(CurVer,".")+1)
Key="HKEY_CURRENT_USER\Software\Microsoft\Office\" & CurVer & ".0\Excel\Options\Options"
Options=wShell.RegRead(Key)
If Options And &H40 Then wShell.RegWrite Key,Options Xor &H40,"REG_DWORD"
Set GetApplication=CreateObject("Excel.Application")
If Options And &H40 Then wShell.RegWrite Key,Options,"REG_DWORD"
End Function

2007年10月10日 (水)

HTMLページのプロパティからURLを新ウィンドウに開き直す。

HTMLヘルプやMSDNライブラリのドキュメントエクスプローラなどのHTMLページをIEなどの新規ウィンドウに開き直すにはどうするか?
ページのプロパティからURLを選択コピーして、IEのアドレスバーに貼り付ける?

ページのプロパティからコンテキストメニュー拡張で新ウィンドウを開きます。

PropOpenNew.htm

<script language=jscript defer>
new ActiveXObject("Shell.Application").open(external.menuArguments._URL.value);
</script>

PropOpenNew.reg

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\スクリプトを実行(&J)]
@="C:\\フォルダ\\PropOpenNew.htm"

2007年10月 9日 (火)

Visual Studio 2005 MSDN ライブラリの DExplore.exe 8.0 が CPU ループする。

終了すると、非表示になって CPU ループするようです。遅いと思ったら、タスクマネジャで確認して、「プロセスの終了」で強制終了しましょう。:-(

あるいは、DExplore.exe 7.0で見るようにショートカットを変えるとか。

MSDN ライブラリの DExplore.exe 7.0/8.0 がテンポラリフォルダにゴミファイルを残す。

定期的に掃除しないと、知らないうちにゴミの山ができます。:-(

DEL "%TEMP%\IMT*.xml"

2007年10月 8日 (月)

ブックなしでExcelを起動して、指定フォルダで「ファイルを開く」ダイアログを出す。

ExcelOpen.VBS

Const msoAutomationSecurityByUI=2
Set Application=CreateObject("Excel.Application")
Application.Visible=True
Application.UserControl=True
Application.AutomationSecurity=msoAutomationSecurityByUI
Application.ExecuteExcel4Macro "DIRECTORY(""C:\Documents and Settings"")"
Application.ExecuteExcel4Macro "OPEN?()"

2007年10月 7日 (日)

IExplore.exeを起こして、そのIEのオブジェクトを正確に捕捉する。(VBA編)

Shell.Windows()の中から、起動したIEのオブジェクトを正確に捕捉するのは、なかなか厄介です。

しかし、VBAでは、Win32APIが使えるので、ウィンドウハンドルとプロセスIDを対応させて、一意に特定できます。

Option Explicit

Private Declare Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As Long, ByRef ProcessId As Long) As Long

Function GetWindowProcessId(ByVal hwnd As Long) As Long
Dim ProcessId As Long
GetWindowThreadProcessId hwnd, ProcessId
GetWindowProcessId = ProcessId
End Function

Sub aaa()
Dim Shell As Object
Dim wShell As Object
Dim FullName As String
Dim ProcessId As Long
Dim ie As Object
Set Shell = CreateObject("Shell.Application")
Set wShell = CreateObject("WScript.Shell")
FullName = wShell.RegRead("HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\iexplore.exe\")
ProcessId = VBA.Shell("""" & FullName & """ -nohome",vbHide)
Do
  For Each ie In Shell.Windows()
    If ie.Visible Then
    ElseIf ie.ReadyState <> 0 Then
    ElseIf ie.LocationURL <> "" Then
    ElseIf GetWindowProcessId(ie.hwnd) = ProcessId Then
      Exit Do
    End If
  Next
  Application.Wait [NOW()+"0:00:00.1"]
Loop
ie.Visible = True
'ie.Navigate "about:blank"
'Do While ie.Busy Or ie.ReadyState <> 4
'  Application.Wait [now()+"0:00:00.1"]
'Loop
End Sub

2007年10月 6日 (土)

IExplore.exeを起こして、そのIEのオブジェクトを正確に捕捉する。

Shell.Windows()の中から、起動したIEのオブジェクトを正確に捕捉するのは、なかなか厄介です。

乱数を発生させて、IEのフルパスの大文字小文字を以下のようにランダムに変えて、ie.FullNameで一意に特定します。

C:\pRoGram fIlES\INtERnEt expLoreR\iexplOre.Exe

これで、1/2**39の精度になります。

Set wShell=CreateObject("WScript.Shell")
Path=wShell.RegRead("HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\iexplore.exe\")
Randomize
FullName=UCase(Mid(Path,1,1))
For k=2 To Len(Path)
  If Fix(Rnd*2) Mod 2 Then
    FullName=FullName & UCase(Mid(Path,k,1))
  Else
    FullName=FullName & LCase(Mid(Path,k,1))
  End If
Next
wShell.Run """" & FullName & """ -nohome",0
Set Shell=CreateObject("Shell.Application")
Do
  For Each ie In Shell.Windows()
    If ie.Visible Then
    ElseIf ie.ReadyState<>0 Then
    ElseIf ie.LocationURL<>"" Then
    ElseIf ie.FullName=FullName Then
      Exit Do
    End If
  Next
  WScript.Sleep 100
Loop
ie.Visible=True
'ie.Navigate "about:blank"
'Do While ie.Busy Or ie.ReadyState<>4
'  WScript.Sleep 100
'Loop
MsgBox ie.FullName

2007年10月 5日 (金)

コンテキストメニュー拡張からスクリプトを入力して実行する。

IEのWebページは外部からShell.Windows()を辿ってスクリプトで操作できますが、HTAやダイログはそういう訳に行きません。
でも、もし、そこでコンテキストメニューが使えるなら、コンテキストメニュー拡張を利用して、スクリプト操作できます。

コンテキストメニューが使えるページやダイアログで、対話的にスクリプトを入力して実行する。

<html>
<head>
<title>スクリプトを実行</title>
<script language=jscript defer>
function button1.onclick(){
  try{
    textarea1.value=eval(input1.value);
  }catch(e){
    textarea1.value=e.description;
  }
}
function input1.onkeypress(){
if(event.keyCode==13) button1.click();
}
function Eval(s){return xEval(s);}
function Execute(s){xExecute(s);}
</script>
<script language=vbscript defer>
Function xEval(s)
xEval=Eval(s)
End Function
Sub xExecute(s)
ExecuteGlobal s
End Sub
</script>
</head>
<body>
<input id=input1 type=text size=96 value='external.menuArguments.document.documentElement.outerHTML'>
<button id=button1>実行</button>
<textarea id=textarea1 cols=68 rows=31></textarea>
</body>
</html>

ExecScript.reg

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\スクリプトを実行(&J)]
@="C:\\フォルダ\\ExecScript.htm"
"Flags"=dword:00000001

2007年10月 4日 (木)

ちょっとしたスクリプトを簡単に入力して実行する。

数行のスクリプトをいちいちメモ帳を開いて入力して、閉じて名前を付けて、実行して、エラーが出たら、メモ帳を開いて直して、また実行、あー面倒臭。
InputBoxに入れて実行します。

Set fso=CreateObject("Scripting.FileSystemObject")
Set wShell=CreateObject("WScript.Shell")
Set Shell=CreateObject("Shell.Application")
Set ie=Shell.Windows().Item()

Do
  vbscript=InputBox("Enter VBScript..."&vbLf&Err.Description,WScript.ScriptName,vbscript,,0)
  If vbscript="" Then Exit Do
  Exec vbscript
Loop

Sub Exec(vbscript)
On Error Resume Next
Execute vbscript
End Sub

よく使うオブジェクトは前もって割り当て済みです。

2007年10月 3日 (水)

スクリプトと言語を一緒に指定する。

通常、スクリプトと言語は別に指定します。

window.execScript "スクリプト","vbscript"
window.setTimeout "スクリプト",,"vbscript"
<button language=vbscript onclick="スクリプト"></button>

しかし、一緒に指定することもできます。(undocumentedのようです。)

window.execScript "vbscript:スクリプト"
window.setTimeout "vbscript:スクリプト"
<button onclick="vbscript:スクリプト"></button>

さらに、関数ポインタなら言語の指定が不要です。

window.setTimeout GetRef("hoge")
Set button1.onclick=GetRef("hoge")

window.execScript()には、関数ポインタ指定がありません。

2007年10月 2日 (火)

セキュリティレベルに依存して実行できないBookmarkletを実行する。

javascript:やvbscript:プロトコルは、表示中のWebページのセキュリティゾーンのセキュリティレベルに依存するため、一般に実行できません。

ブックマークレットのインターネットショートカットを実行するには、次のVBSファイルをインターネットショートカットに関連付けるか、SendToに入れて、インターネットショートカットを右クリックして実行します。

execUrlScript.VBS

CreateObject("Shell.Application").Windows().Item().Document.parentWindow.setTimeout CreateObject("WScript.Shell").CreateShortCut(WScript.Arguments(0)).TargetPath

また、アドレスバーにjavascript:やvbscript:プロトコルを直接入力する代わりに、次のVBSファイルをお気に入りかリンクに入れて、こちらのInputBoxに入力します。

execScript.VBS

Set ie=CreateObject("Shell.Application").Windows().Item()
Do
  script=InputBox("Enter script...",WScript.ScriptName,script,,0)
  If script="" Then Exit Do
  ie.Document.parentWindow.setTimeout script
Loop

ここで、window.execScript()でなく、window.setTimeout()を使用するところが味噌です。前者は表示中のWebページのセキュリティゾーンのセキュリティレベルに依存します。後者は依存しません。

※ IE6まで。

2007年10月 1日 (月)

VBAで非同期割込処理。n秒後に自動的に閉じるMsgBox()

WScript.ShellのPopUp()の秒指定は、Excelなどでは使えません。:-(

そこで、htmlfileのwindow.setTimeout()を利用した代替方法です。

Dim wShell
Dim d

Sub aaa()
Set wShell = CreateObject("WScript.Shell")
wShell.PopUp "5秒経っても自動的に閉じません。", 5, "ユニークなタイトル"
Set d = CreateObject("htmlfile")
Set d.parentWindow.opener = Me
d.parentWindow.setTimeout "opener.proc", 5000, "VBScript"
MsgBox "5秒後に自動的にとじます。", , "ユニークなタイトル"
End Sub

Sub proc()
If wShell.AppActivate("ユニークなタイトル") Then
  wShell.SendKeys "{ESC}"
  d.parentWindow.setTimeout "opener.proc", 1000, "VBScript"
End If
End Sub

VBAには関数ポインタがないので、GetRef("proc")の代わりに、
オブジェクトのMeを渡して、メソッドのprocを参照させます。

« 2007年9月 | トップページ | 2007年11月 »