自动将 `Option Private Module` 添加到 VBA 中的所有模块
Automatically add `Option Private Module` to all modules in VBA
有没有办法自动将 Option Private Module
添加到 VBA 中的所有模块?
当我们在 Extras>Option>editor 中勾选变量声明的复选框时,会自动添加 Option explicit
吗?
因为遍历所有模块并以某种方式手动编写它似乎是唯一的选择。
子题:
如果你必须在 10 个应用程序中的所有模块中添加 Option Private Module
,你会怎么做?
起初我想使用一个简单的替换,将 Option Explicit
替换为 Option Explicit ^p Option Private Module
,但它也会在 类 中替换它,我必须删除它从那里。
想在这里节省大约 30 分钟?
这应该可以帮助您完成大部分工作,并且此示例适用于所有打开的、未受保护的项目。如果您需要修改受保护的项目,请先取消保护。
请记住,您需要明确保存对任何 add-ins 的更改。
查看内联评论以了解各种检查背后的基本原理
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 : whosebug.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
修改我现有的代码花了我一点时间,你可以尝试下面的代码将"Option Explicit"的所有地方替换为"Option Private Module"。
代码
Option Explicit
Sub ReplaceOptionExplicitInModules()
Dim VBProj As VBIDE.VBProject
Dim VBComp As VBIDE.VBComponent
Dim CodeMod As VBIDE.CodeModule
Dim i As Long
' loop though all open projects
For Each VBProj In Application.VBE.VBProjects
If VBProj.Protection = vbext_pp_none Then
' loop through all modules, worksheets and other objects in VB Project
For Each VBComp In VBProj.VBComponents
If VBComp.Type <> vbext_ct_ClassModule Then ' <-- check if module type is not class (to replace also on sheet and workbook events)
Set CodeMod = VBComp.CodeModule
' loop through all code lines inside current module
For i = 1 To CodeMod.CountOfLines
If Len(CodeMod.Lines(i, 1)) > 0 Then
' if line contents is "Option Explicit*"
If CodeMod.Lines(i, 1) Like "Option Explicit*" Then
CodeMod.ReplaceLine i, "Option Private Module"
End If
End If
Next i
End If
Next VBComp
End If
Next VBProj
End Sub
有没有办法自动将 Option Private Module
添加到 VBA 中的所有模块?
当我们在 Extras>Option>editor 中勾选变量声明的复选框时,会自动添加 Option explicit
吗?
因为遍历所有模块并以某种方式手动编写它似乎是唯一的选择。
子题:
如果你必须在 10 个应用程序中的所有模块中添加 Option Private Module
,你会怎么做?
起初我想使用一个简单的替换,将 Option Explicit
替换为 Option Explicit ^p Option Private Module
,但它也会在 类 中替换它,我必须删除它从那里。
想在这里节省大约 30 分钟?
这应该可以帮助您完成大部分工作,并且此示例适用于所有打开的、未受保护的项目。如果您需要修改受保护的项目,请先取消保护。
请记住,您需要明确保存对任何 add-ins 的更改。
查看内联评论以了解各种检查背后的基本原理
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 : whosebug.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
修改我现有的代码花了我一点时间,你可以尝试下面的代码将"Option Explicit"的所有地方替换为"Option Private Module"。
代码
Option Explicit
Sub ReplaceOptionExplicitInModules()
Dim VBProj As VBIDE.VBProject
Dim VBComp As VBIDE.VBComponent
Dim CodeMod As VBIDE.CodeModule
Dim i As Long
' loop though all open projects
For Each VBProj In Application.VBE.VBProjects
If VBProj.Protection = vbext_pp_none Then
' loop through all modules, worksheets and other objects in VB Project
For Each VBComp In VBProj.VBComponents
If VBComp.Type <> vbext_ct_ClassModule Then ' <-- check if module type is not class (to replace also on sheet and workbook events)
Set CodeMod = VBComp.CodeModule
' loop through all code lines inside current module
For i = 1 To CodeMod.CountOfLines
If Len(CodeMod.Lines(i, 1)) > 0 Then
' if line contents is "Option Explicit*"
If CodeMod.Lines(i, 1) Like "Option Explicit*" Then
CodeMod.ReplaceLine i, "Option Private Module"
End If
End If
Next i
End If
Next VBComp
End If
Next VBProj
End Sub