スキップしてメイン コンテンツに移動

アーリーバインディングとレイトバインディング

はじめに、と後から、というくらいの違いは知ってはいるけど。
改めてどう違うのか?を調べてみた。

書式の違いはこう(VBA)
・アーリーバインディングの例
    Dim myApp as Excel.Application
    Set myApp = Application

・レイトバインディングの例
    Dim myApp as Object
    Set myApp = Application
    
    もう一例
    Dim myApp as Object
    Set myApp = CreateObject("Excel.Application")

まあ、CreateObjectで書く事が多いよね。

でも、やっぱりアーリーバインディングで書く事には相応の違いがあるそうな。

一つは、たとえばメソッドの存在チェック。
アーリーバインディングでは、"myApp"内に当該メソッドが存在するかはコンパイル時にチェックされる。
一方レイトバインディングではプログラムが実際に実行されるまではチェックがされない。
つまり、動かしてみないと判らない、という事。

開発やテストの事を考えるとアーリーバインディングのほうがやっぱりいいんだろう。

コメント

このブログの人気の投稿

対処例:Accessフォームでチェックボックスが思うように設定できない

開発プラットフォームとしてAcccessという事は多い。 そして何気に不思議な動作をする事が多いのも事実。 今回であったのは、フォームに置いたチェックボックスが、フォームを開いた際に思ったように振舞ってくれない、というもの。 このチェックボックスは規定値=FALSEで設定してあって、人の操作以外でこのチェックボックスの値は操作していない。 そしてこのチェックボックスを置いたフォームを開くと… 問題のチェックボックス、チェックがついた状態で描画される!!! こまったチャンである。 時折は意図したとおりにOFFの状態で開く場合もあるものの、まれ。 ここはしっかりユーザーの操作(チェックボックスをONにする)に基づき、関連の項目を入力してもらう、という動作をさせたいし、また他へのI/F項目でもあって、しっかりさせたい。ちなみに、TripleState プロパティは Falseに設定してある。 簡単にググッてみたものの、ちょっと同様の事例や対処は見つからず。いくつか試したが、うまく行かない。 で、結論から書くと、こういう対処をした。 Form_OPENイベントの際に、問題のチェックボックスに以下の操作を実行 ・問題のチェックボックスにフォーカス設定 ・問題のチェックボックスに対して、SendKeys でスペース(" ")一文字投げつけ ・問題のチェックボックスの Value 値を確認。True の場合、もう一回SendKey でスペース(" ")一文字投げつけ 発想としては、チェックボックスがカレントな状態のとき、スペースキーで値が操作できる事を思い出し、ぶつけてみた。 でも、実は最初はうまく行かず。 はて? で、 SendKeys のリファレンスを改めて眺めて、 Wait オプションがある事を思い出した。 解説するまでもないが、これが True の場合、そのキーが処理されるまでVBAは次の実行をまつ。デフォルトでは False で実行される。なので、Accessが、なげつけられた?(いや、自分で自分に投げているわけだから…)スペースキーを受け取る前にVBAが進んでるか?と思い、以下に書き換えてやってみた。 SendKeys " ", True ...

VBS で引数を受け取るサンプル

WScript.Arguments に引数要素が配列で格納されているので、これを取り出す。 =========================================== '############################# 'パラメータ=オーダーIDの取り出しとセット '############################# Dim oParam 'パラメータオブジェクト Dim strPrm0  'パラメータ要素格納 Set oParam = WScript.Arguments strPrm0 = oParam(0) Wscript.echo strPrm0 =========================================== これを引数あり、引数なしでそれぞれ実行してみる。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >cscript.exe test.vbs a a >cscript.exe test.vbs test.vbs(9, 1) Microsoft VBScript 実行時エラー: インデックスが有効範囲にありません。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ strPrm0 = oParam(0) の場所で怒られている。 引数なしで起動した場合には相応の対応をしたい。 そこで、上記を書き換える。 WScript.Arguments のCount ポロパティの値をチェックして動作を切り分ける方法。 =========================================== '############################# 'パラメータ=オーダーIDの取り出しとセット '############################# Dim oParam 'パラメータオブジェクト Dim strPrm0  'パラメータ要素格納 Set oParam = WScript.Arguments ...

SKYSEAの外部デバイスへのコピー抑止を回避する方法

社内のシステム屋としてあまりほめられた事ではないが。 うちの会社ではSKYSEAを導入していて、配布するPCにはそのクライアントがインストールされている。 でも時としてそれが邪魔(会社としては邪魔するために入れているのだから当たり前だが…)な時がある。 そこでこんなのをこしらえた。 <skeseaYokushi.bat> ============================================= rem SKYSEAの外部デバイスへのコピー禁止を回避する為にサービスをとめる。 echo off sc stop "scvcabproxysvr" sc stop "astexagt" sc stop "scvsvc" sc stop "scv logagentservice" sc stop "logsvr" sc stop "icssvc" echo ============================================= SKYSEAは全部で6つのサービスで出来ている。それをとめてしまう、というバッチコマンド。ただ、このサービス相互に依存関係があり、いっぺんには停止が出来ない。 さらに厄介なのが、サービスをとめても、後ほど自動的に再起動がかかる、というつくり。ある程度時間がかかるファイルコピーでは困ってしまう。 そこで上記のコマンドをタスクスケジューラで連続的に起動してサービスをとめ続けてしまえ、とやったのが以下 <skyseayokusei.xml> ============================================= <?xml version="1.0" encoding="UTF-16"?> <Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">   <R...