目前,Rubberduck文件中的所有VBProject VBComponents都没有以VBProject命名的文件夹中的文件夹注释。第一次手动组织组件可能很费时,而且向每个工作表、Userform、Class、...ect添加注释也不方便。运行时,我的代码将通过ProjectName.ComponentType组织任何未归档的组件。


您需要添加对Microsoft Visual Basic for Applications Extensibility 5.3的引用,并从文件选项中选择“信任访问VBA项目对象模型”。

Private Sub AddDefaultFolderAnnotationsToVBComponents()
Dim Component As VBComponent
Dim Project As VBProject
Select Case Application.Name
Case "Microsoft Access", "Microsoft Word"
Set Project = IIf(True, Application, 0).VBE.ActiveVBProject
Case "Microsoft Excel"
Set Project = IIf(True, Application, 0).ActiveWorkbook.VBProject
Case "Microsoft PowerPoint"
Set Project = IIf(True, Application, 0).VBE.VBProjects(1)
End Select
Dim FolderName As String
Dim HasFolder As Boolean
For Each Component In Project.VBComponents
With Component.CodeModule
If .CountOfLines = 0 Then
HasFolder = False
Else
HasFolder = InStr(.Lines(1, .CountOfLines), Chr(39) & "@Folder")
End If
End With
If Not HasFolder Then
Select Case Component.Type
Case vbext_ComponentType.vbext_ct_StdModule
FolderName = Project.Name & ".Modules"
Case vbext_ComponentType.vbext_ct_ClassModule
FolderName = Project.Name & ".Classes"
Case vbext_ComponentType.vbext_ct_MSForm
FolderName = Project.Name & ".Forms"
Case vbext_ComponentType.vbext_ct_ActiveXDesigner
FolderName = Project.Name & ".Designers"
Case vbext_ComponentType.vbext_ct_Document
FolderName = Project.Name & ".Documents"
End Select
Component.CodeModule.InsertLines 1, Chr(39) & "@Folder(""" & FolderName & """)"
End If
Next
End Sub注意:为了便于移植,我特意将所有功能保存在一个过程中。
对于Rubber鸭团队来说,最新版本的橡胶鸭VBA v2.5是一个遵循MVVM模式的C# WPF!
发布于 2020-08-22 16:05:46
HasFolder = InStr(.Lines(1,.CountOfLines),Chr(39) &“@文件夹”)
在实际上没有注释的模块中,该条件在技术上可以是True;@Folder Rubber鸭注释仅在模块的声明部分有效,因此不需要比.CountOfDeclarationLines更深入地获取模块内容--如果模块接近10K行容量,而不是使用.CountOfLines,那么传递给InStr函数的字符串的大小可能会有很大的不同。
选择Case Component.Type Case vbext_ComponentType.vbext_ct_StdModule FolderName = Project.Name & ".Modules“Case vbext_ComponentType.vbext_ct_ClassModule FolderName = Project.Name & ".Classes”Case FolderName = Project.Name & ".Forms“Case vbext_ComponentType.vbext_ct_ActiveXDesigner FolderName = Project.Name & ".Designers”Case vbext_ComponentType。vbext_ct_Document FolderName = Project.Name & ".Documents“结束选择
我不会重复这里的连接--只需计算出每个组件类型的名称的最后一部分,然后与Project.Name & "."连接(我也会从Case块中提取分隔点)--然后我可能会给它一点喘息的空间,但这更主观:
Select Case Component.Type
Case vbext_ComponentType.vbext_ct_StdModule
ChildFolderName = "Modules"
Case vbext_ComponentType.vbext_ct_ClassModule
ChildFolderName = "Classes"
Case vbext_ComponentType.vbext_ct_MSForm
ChildFolderName = "Forms"
Case vbext_ComponentType.vbext_ct_ActiveXDesigner
ChildFolderName = "Designers" 'note: not supported in VBA
Case vbext_ComponentType.vbext_ct_Document
ChildFolderName = "Documents"
End Select
FolderName = Project.Name & "." & ChildFolderName我喜欢@Folder("Parent.Child")语法,我看到这就是您在这里生成的:
Component.CodeModule.InsertLines 1,Chr(39)和“@文件夹”(“FolderName &”)“
注意这也是合法的..。更容易生成:
Component.CodeModule.InsertLines 1, "'@Folder " & FolderName显然,如果您喜欢括号大小的语法(这两种语法都有效,这实际上只是个人偏好),就像我所做的那样,无论如何都要保留它,但是Rubber鸭的新的“移动到文件夹”命令并没有把括号放进去。我可能也会拼出单引号'字符,但我可以看到,在一串"双引号中间,'可能比必要的更难读。另一方面,为其定义一个常量将消除在多个地方定义"@Folder字符串文字的需要:
Private Const RD_FOLDER_ANNOTATION As String = "'@Folder "
...
Component.CodeModule.InsertLines 1, RD_FOLDER_ANNOTATION & FolderName我必须指出的是,Rubber鸭子故意将所有模块推到同一个默认的名为“后项目”文件夹下(它们可以很容易地按代码资源管理器中的组件类型排序),因为我们坚信按组件类型分组模块是完全没用的,而且适得其反:当我查看与该功能相关的所有代码时,我想看到与该功能相关的所有代码--而且我也不关心我所看到的代码的组件类型.反正基本上都是类模块。
在项目中组织模块的一种明智方法是功能:您希望您的ThingView用户表单与您的ThingModel类、ThingPresenter和Things自定义集合位于相同的位置--这样,当您处理该组件时,您不必在某个无用的“类模块”文件夹下的一个不断增长的组件列表中挖掘各种组件。
https://codereview.stackexchange.com/questions/248109
复制相似问题