在VBA中对动态命名范围的适当蔑视:'运行时错误' 1004 - 方法'范围'对象' _Worksheet'失败'

时间:2018-03-08 00:38:17

标签: vba excel-vba named-ranges excel

...福利局

我正在尝试在工作表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行使用.Select命令作为命名范围HDaERClose来测试代码,但从未去过那里。

我该如何解决这个问题?

编辑1:

在向代码申请以下评论和答案中的建议更改后,我得到了这个结果:

Output after changes

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

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

适当的方法是什么?

END OF EDIT 1

3 个答案:

答案 0 :(得分:4)

我认为您打算使用逗号(,)代替&符号(&)。

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

答案 1 :(得分: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 

答案 2 :(得分:1)

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

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

HDaERCloseDNR

应用更正

  1. 来自@ K.Davis'答案:
  2.   

    我认为您打算使用逗号(,)而不是&符号(&)。

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

    将错误的&替换为,

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

    1. 来自@Japeed的回答:
    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
      

      After:=HDaER.Cells(1,1)添加到HDaERCloseLRHDaERCloseLC变量定义,后一版本1215912前一版本分别为{1}}。

      1. 来自@ ScottCraner的评论:
      2.   

        我没有看到您为HDaERClose分配值的位置。我觉得你   想把它括在引号"HDaERClose"中然后你会用它来调用它   Range("HDaERClose").Select

        我在引号中关闭了HDaERClose并将Scope替换为HDaER,引用Worksheet("HDaER"),在后一代码版本的第22行中将其指定为范围名称,如下所示:

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

        用这一行对问题进行了分类。

        1. 来自@ ScottCraner的评论:
        2. (关于编辑1

            

          然后你需要hdaer.cells(3,2).currentregion

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

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

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