在不同的工作表上设置一个范围,而不必select该工作表

我只是试图设置一个Range对象来将在一张纸(“Backtest”)上分散在不同列上的数据(第二张纸(“chartData”))收集成一个紧凑的数据集(每个列紧挨着另一个)以便在稍后的阶段容易地显示在图表上。

我的理解是使用With... End With应该允许指定Set语句要检索的范围。 然而,如果事先没有select那张纸(如第三行所示),我会遇到一个

错误1004“应用程序定义或对象定义的错误”

 Sub prepareData() Set wsChartData = Worksheets.Add wsChartData.Name = "chartData" wsBacktest.Select With wsBacktest Set myRangeTimestamp = .Range(Cells(17, 1), Cells(lastRow, 1)) Set myRangeData = .Range(Cells(17, [colMtM]), Cells(lastRow, [colPnL])) End With wsChartData.Range("A1").Value = "Timestamp" wsChartData.Range("B1").Value = "MtM" wsChartData.Range("C1").Value = "PnL" myRangeTimestamp.Copy Destination:=wsChartData.Range("A2") myRangeData.Copy Destination:=wsChartData.Range("B2") wsChartData.Range("A2").EntireColumn.AutoFit End Sub 

这不是一个阻碍点,但是,你知道…美学…

这个:

 With wsBacktest Set myRangeTimestamp = .Range(Cells(17, 1), Cells(lastRow, 1)) Set myRangeData = .Range(Cells(17, [colMtM]), Cells(lastRow, [colPnL])) End With 

简单地等同于:

 Set myRangeTimestamp = wsBacktest.Range(Cells(17, 1), Cells(lastRow, 1)) Set myRangeData = wsBacktest.Range(Cells(17, [colMtM]), Cells(lastRow, [colPnL])) 

现在, Cells隐式指向活动工作表 , 正如@Doug所提到的那样 ,所以您应该明确地限定它们:

 Set myRangeTimestamp = wsBacktest.Range(wsBacktest.Cells(17, 1), wsBacktest.Cells(lastRow, 1)) Set myRangeData = wsBacktest.Range(wsBacktest.Cells(17, [colMtM]), wsBacktest.Cells(lastRow, [colPnL])) 

With块只会减lesswsBacktest的重复次数; 有或没有它,一个不合格的Cells是一个隐式引用的活动工作表, 你应该避免至less像Select一样多

所以错误的发生是因为你打算在wsBacktest表上得到一个范围,但是除非你先激活那个工作表,否则你正在使用另外一个工作表的单元格来获得这个工作表。 繁荣。

wsBacktest既没有声明,没有定义也没有设置。 Excel不知道你在说什么。 宣布它,它会工作。 看到这个例子。

 Sub test() Dim ws As Worksheet Dim rng1 As Range, rng2 As Range Set ws = ThisWorkbook.Worksheets("Sheet1") With ws Set rng1 = .Range("A1") Set rng2 = .Range("B1") End With MsgBox rng1 & " " & rng2 End Sub 

在这里输入图像说明