VBA:不同的工作表,相同的命名单元格范围?

时间:2015-10-13 18:44:49

标签: excel vba excel-vba

我正在使用返回" object_global范围失败的代码"以下代码的第二部分(工作表3代码)突出显示。

使用相同的命名范围,但在不同的工作表上,正如我在下面所做的那样导致这个?

Worksheets(2).Range("LTSDI").AutoFill Destination:=Range("LTSDI:LTEDI"), Type:=xlFillDefault

Worksheets(3).Range("LTSDI").AutoFill Destination:=Range("LTSDI:LTEDI"), Type:=xlFillDefault

感谢您的反馈!

2 个答案:

答案 0 :(得分:5)

为了比上面的评论更清楚,命名范围以下列方式工作。

命名范围可以有2个范围:

  • 工作簿级别
  • 工作表级

Excel允许在同一工作簿中使用相同的命名范围,只要它具有不同的范围。换句话说,Excel不允许在工作簿级别或工作表名称中使用相同的范围名称。

作为一个例子,以下是可以的:

  • myRange = Sheet1!$ A $ 1范围:工作簿
  • myRange = Sheet2!$ A $ 1范围:Sheet2

但以下不是:

  • myRange = Sheet1!$ A $ 1范围:工作簿
  • myRange = Sheet2!$ A $ 1范围:工作簿

所有这一切,引用命名范围的方式如下:

工作簿范围级别

  

来自任何工作表上的任何单元格:=MyRange

工作表范围级别

  

从工作表中的任何单元格开始,只要没有其他单元格   在工作簿级别确定相同的命名范围:=MyRange

     

从任何工作表中的任何单元格中,或者如果存在相同的名称   范围限定在工作簿级别:='Sheet1!myRange'

最后,如果您有两个相同的范围名称,一个位于工作簿级别,另一个位于工作表级别,如果您不限定工作表,则工作簿范围范围将用作默认值。

答案 1 :(得分:2)

你的代码正在抛出,

  

运行时错误'1004':
  Range类的自动填充方法失败

这是由于每个命令的后半部分都没有定义的父工作表。

With Worksheets(2)
    .Range("LTSDI").AutoFill Destination:=.Range("LTSDI:LTEDI"), Type:=xlFillDefault
End With

With Worksheets(3)
    .Range("LTSDI").AutoFill Destination:=.Range("LTSDI:LTEDI"), Type:=xlFillDefault
End With

上面用With ... End With statement定义了父工作表。每个Range object都以一个句点(又名句号.)作为前缀,该句号明确引用了With ... End With指出的父工作表。

如果您选择了更简单的Range.FillDown method,则可以避免使用With ... End With,因为范围只需要引用一次。

Worksheets(2).Range("LTSDI:LTEDI").FillDown
Worksheets(3).Range("LTSDI:LTEDI").FillDown

最后,下面说明了如果您选择修复原始代码而不是上述代码之一,代码的工作原理。

Worksheets(2).Range("LTSDI").AutoFill Destination:=Worksheets(2).Range("LTSDI:LTEDI"), Type:=xlFillDefault
Worksheets(3).Range("LTSDI").AutoFill Destination:=Worksheets(3).Range("LTSDI:LTEDI"), Type:=xlFillDefault