从当前工作簿向其他工作簿执行VBA过程时遇438错误求助
VBA 438错误解决:调用带参数子过程的语法问题
你的代码核心问题是调用子过程时的语法错误,和工作表同名、缺少引用无关。
当你用theTestSub (targetWorkbook)这种带括号的方式调用子过程时,VBA会对括号内的对象执行「默认属性求值」——Workbook对象的默认属性是Name(字符串类型),所以实际传递给theTestSub的是一个字符串,而非Workbook对象。但你的子过程声明要求接收ByRef targetWorkbook As Workbook(Workbook类型对象),类型不匹配直接触发438错误。
修复方案
两种写法都能解决问题:
- 直接去掉调用时的括号
Sub OpenFileAndWorkOnIt() Dim targetWorkbook As Workbook Set targetWorkbook = Workbooks.Open("C:\Users\somePathThatWorks\...\.xlsm") theTestSub targetWorkbook ' 直接传递对象,无需括号 End Sub
- 使用
Call关键字,此时保留括号
Sub OpenFileAndWorkOnIt() Dim targetWorkbook As Workbook Set targetWorkbook = Workbooks.Open("C:\Users\somePathThatWorks\...\.xlsm") Call theTestSub(targetWorkbook) ' 搭配Call关键字,括号生效 End Sub
关于你怀疑的两个点
- 工作表同名:只要代码中通过
targetWorkbook明确引用目标工作簿的工作表(比如targetWorkbook.Worksheets("Sheet1")),就不会产生混淆,和当前错误无关。 - 缺少引用:Workbook是VBA内置对象,无需额外引用库,438错误并非因缺少引用导致。
内容的提问来源于stack exchange,提问作者Reiler74
相关产品推荐
相关产品推荐

