【问题标题】:Error when referring to many multiple named ranges in Range property在 Range 属性中引用多个多个命名范围时出错
【发布时间】:2018-05-01 17:54:06
【问题描述】:

对于一个大型数据表,我有大约 236 个命名范围(列)。尝试拆分分隔命名范围的长代码行时出现此错误:

运行时错误“1004”应用程序定义或对象定义错误

例如:

Worksheets("Sheet1").Range("foo1,foo2" _
    & "foo3,foo4" _
    & "..." _
    & "foo235,foo236")

我正在尝试根据特定条件(命名范围)过滤和取消过滤列。一切似乎都可以正常工作(对于仅跨越 1 行长度的较小字符串),直到我必须将代码拆分为多行,因为它到达窗口的末尾..

代码 -

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Address = "$B$3" Then
        Worksheets("Sheet1").Range("Fruit," _
            & "Months,Colour").EntireColumn.Hidden = Target.Value = "CustomView"
    End If

    If Target.Address = "$B$3" Then
        Worksheets("Sheet1").Range("Colour,Number" _
            & "Months").EntireColumn.Hidden = Target.Value = "Custom2View"
    End If
End Sub

此代码似乎不起作用。我认为这与引号以及 excel 如何读取它有关,但我还没有找到修复方法。

根据 cmets 中的建议测试新代码会导致错误 Run-time error '1004' Application-defined or object-defined error

Private Sub Worksheet_Change(ByVal Target As Range)

Dim arr, i As Long, rng As Range

If Target.Address = "$B$3" Then
    arr = Split("foo1,foo2,foo3,...,foo266,foo267", ",")
 Set rng = Worksheets("Database").Range(arr(0))
 For i = 1 To UBound(arr)
 Set rng = Application.Union(rng, Worksheets("Database").Range(arr(i)))
 Next i
 rng.EntireColumn.Hidden = (Target.Value = "CustomView")
End If

End Sub

【问题讨论】:

  • 运行代码时会发生什么?
  • @TimWilliams 我收到一个运行时错误“1004”应用程序定义或对象定义错误对话框,然后当我去调试时,它会突出显示从工作表开始的整个部分
  • 第一个块看起来不错,但第二个块在“数字”之后缺少逗号。仅供参考,如果此代码在 Sheet1 中,那么您可以使用 Me 代替 `Worksheets("Sheet1")`
  • 第一个块或第二个块都不起作用。我尝试了一些不同的方法,在文本之间而不是在结尾处分割线(这解决了我认为引号的位置是一个问题的问题),它适用于小数据范围,但适用于 100 多个命名范围它再次遇到错误的括号。感谢您对工作表名称的建议。
  • 您不能将超过 255 个字符传递给 Range() 方法。例如;见mrexcel.com/forum/excel-questions/…

标签: vba excel show-hide


【解决方案1】:

您可以使用Application.Union 建立一个范围,然后一次性隐藏/显示该范围。

编辑:根据您的第二个共享文件,我认为您需要这样的东西。您之前的代码没有检查“视图名称”单元格的值,而是应用了所有视图,只剩下最后一个...

例如:

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim arr, q As Long, rng As Range, sht As Worksheet

    Set sht = Worksheets("Database")

    If Target.Address = "$B$3" Then

        'unhide all columns forst
        sht.UsedRange.EntireColumn.Hidden = False

        Select Case Target.Value
            Case "CustomView"
                arr = Split("A,B,C_,X,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM," & _
                  "AN,AO,AP,AQ,AR,AS,AT,AV,AW,AX,AY,AZ,BA,BB,BC,BD,BE,BF,BG," & _
                  "BH,BI,BJ,BK,BL,BM,BN,BO,BP,BQ,BR,BS,BT,BU,BV,BW,BX,BY,BZ,CA," & _
                  "CB,CC,CD,CE,CF,CG,CH,CI,CJ,CK,CL,CU,CV,CW,CX,CY,CZ,DA,DB,DC", ",")
            Case "XX100View"
                arr = Split("D,E,F,G,X,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO," & _
                   "AP,AQ,AR,AS,AT,AV,AW,AX,AY,AZ,BA,BB,BC,BD,BE,BF,BG,BH,BI,BJ," & _
                   "BK,BL,BM,BN,BO,BP,BQ,BR,BS,BT,BU,BV,BW,BX,BY,BZ,CA,CB,CC,CD,CE," & _
                   "CF,CG,CH,CI,CJ,CK,CL,CU,CV,CW,CX,CY,CZ,DA,DB,DC", ",")
            Case "OtherView"
                arr = Split("A,B,D,E,F,G,H,I,X,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM," & _
                    "AN,AO,AP,AQ,AR,AS,AT,AV,AW,AX,AY,AZ,BA,BB,BC,BD,BE,BF,BG,BH," & _
                    "BI,BJ,BK,BL,BM,BN,BO,BP,BQ,BR,BS,BT,BU,BV,BW,BX,BY,BZ,CA,CB," & _
                    "CC,CD,CE,CF,CG,CH,CI,CJ,CK,CL,CU,CV,CW,CX,CY,CZ,DA,DB,DC", ",")
        End Select

        If Not IsEmpty(arr) Then
            Set rng = sht.Range(arr(0))
            For q = 1 To UBound(arr)
                Set rng = Application.Union(rng, sht.Range(arr(q)))
            Next q
            rng.EntireColumn.Hidden = True '<<edited
        End If 'got a view

    End If 'is view name cell
End Sub

PS - 您的范围名称不需要包含所有数据:单个单元格就可以了,因为无论如何您都使用 EntireColumn 将其扩展到整个工作表高度。

【讨论】:

  • 您好,我还不熟悉 application.union 方法,因此很难对其进行故障排除。我收到一个错误,指示“编译错误:无效的下一个控制变量引用”,它突出显示到“下一个 v”行 - 我修复了这个假设它应该是“下一个 i,但后来我得到一个运行时错误 '1004 '对象'Works的方法'Range' - 修复了数据库名称以包括Worksheets(“Database”),因为工作表的名称不同 - 现在我有一个运行时错误1004 - 应用程序定义或对象定义的错误和它突出显示了 'Set rng = Application.Union(rng, Wor..) 行。
  • 您能否更新您的问题以添加您正在尝试的确切代码?
  • 您隐藏在同一工作表上的列是否与触发事件的单元格相同?
  • 我现在已经编辑了上面的问题。我要隐藏的列位于名为“数据库”的单独工作表上,我的视图选择器必须位于与表不同的工作表上,因为它用于预先选择隐藏的列,但因为这是一个表我不能使用自定义视图,因此尝试创建此代码作为解决方法。请注意,我将 v 更改为 i,并在尝试识别这些错误时添加了工作表名称。
  • 错误是否出现在i的特定值上,数据库表上是否存在对应的范围名称?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
相关资源
最近更新 更多