WorksheetFunction.Match多张Excel VBA错误1004

时间:2015-03-05 13:33:21

标签: excel vba excel-vba excel-formula

获取运行时错误“1004”:应用程序定义的错误或对象定义的错误

我在2张不同的纸张中有2个数据集。我正在尝试在每个数据集中运行WorksheetFunction.Match,并将相应的列复制/粘贴到2个新工作表。

ABC数据 - > ABC工作正常,但在Sheets("XYZ data").Select

之后出错
Sub ccc()

    Sheets("ABC data").Select
    sedol = WorksheetFunction.Match("Sedol", Rows("1:1"), 0)
    isin = WorksheetFunction.Match("Isin", Rows("1:1"), 0)

    Sheets("ABC data").Columns(sedol).Copy Destination:=Sheets("ABC").Range("A1")
    Sheets("ABC data").Columns(isin).Copy Destination:=Sheets("ABC").Range("B1")

    Sheets("XYZ data").Select
    sedol1 = WorksheetFunction.Match("SEDOL1", Rows("1:1"), 0)
    ticker = WorksheetFunction.Match("Ticker", Rows("1:1"), 0)

    Sheets("XYZ data").Columns(sedol1).Copy Destination:=Sheets("XYZ").Range("A1")
    Sheets("XYZ data").Columns(ticker).Copy Destination:=Sheets("XYZ").Range("B1")

End Sub

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

远离.Select.Activate,停止依靠动态ActiveSheet来定义范围的父级。

Sub ccc()

    with Sheets("ABC data")
      sedol = WorksheetFunction.Match("Sedol", .Rows("1:1"), 0)
      isin = WorksheetFunction.Match("Isin", .Rows("1:1"), 0)

      .Columns(sedol).Copy Destination:=Sheets("ABC").Range("A1")
      .Columns(isin).Copy Destination:=Sheets("ABC").Range("B1")
    end with

    with Sheets("XYZ data")
      sedol1 = WorksheetFunction.Match("SEDOL1", .Rows("1:1"), 0)
      ticker = WorksheetFunction.Match("Ticker", .Rows("1:1"), 0)

      .Columns(sedol1).Copy Destination:=Sheets("XYZ").Range("A1")
      .Columns(ticker).Copy Destination:=Sheets("XYZ").Range("B1")
    end with

End Sub

请注意.Rows("1:1").Columns(...)中的前缀句点(例如。或句号)确定父级是With ... End With语句中定义的工作表

请参阅How to avoid using Select in Excel VBA macros

答案 1 :(得分:0)

我不使用表格(名称)。选择:

Sheets("ABC Data").Activate

是我首选的方法。我还建议创建对象,以便您更轻松地输入内容:

Dim ABC as WorkSheet
Set ABC = ActiveSheet

类似于:

Dim ABC as Worksheet
Dim XYZ as worksheet

Set ABC = Sheets("ABC data")
With ABC
    sedol = .WorksheetFunction.Match("Sedol", Rows("1:1"), 0)
    isin = .WorksheetFunction.Match("isin", Rows("1:1"), 0)

    .Columns(sedol).Copy Destination:=.Range("A1")
    .Columns(isin).Copy Destination:=.Range("B1")
End With

Set XYZ = Sheets("XYZ data")
With XYZ
    sedol1 = .WorksheetFunction.Match("SEDOL1", Rows("1:1"), 0)
    ticker = .WorksheetFunction.Match("Ticker", Rows("1:1"), 0)

    .Columns(sedol1).Copy Destination:=.Range("A1")
    .Columns(ticker).Copy Destination:=.Range("B1")
End With

最后,如果您对工作簿中的每个工作表执行此操作,则应该循环它。如果您需要该代码,请告诉我

如果选择/使用工作表的方法对您不起作用,请告诉我并立即更新答案。

答案 2 :(得分:0)

发布,以便其他人可以从我的愚蠢举动中学习。注意到我的语法都是在PMR表中输入的 - 将我的所有语法都移到模块中,它就像一个魅力。