ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索

关于VBA中的名称管理器的bug

已有 16 次阅读2024-2-1 08:34 |个人分类:bug合集| 名称管理器

vba名称管理器用的主要是name对象(还有一个类似的names对象),它是workbook下属的一个子对象,无法只获取worksheets范围内生效的name,如下是我写的将选取单元格这列的公式内的单元格引用变成名称引用的代码,我发现Excel在创建名称的时候,会隐式的创建一个名称为_xlfn_SINGLE的名称, 我如下代码中通过name的visible属性将其排除掉而解决

另外还有一个值得注意的地方是,当你在循环name的时候,你观察name的referstorange属性,并不是名称管理器中名称的范围,而始终是单个的单元格,我总结为这也就是为什么名称引用不会像单元格A1C1样式引用那样会发生偏移错误吧,个中原理我就没再深究


Public Sub addname()

    Dim wb As Workbook
    Dim nm As Name
    Dim Rng As Range, Tng As Range, c, r
    Dim str As String
    Dim regex As Object
    Dim matches As Object, cel
    Dim match As Object, txt As String
    On Error Resume Next
    Set regex = CreateObject("VBScript.RegExp")
    With regex
        .Pattern = "([A-Z]+[0-9]+)"
        .Global = True
    End With
    
    ' 获取当前活动的工作簿
    Set wb = ActiveWorkbook
    Set Rng = Range(Selection, Selection.End(xlDown))
    n = 0
        
    ' 遍历每个名称管理器
For Each Tng In Rng
    Set matches = regex.Execute(Tng.Formula)
    For Each cel In matches
        For Each nm In wb.Names
            If nm.Visible = False Then
            GoTo line
            End If
            If Not Intersect(Range(cel), nm.RefersToRange) Is Nothing Then
                Tng.Formula = Replace(Tng.Formula, cel, nm.Name)
            End If
line:
        Next
    Next
Next
End Sub

路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 免费注册

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-28 23:07 , Processed in 0.027400 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

返回顶部