使用单元格构建范围



重述问题:

为什么必须激活图纸才能使用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’:

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

[请忽略实际引用的单元格,这些是不同的图表,而我正在进行重构]

成功复制了1004错误。

当工作表处于非活动状态时会发生这种情况。所以当使用时

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

工作表"Pivot"必须处于活动状态。仅当由于某种原因混合范围和单元格时才发生

所以你可以使用

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

EDIT,修复了纸张未激活的问题

我一直在研究为什么它不适用于非活动的工作表。

您需要随时设置单元格工作表,以便在不活动时使用它。

所以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))

出现错误的原因是使用了活动工作表中的Cells和指定工作表的Range。您的Range引用被视为"合格",因为您指定了它的父级。您的单元格引用是"不合格的",这意味着您允许解释器提供父级。您编码:

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

因此,当"枢轴"未处于活动状态时,您将使用不同工作表中的单元格在"枢轴"上构建一个范围。

当你使用非限定引用时,解释器会根据你的代码所在的位置来选择父级。如果你在标准模块中,非限定的单元格和范围会引用ActiveSheet。如果您在工作表的类模块中,那么任何不合格的范围引用都将默认为该工作表,无论它是否处于活动状态。事实上,任何引用的父对象是工作表,都将默认为ActiveSheet或特定的工作表,而不仅仅是范围。

当您使用图纸("数据透视")限定单元格时,您正在创建一个不合格的图纸引用。除非代码在ThisWorkbook模块中,否则不合格的工作表引用默认的ActiveWorkbook。

最佳实践是根据需要对您的推荐人进行充分的资格鉴定。我当然不会每次引用都回到Application对象,但我从来没有把工作簿,更不用说工作表,留给偶然的机会。

一个修复方法是使用With子句

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

每个工作表都有一个CodeName属性。如果按工作表的CodeName引用工作表,则可以消除有人更改选项卡名称的风险。您可以在"属性"框(F4)中设置CodeName。我在工作表CodeNames前面加上"wsh"。

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

我很少同时使用Range和Cells。你的另一个选择,可能也是我会做的方式(但我的否定意味着普遍的"正确"方式)是偏移和调整

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

从您想要的单元格(或者这是一个很好的锚点)开始,偏移到您想要的范围开始的位置,然后调整大小以使其大小合适。

最新更新