【问题标题】:Dynamic Named Range error: 'Run-Time Error '1004 - Method 'Range' of object '_Worksheet' failed'动态命名范围错误:'运行时错误'1004 - 对象'_Worksheet'的方法'范围'失败'
【发布时间】:2020-12-12 06:48:47
【问题描述】:

我正在尝试在工作表 HDaER 中命名一个动态范围。

范围应该是从.Cells(3, 2)HDaERCloseLR(最后一行)和HDaERCloseLR(最后一列)的填充区域。

到目前为止,我有这个:

    1    Dim HDaER As Worksheet    
    2    Dim HDaERCloseLR As Integer 
    3    Dim HDaERCloseLC As Integer 
    4    Dim HDaERCloseDNR As Range
    5    Dim HDaER As String    
    6    Set HDaER = Sheets("HDaER")
    7    
    8    With HDaER.Cells
    9        HDaERCloseLR = .Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, _
    10       SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 
    11          
    12       HDaERCloseLC = .Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, _
    13       SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column 
    14        
    15       Set HDaERCloseDNR = HDaER.Range(HDaER.Cells(3, 2) & _
    16       HDaER.Cells(HDaERCloseLR, HDaERCloseLC))
    17   End With
    18        
    19        Scope.Names.Add Name:=HDaERClose, RefersTo:=HDaERCloseDNR
    20    
    21        HDaERClose.Select

我明白了

运行时错误“1004” - 对象“_Worksheet”的“方法“范围”失败”

在第 15 行,我有 Set HDaERCloseDNR = HDaER.Range(HDaER.Cells(3, 2) & HDaER.Cells(HDaERCloseLR, HDaERCloseLC))

我在第 21 行对命名范围 HDaERClose 使用了 .Select 命令来测试代码,但从不去那里。

应用 cmets 和答案中建议的更改后,我得到了这个:

我必须选择范围,但我需要的是直到第一个数据集的最后一行(示例中为 105)和最后一列(示例中为 E)的范围。

应排除第 105 行和 E 列的数据。

【问题讨论】:

  • 我没有看到任何你为HDaERClose 赋值的地方。我想你想用引号将它括起来 "HDaERClose" 然后你会用 Range("HDaERClose").Select 调用它
  • 在模块顶部使用Option Explicit(帮助)防止因@ScottCraner 未声明的变量引起的错误,并显示其余代码。根据您提供的内容,Scope 对象未实例化/分配。
  • 那你要with hdaer.cells(3,2).currentregion
  • @ScottCraner:我在复制代码时错过了那行。我在上面的代码中进行了编辑 - 在第 5 行添加了 Dim HDaERClose As String
  • 不,我很好,谢谢。很高兴能帮上忙。

标签: vba excel named-ranges


【解决方案1】:

我认为您的意思是使用逗号 (,) 而不是与符号 (&)。

15       Set HDaERCloseDNR = HDaER.Range(HDaER.Cells(3, 2) , _
16          HDaER.Cells(HDaERCloseLR, HDaERCloseLC))

