用细胞构建范围

时间:2015-04-27 13:55:18

标签: excel vba

重新提问:

为什么必须激活工作表才能使用cells构建Dim XRange As Range

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

使用

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

为什么:

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

工作和:

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

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

  

Laufzeitfehler'1004':

     

Anwendungs-oder objektdefinierter Fehler

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

我正在重构一些代码。我使用xRange作为图表的数据。我曾经将工作表设置为活动状态,抓取数据并将其他工作表设置为活动状态。但这很烦人。我希望简化代码,例如:

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

这样的东西
public LoginDataBaseAdapter logindatabase_adapter_child;

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

2 个答案:

答案 0 :(得分:2)

管理以复制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))

答案 1 :(得分:1)

您收到错误的原因是因为您正在使用活动表格中的单元格和指定工作表中的范围。您的范围引用被视为“合格”,因为您指定了其父级。您的单元格引用是“不合格的”,这意味着您允许解释程序提供父级。你编码:

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

因此,当Pivot未处于活动状态时,您正在使用来自不同工作表的单元格构建一个Range on Pivot。

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

使用表格(“Pivot”)限定单元格时,您将创建一个不合格的工作表引用。除非代码在ThisWorkbook模块中,否则不合格的工作表引用默认为ActiveWorkbook。

最佳做法是根据需要完全限定您的参考资料。我当然不会回到每个引用的Application对象,但我不会忘记工作簿,更不用说工作表了。

一个解决方法是使用With子句

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

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

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

我很少一起使用Range和Cells。你的另一个选择,也许就是我这样做的方式(但我绝对不是'正确的'方式)是Offset和Resize

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

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