4

Option Private ModuleVBA のすべてのモジュールに自動的に追加する方法はありますか?

Option explicitExtras>Option>editor でチェックボックスをマークして変数を宣言すると、自動的に追加されるようなものですか?

すべてのモジュールを調べて手動で記述することが唯一の選択肢のように思えるからです。

サブ質問: 10 個のアプリケーションのすべてのモジュール に追加Option Private Moduleする必要がある場合、どうしますか?

最初は単純な Replace を使用して を に置き換えるOption ExplicitことOption Explicit ^p Option Private Moduleを考えていましたが、クラス内でも置き換えられるため、そこから削除する必要があります。

ここで 30 分ほど節約するためのアイデアはありますか?

4

2 に答える 2

9

この例は、開いている保護されていないすべてのプロジェクトで機能します。保護されたプロジェクトを変更する必要がある場合は、まず保護を解除してください。

アドインへの変更は明示的に保存する必要があることに注意してください。

さまざまなチェックの背後にある理論的根拠については、インライン コメントを参照してください。

Sub Foo()

  'Add a reference to Visual Basic for Applications Extensibility
  Dim proj As VBIDE.VBProject
  Dim comp As VBIDE.VBComponent
  For Each proj In Application.VBE.VBProjects

    'Check the project isn't protected
    If proj.Protection = vbext_pp_none Then

      For Each comp In proj.VBComponents
        'Check we're working with a standard module
        If comp.Type = vbext_ct_StdModule Then
          'TODO: Check that Option Private Module doesn't already exist
          comp.CodeModule.InsertLines 1, "Option Private Module"
        End If

      Next comp

    End If

  Next proj

End Sub

OP(@vityata)から編集:あなたの回答に更新された回答を追加することにしました(気にしないでください)。遅延バインディングを使用しているため、ライブラリは必要ありません。

'---------------------------------------------------------------------------------------
' Method : AddOptionPrivate
' Author : stackoverflow.com
' Date   : 12.01.2017
' Purpose: Checking for "Option Private Mod~" up to line 5, if not found we add it in
'           every module
'---------------------------------------------------------------------------------------
Sub AddOptionPrivate()

    Const UP_TO_LINE = 5
    Const PRIVATE_MODULE = "Option Private Module"

    Dim objXL               As Object

    Dim objPro              As Object
    Dim objComp             As Variant
    Dim strText             As String

    Set objXL = GetObject(, "Excel.Application")
    Set objPro = objXL.ActiveWorkbook.VBProject

    For Each objComp In objPro.VBComponents
        If objComp.Type = 1 Then
            strText = objComp.CodeModule.Lines(1, UP_TO_LINE)

            If InStr(1, strText, PRIVATE_MODULE) = 0 Then
                objComp.CodeModule.InsertLines 2, PRIVATE_MODULE
            End If

        End If
    Next objComp

End Sub
于 2017-01-12T11:49:05.337 に答える