Vba Excel代码中的应用程序定义或对象定义错误

Vba Excel代码中的应用程序定义或对象定义错误,vba,excel,Vba,Excel,下面的我的代码用于打开一个订单报告文件和一个关键字列表文件,然后使用自动筛选功能,通过一个关键字列表筛选订单报告文件中所需的数据,然后复制到另一个工作表 我的问题是,当此代码运行时: OrderCount=wsOrder.Range(“A2”,wsOrder.Range(“A”&Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible).Cells.Count …应用程序定义的错误或对象定义的错误发生,但仅在某些订单报告文件上发生。我有2个完全不

下面的我的代码用于打开一个订单报告文件和一个关键字列表文件,然后使用自动筛选功能,通过一个关键字列表筛选订单报告文件中所需的数据,然后复制到另一个工作表

我的问题是,当此代码运行时:

OrderCount=wsOrder.Range(“A2”,wsOrder.Range(“A”&Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible).Cells.Count

…应用程序定义的错误或对象定义的错误发生,但仅在某些订单报告文件上发生。我有2个完全不同的布局标准,只有工作簿数据不同,但一个文件可以运行,而另一个不能

它在一个工作簿(如下)上运行良好,但在另一个工作簿上运行也不正常。

这一定是因为您的“条件”文件是2003年以后的excel工作簿,而您的非工作“订单”文件是2003年以前的excel工作簿

因此,您的“条件”工作簿工作表各有约100万行,而“订单”工作簿工作表各有约65k行

在:

不合格的
行数.Count
隐式地假定活动工作表是要计算行数的工作表

上次打开的工作簿是“条件”一,因此
wsOrder.Range(“A”&Rows.Count)
正在尝试访问“订单”工作簿第100万行,而它最多有65 k

解决方案可以简单地交换工作簿的打开顺序:

ConditionFile = Application.GetOpenFilename() 'Open Condition wb first
Set wbCondition = Workbooks.Open(ConditionFile)
Set wsResult = wbCondition.Worksheets(1)
Set wsCondition = wbCondition.Worksheets(2)

OrderFile = Application.GetOpenFilename() 'Open Order wb as the last one
Set wbOrder = Workbooks.Open(OrderFile)
Set wsOrder = wbOrder.Worksheets(1)
因此,将“订单”工作簿作为活动工作簿

但最佳做法是避免依赖
活动
/
选择
编码模式,而是使用完全限定的范围参考:

OrderCount = wsOrder.Range("A2", wsOrder.Range("A" & wsOrder.Rows.Count) _
                    .End(xlUp)).SpecialCells(xlCellTypeVisible).Cells.Count

因此,我建议您使用后一种修复方法

对您包含的两个空白屏幕截图是否有意义?您好,谢谢您的编辑建议。被屏蔽的屏幕截图是一些我无法向公众展示的数据。我想我的错误只发生在A专栏。非常感谢你的帮助。我试图同意你的建议,但还是一样。关键是,有些报告与我的代码配合得很好,而其他报告则不然。有趣的是,偶数报告日有效,奇数报告日无效。关于避免激活/选择。由于我是excel VBA的新手,你有什么建议给我吗?这里有太多相关的建议,我会跳过其中的大部分。但其中有两个很突出:1)不要使用
Active
/
Activate
/
选择
/
模式2)始终在所有模块的最顶端使用
选项Explicit
ConditionFile = Application.GetOpenFilename() 'Open Condition wb first
Set wbCondition = Workbooks.Open(ConditionFile)
Set wsResult = wbCondition.Worksheets(1)
Set wsCondition = wbCondition.Worksheets(2)

OrderFile = Application.GetOpenFilename() 'Open Order wb as the last one
Set wbOrder = Workbooks.Open(OrderFile)
Set wsOrder = wbOrder.Worksheets(1)
OrderCount = wsOrder.Range("A2", wsOrder.Range("A" & wsOrder.Rows.Count) _
                    .End(xlUp)).SpecialCells(xlCellTypeVisible).Cells.Count