用单元构build范围
转载问题:
为什么必须激活一个表来build立一个cells
的range
?
我有一个快速和(希望)简单的问题。
同
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))