【讨论】:

  • @K.Davis:新手错误。这让我进入了第 15 行,但现在我在第 19 行得到了一个“运行时错误 424:需要对象”,其中我有 Scope.Names.Add Name:=HDaERClose, RefersTo:=HDaERCloseDNR
  • @David Zemens:你是什么意思?你还有什么建议?
  • @I.Я.Newb 从您提供的代码中不清楚Scope 是什么。据推测,从错误消息来看,它是一个未定义/未分配的对象变量。另请注意,您应该为行/列变量使用Long 而不是Integer,因为电子表格中的行数大大超过了Integer 数据类型的限制。
  • @David Zemens:我尝试使用HDaERCloseLR = HDaER.Cells(HDaER.Rows.Count, 2).End (xlUp).Row 和最后一列 HDaERCloseLC = HDaER.Cells(HDaER.Columns.Count, 2).End (xlUp) 以传统方式挑战最后一行和最后一列。 Column`,但在 Last Row defiance 上给了我同样的错误。
  • 请参阅this,了解在范围/工作表/等中找到“最后一个”单元格的基本确定方法。
【解决方案2】:

除了K.Dᴀᴠɪs提出的解决方案,我建议进行以下修改以确保准确返回,

9        HDaERCloseLR = .Find(What:="*", AFTER:=.CELLS(1,1), LookIn:=xlFormulas, LookAt:=xlPart, _
10       SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 
11          
12       HDaERCloseLC = .Find(What:="*", AFTER:=.CELLS(1,1), LookIn:=xlFormulas, LookAt:=xlPart, _
13       SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column 

【讨论】:

    【解决方案3】:

    对初始代码应用所有建议的更正后,最终版本是:

    1    Dim HDaER As Worksheet
    2    Dim HDaERCloseLR As Long
    3    Dim HDaERCloseLC As Long
    4    Dim HDaERReturnLR As Long
    5    Dim HDaERReturnLC As Long
    6    Dim HDaERCloseDNR As Range
    7    Dim HDaERReturnsDNR As Range
    8
    9    Set HDaER = Sheets("HDaER")
    10    
    11   With HDaER.Cells(3, 2).CurrentRegion
    12        HDaERCloseLR = .Find(What:="*", After:=HDaER.Cells(1, 1),  LookIn:=xlFormulas, LookAt:=xlPart, _
    13        SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    14
    15        HDaERCloseLC = .Find(What:="*", After:=HDaER.Cells(1, 1), LookIn:=xlFormulas, LookAt:=xlPart, _
    16        SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
    17        
    18        Set HDaERCloseDNR = HDaER.Range(HDaER.Cells(3, 2), _
    19        HDaER.Cells(HDaERCloseLR, HDaERCloseLC))
    20    End With
    21
    22    HDaER.Names.Add Name:="HDaERClose", RefersTo:=HDaERCloseDNR
    23    
    24    Range("HDaERClose").Select
    

    代码的输出是:

    (所选范围代表动态命名范围HDaERClose


    应用更正


    1. 来自@K.Davis 的回答:

    我认为您的意思是使用逗号 (,) 而不是与号 (&)。

    15  Set HDaERCloseDNR = HDaER.Range(HDaER.Cells(3, 2) , _
    16  HDaER.Cells(HDaERCloseLR, HDaERCloseLC))
    

    将错误的&替换为,

    更正后,15 行(最终版本中的18 行)没有问题,所以这就是我正在寻找的答案。

    1. 来自@Japeed 的回答:

    除了 K.Dᴀᴠɪs 提出的解决方案,我建议 以下修改以确保准确返回,

    9        HDaERCloseLR = .Find(What:="*", AFTER:=.CELLS(1,1), LookIn:=xlFormulas, LookAt:=xlPart, _
    10       SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 
    11          
    12       HDaERCloseLC = .Find(What:="*", AFTER:=.CELLS(1,1), LookIn:=xlFormulas, LookAt:=xlPart, _
    13       SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
    

    After:=HDaER.Cells(1,1) 添加到HDaERCloseLRHDaERCloseLC 变量定义中,分别在后一个版本的1215 行以及前一个版本的912 行中。

    1. 来自@ScottCraner 的评论:

    我没有看到任何你为HDaERClose 赋值的地方。我觉得你 想把它括在引号"HDaERClose" 然后你会用 Range("HDaERClose").Select

    我将HDaERClose用引号括起来,并将Scope替换为HDaER,指的是Worksheet("HDaER"),在后一个代码版本的第22行将其分配为范围名称时,如下所示:

    HDaER.Names.Add Name:="HDaERClose", RefersTo:=HDaERCloseDNR

    这就解决了这一行的问题。

    1. 来自@ScottCraner 的评论:

    (关于编辑1

    那么你想要hdaer.cells(3,2).currentregion

    我将With函数从With HDaER.Cells更改为With HDaER.Cells(3,2).CorrentRegion,并仅校准了我需要的Range的引用。

    @ScottCraner 关于定义最后一行和最后一列的一个非常有用的链接可以找到here

    非常感谢所有参与解决此问题的人。我希望它也能帮助其他人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多