excel - 从另一个工作簿错误将代码应用到活动工作簿:不支持这样的接口
问题描述
我希望下面的代码打开一个关闭的工作簿并将 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
解决方案
评论多次指出您的代码中的分离。您的代码使用对工作表的隐式和显式引用,而不执行任何必要的检查来防止错误。
我们礼貌的评论者并没有使用强词,但我不礼貌:ActiveSheet
不是你想的那样。
您认为ActiveSheet
在设计期间发生的事情实际上永远不能保证ActiveSheet
在运行时发生。当然有时它们是这样的,但这种确定性很少见,除非你努力将代码变成现实。在所有其他时间,您应该明确引用您的范围。把它当成一种拯救生命的技能
假设您设置了一个指向工作簿的指针并打开它,它打开的任何工作表都会变成ActiveSheet
. 通常,这是保存工作簿时上次查看的工作表,但这绝不是保证。
更不能保证的是,您假设它将打开“数据检查”表。
您可以整天读取和写入“数据检查”表,而无需关心它是否是ActiveSheet
,但当它是时,您只能Select
在其上添加一个单元格ActiveSheet
。
工作表变量ShName
设置为“数据检查”工作表。您在任何时候都没有验证ShName
为ActiveSheet
, 但ShName
必须是ActiveSheet
以防止此行出现错误:
xlBook.Sheets(ShName).Range(Cells(StartRow, 1), Cells(EndRow, 1)).Select
推荐阅读
- java - 配置 logback-spring.xml 以拥有一些常见的记录器和一些特定于环境的记录器
- image-processing - 从给定的调色板中找到匹配的颜色
- amazon-web-services - 在 AWS Spot 实例上运行一批作业
- angular - 如何在 three.js 中使用 ArrowHelper 绘制圆柱体
- android - Flutter 程序不显示图像
- amazon-web-services - 当我尝试附加我创建的规则组时,wafv2 webacl cloudformation 出现错误
- flutter - Flutter - NoSuchMethodError:在 null 上调用了 getter 'isNotEmpty'
- docker - 错误:不可满足的约束:在 alpine docker 文件中更新包时
- azure - PowerShell 版本及其管理 Azure Active Directory 的能力有什么区别?
- oauth - 谷歌登录响应没有 idToken ionic4