用单元构build范围

转载问题:

为什么必须激活一个表来build立一个cellsrange


我有一个快速和(希望)简单的问题。

 Dim XRange As Range 

为什么:

 Set XRange = ActiveWorkbook.Sheets("Pivot").Range("K20:L26") 

工作和:

 Set XRange = ActiveWorkbook.Sheets("Pivot").Range(Cells(21, 11), Cells(22, 26)) 

不?

它会抛出1004运行时错误。 由于我的Excel是德语,它说:

Laufzeitfehler'1004':

Anwendungs-oder objektdefinierter Fehler


由于有关活动表的一些提示:

我正在重构一些代码。 我使用xRange作为图表的数据。 我曾经设置活动表单,抓住数据,并将其他表单激活。 但是,这是讨厌的。 我想简化代码,如下所示:

 With myChart .SeriesCollection.NewSeries ActiveWorkbook.Sheets("Pivot").Activate .SeriesCollection(1).Values = Range("H6:H18") .SeriesCollection(1).XValues = Range("K6:L18") ActiveWorkbook.Sheets("Ausgabe").Activate .SeriesCollection(1).Name = "28 days" End With 

进入类似的东西

 With myChart For i = 0 To 6 .SeriesCollection.NewSeries .SeriesCollection(i + 1).Values = ActiveWorkbook.Sheets("History").Range(Cells(i + 52, StartColumn).Address, Cells(i + 52, EndColumn).Address) .SeriesCollection(i + 1).XValues = XRange .SeriesCollection(i + 1).Name = ActiveWorkbook.Sheets("History").Range(Cells(i + 52, 1).Address) Next i End With 

[请忽略实际提到的单元格,这些是不同的图表,而我在重构中]

你得到这个错误的原因是因为你使用activesheet中的单元格和指定表单中的Range。 您的范围参考被认为是“合格”,因为您指定了其父。 您的单元格引用是“不合格的”,这意味着您允许解释器提供父级。 你编码:

 Set XRange = ActiveWorkbook.Sheets("Pivot").Range(ActiveSheet.Cells(21, 11), ActiveSheet.Cells(22, 26)) 

所以当Pivot没有激活的时候,你使用另外一个表单元来build立一个Pivot上的Range。

当你使用一个非限定的引用时,解释器会根据你的代码的位置select父代。 如果您处于标准模块中,则不合格的“单元格”和“范围”将引用ActiveSheet。 如果您在工作表的类模块中,则任何不合格的范围参考将默认为该工作表,无论其是否处于活动状态。 实际上,任何引用谁的父母是工作表将默认为ActiveSheet或特定工作表,而不仅仅是范围。

当您使用表格(“Pivot”)对单元格进行限定时,您正在创build一个不合格的表单引用。 除非代码位于ThisWorkbook模块中,否则非限定工作表参考默认为ActiveWorkbook。

最佳做法是根据需要充分确定您的参考资料。 我当然不会回到每个引用的Application对象,但是我不会离开Workbook,更不用说Worksheet了。

一个修复就是使用With子句

 With ActiveWorkbook.Sheets("Pivot") Set XRange = .Range(.Cells(), .Cells()) End With 

每个工作表都有一个CodeName属性。 如果您通过其CodeName引用表单,则可以消除有人更改标签名称的风险。 您在属性框(F4)中设置CodeName。 我用'wsh'作为我的表单CodeNames的前缀。

 With wshPivot Set XRange = .Range(.Cells(), .Cells()).Value End With 

我很less使用范围和单元格在一起。 另一种select,也许我会这样做(但我不是普遍的“正确”的方式)是偏移和调整

 Set XRange = wshPivot.Cells(21, 11).Resize(2,15) 

从你想要的单元格开始(或者这是一个好的锚点),并偏移到你想要的范围开始,然后resize,使其正确的大小。

pipe理复制1004错误。

它在纸张不活动时发生。 所以使用时

 ActiveWorkbook.Sheets("Pivot")range(cells(....)) 

工作表“Pivot”必须处于活动状态。 只有在出于某种原因混合范围和单元时才会发生

所以你可以使用

 Activeworkbook.sheets("Pivot").activate Set XRange = Range(Cells(21, 11), Cells(22, 26)) 

编辑,修复表单不活跃的问题

我一直在这看到为什么它不适用于非活动工作表。

您需要设置单元格的时间来使用它,而不活跃。

所以Set XRange = ActiveWorkbook.Sheets("Pivot").Range(Cells(21, 11), Cells(22, 26))

将变为Set XRange = ActiveWorkbook.Sheets("Pivot").Range(sheets("Pivot").Cells(21, 11), sheets("Pivot").Cells(22, 26))