首页 > 解决方案 > 从另一个工作簿错误将代码应用到活动工作簿:不支持这样的接口

问题描述

我希望下面的代码打开一个关闭的工作簿并将 StartRow 和 EndRow 范围内的值复制到活动工作簿。

我明白了

错误 1004 “不支持此类接口”。

在线的 "xlBook.Sheets(ShName).Range(Cells(StartRow, 1), Cells(EndRow, 1)).Select"

当我直接在要从中复制数据的工作簿中运行此代码时,它可以工作。

Sub GetDataFromClosedBook()

'copy data from closed workbook to active workbook

Dim xlApp As Application
Dim xlBook As Workbook
Dim sh As Object

Set xlApp = CreateObject("Excel.Application")

'Path source Wokrbook
Set xlBook = xlApp.Workbooks.Open("C:\Users\name\Desktop\EXCEL USEFUL DOSC\Missing Data Check New Process\Missing Data Reports\" & Sheets("Data Check").Range("C3").Value & ".xlsx")

xlApp.Visible = True

ShName = Sheets("Data Check").Range("C3").Value

With xlBook.Sheets(ShName)

    StartRow = .Range("E:E").Find(what:="January-2020", after:=.Range("E1")).Row
    EndRow = .Range("E:E").Find(what:="January-2020", after:=.Range("E1"), searchdirection:=xlPrevious).Row

    'ThisWorkbook.Activate
    xlBook.Sheets(ShName).Range("A2").Value = ShName

    xlBook.Sheets(ShName).Range(Cells(StartRow, 1), Cells(EndRow, 1)).Select

    'Sheets(ShName).Range(Cells(StartRow, 1), Cells(EndRow, 1)).Select
End With

xlApp.DisplayAlerts = False
xlBook.Close
xlApp.Quit

Set xlBook = Nothing
Set xlApp = Nothing
Set xlBook = ActiveWorkbook

Set sh = Sheets("Dealer_ID Check")

sh.Activate
Range("A1").Select
sh.Paste

End Sub

标签: excelvba

解决方案


评论多次指出您的代码中的分离。您的代码使用对工作表的隐式和显式引用,而不执行任何必要的检查来防止错误。

我们礼貌的评论者并没有使用强词,但我不礼貌:ActiveSheet不是你想的那样。

您认为ActiveSheet在设计期间发生的事情实际上永远不能保证ActiveSheet在运行时发生。当然有时它们是这样的,但这种确定性很少见,除非你努力将代码变成现实。在所有其他时间,您应该明确引用您的范围。把它当成一种拯救生命的技能

假设您设置了一个指向工作簿的指针并打开它,它打开的任何工作表都会变成ActiveSheet. 通常,这是保存工作簿时上次查看的工作表,但这绝不是保证。

更不能保证的是,您假设它将打开“数据检查”表。

您可以整天读取和写入“数据检查”表,而无需关心它是否是ActiveSheet,但当它是时,您只能Select在其上添加一个单元格ActiveSheet

工作表变量ShName设置为“数据检查”工作表。您在任何时候都没有验证ShNameActiveSheet, 但ShName必须是ActiveSheet以防止此行出现错误:

xlBook.Sheets(ShName).Range(Cells(StartRow, 1), Cells(EndRow, 1)).Select

推荐阅读