首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向VBProject.VBComponents添加默认的Rubberduck文件夹注释

向VBProject.VBComponents添加默认的Rubberduck文件夹注释
EN

Code Review用户
提问于 2020-08-18 22:04:13
回答 1查看 274关注 0票数 6

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

先于

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

代码语言:javascript
复制
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!

EN

回答 1

Code Review用户

回答已采纳

发布于 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块中提取分隔点)--然后我可能会给它一点喘息的空间,但这更主观:

代码语言:javascript
复制
    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 &”)“

注意这也是合法的..。更容易生成:

代码语言:javascript
复制
Component.CodeModule.InsertLines 1, "'@Folder " & FolderName

显然,如果您喜欢括号大小的语法(这两种语法都有效,这实际上只是个人偏好),就像我所做的那样,无论如何都要保留它,但是Rubber鸭的新的“移动到文件夹”命令并没有把括号放进去。我可能也会拼出单引号'字符,但我可以看到,在一串"双引号中间,'可能比必要的更难读。另一方面,为其定义一个常量将消除在多个地方定义"@Folder字符串文字的需要:

代码语言:javascript
复制
Private Const RD_FOLDER_ANNOTATION As String = "'@Folder "

...

Component.CodeModule.InsertLines 1, RD_FOLDER_ANNOTATION & FolderName

我必须指出的是,Rubber鸭子故意将所有模块推到同一个默认的名为“后项目”文件夹下(它们可以很容易地按代码资源管理器中的组件类型排序),因为我们坚信按组件类型分组模块是完全没用的,而且适得其反:当我查看与该功能相关的所有代码时,我想看到与该功能相关的所有代码--而且我也不关心我所看到的代码的组件类型.反正基本上都是类模块。

在项目中组织模块的一种明智方法是功能:您希望您的ThingView用户表单与您的ThingModel类、ThingPresenterThings自定义集合位于相同的位置--这样,当您处理该组件时,您不必在某个无用的“类模块”文件夹下的一个不断增长的组件列表中挖掘各种组件。

票数 6
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/248109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档