質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

1332閲覧

Early BindingとLate Bindingについて

nanami12

総合スコア1015

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/07/17 06:15

Dim cnt As Long Const c列 = 3 Const d列 = 4 Const h列 = 8 Const i列 = 9 Sub open_dir_and_run() Dim Folder As Object Dim strPath As String Dim MaxRow As Long Dim Dir_path As String If Cells(6, c列).Value <> "" Then MaxRow = Cells(Rows.Count, c列).End(xlUp).Row cnt = MaxRow Else cnt = 5 End If 'パスを変更して下さい。 'strPath = "C:\tools\base\ログファイルサンプル 1 file" Dir_path = ThisWorkbook.Path strPath = Dir_path Call re_call(strPath) End Sub Sub re_call(ByVal strPath) Dim buf As String Dim textbuf As String Dim text_cnt As Long Dim flg1 As Integer Dim re As Object Dim mc As Object Dim m As Object Dim i As Long 'ライブラリ参照は止血 Dim f As Object Dim ws As Worksheet Set ws = Sheets(1) Set ws = Worksheets(1) Set re = CreateObject("VBScript.RegExp") '書式設定を標準から文字列に設定する。肝 デバッグのなごり。 ws.Columns(c列).NumberFormatLocal = "@" ws.Columns(d列).NumberFormatLocal = "@" ws.Columns(h列).NumberFormatLocal = "@" ws.Columns(i列).NumberFormatLocal = "@" buf = Dir(strPath & "\allLogAnalyse.log") 'ターゲットのファイル名 tgt_file = strPath & "\" & buf Do While buf <> "" Open tgt_file For Input As #1 Do Until EOF(1) Line Input #1, textbuf If textbuf = "================================== 個別判定 ==================================" Then flg1 = 1 End If If flg1 = 1 Then text_cnt = text_cnt + 1 End If If text_cnt > 3 Then '正規表現 cnt = cnt + 1 re.Pattern = "(\S+)\(\S+)\s*(\S*)\s*(\S*)" re.Global = True Set mc = re.Execute(textbuf) For Each m In mc ws.Cells(cnt, c列).Value = m.SubMatches(0) ws.Cells(cnt, d列).Value = m.SubMatches(1) ws.Cells(cnt, h列).Value = m.SubMatches(2) ws.Cells(cnt, i列).Value = m.SubMatches(3) Next End If Loop Close #1 'ファイルクローズした、時点でフラグとtext_cntを初期化。 flg1 = 0 text_cnt = 0 buf = Dir() Loop With CreateObject("Scripting.FileSystemObject") For Each f In .GetFolder(strPath).SubFolders Call re_call(f.Path) Next f End With End Sub

このコーディングは VBA ツール->参照設定で正規表現のライブラリの
レ点を外しても動作するコードです。
つい最近、そういう事がVBAではできると知りました。

VBAにお詳しい方にご質問させて下さい。
一般的に、参照設定はさせないコーディングを
するほうがスタンダードなのでしょうか?

つい最近までは、ツールの参照設定でライブラリの参照設定を
するコーディングをしていました。

参照設定をしなくても良いコードなら
他のユーザにマクロを公開する際、ライブラリにレ点をつけてね
なんて言わなくてもよくなり、これはいい事だらけだな。
と感じたのですが、何かデメリットとなる事など
ございましたら、リプライして頂けると
助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず、勘違いされているかもしれませんので、下記の点をご確認ください。

Early Binding (事前バインディング) は、変数の宣言でオブジェクトの型をきっちり指定している。

vba

1Dim re As VBScript.RegExp 2Dim f As Scripting.FileSystemObject

Late Binding(実行時バインディング)は、変数の宣言をどんな型でも代入できるObject型で宣言している。

Dim re As object Dim f As Object

単純にこの違いです。参照設定しているかどうかは関係ないです。
(ただし、前者のコードは参照設定してないとコンパイルエラーになりますが。)
後者だと参照設定してあっても、実行時バインディングになります。

つまり事前にオブジェクトの型か決まっているかどうかの違いです。
事前バインディングだとコンパイル時にメソッドやプロパティの正当性がチェックされます。
実行時バインディングだと実行時にメソッドやプロパティが呼び出されたとき、その都度チェックされます。その分、遅くなります。

また、事前バイディングだと変数を入力して . を入力すると候補リスト(インテリセンス)が出ますので、スペルミスか発生しにくいというメリットがあります。また、スペルミスをしていた場合、コンパイル時にミスを指摘してくれます。
実行時バイディングだと実行したときに実行時エラーになりますので、実行するまで気が付きません。

ということで、事前バインディングの方がメリットか多いので、通常は事前バインディングの方が推奨されます。

ただし、開発環境と違う環境に配布するときに、参照設定不可になって動作しない場合があるので、不特定の環境に配布する場合は、実行時バインディングにします。ただし、この場合は、開発時は事前バインディングでコーディングして完成してから、実行時バインディングに変更して配布するようにすると効率的に開発できます。

参考リンク

VBA - 事前バインディングで「すでに開いているブック」を取得する方法は存在しますか?|teratail

4.4 アーリーバインディングとレイトバインディング - EXCEL-VBA開発講座

投稿2019/07/17 08:26

編集2019/07/17 08:33
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanami12

2019/07/17 08:41

開発時はEarly Bindingで行い、動作確認ができたら Late Bindingで配布するように、心がけます。 丁寧なご回答、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問