在不同的工作表上设置范围而无需选择该工作表

时间:2015-05-22 03:18:57

标签: excel vba excel-vba

我只是试图设置一个Range对象,将分散在一张纸上不同列上的数据(" Backtest")收集到一个紧凑的数据集中(每列一个接一个)第二张(" chartData"),以便在以后的阶段轻松显示图表。

我的理解是使用With... End With应该允许指定Set语句在哪个工作表中检索范围。然而,如果事先未选择该表(如第三行所示),我会遇到

  

错误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

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

2 个答案:

答案 0 :(得分:2)

此:

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

简单等同于:

Cells

现在,Set myRangeTimestamp = wsBacktest.Range(wsBacktest.Cells(17, 1), wsBacktest.Cells(lastRow, 1)) Set myRangeData = wsBacktest.Range(wsBacktest.Cells(17, [colMtM]), wsBacktest.Cells(lastRow, [colPnL])) 隐含地指的是活动工作表as @Doug mentioned,因此您还应明确限定它们:

With

wsBacktest块只会减少Cells的重复次数;有或没有它,不合格的Select是对活动工作表的隐式引用,您应该至少避免与wsBacktest 一样多。

因此,错误正在发生,因为您打算在{ "query": { "bool": { "must": [ { "match_phrase": { "default_field": "keywords.alias", "query": "abc" } } ], "must_not": [], "should": [] } }, "from": 0, "size": 10, "sort": [], "facets": {} } 工作表上获得范围,但除非您首先激活该工作表,否则您将使用其他工作表中的单元格来获取该工作表。吊杆。

答案 1 :(得分:0)

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

enter image description here