在不同的工作表上设置一个范围,而不必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