You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA执行Workbooks.Open时遇错误91,请求排查问题原因

搞定VBA错误91:请求表单数据传输问题解析

嘿,我来帮你揪出这个Error 91的根源,顺便把代码里的其他小问题也一起修正了~

Error 91的本质是对象变量未正确初始化,咱们一步步拆解你的代码问题:

1. Workbook对象赋值漏了Set关键字

VBA里给对象类型(比如Workbook、Worksheet这类)赋值时,必须用Set关键字绑定对象。你现在直接写book2 = Workbooks.Open(...),相当于没给对象变量真正绑定打开的工作簿,这直接触发了错误91。
修正后的代码行应该是:

Set book2 = Workbooks.Open("Z:\Requests\Request Form.xlsm")

2. 单元格区域引用写反了

你代码里有个明显的小失误:Range("J12:K9"),这个区域的行号是倒的(12比9大),虽然VBA会自动把它转成J9:K12,但这大概率不是你想要的目标区域吧?比如如果你是想取J12到K12的内容,得改成Range("J12:K12"),不然会把多余的单元格数据传过去。

3. 多单元格区域赋值的小坑

当你把J9:K9这种多单元格区域的值直接赋值给单个单元格(比如A&emptyrow)时,VBA只会把区域左上角的单元格值传过去。如果想把整个横向区域的内容对应粘贴到Logs工作表的同一行,得用Resize来匹配区域大小:

book2.Sheets("Logs").Range("A" & emptyrow).Resize(1, 2).Value = ThisWorkbook.Sheets("Request Form").Range("J9:K9").Value

修正后的完整代码

我把所有问题都调整好了,还加了变量声明和保存关闭的建议:

Option Explicit ' 强制声明变量,避免隐性错误
Sub TransferRequestData()
    Dim book2 As Workbook
    Dim emptyrow As Long ' 显式声明变量类型,更规范
    
    ' 正确绑定工作簿对象
    Set book2 = Workbooks.Open("Z:\Requests\Request Form.xlsm")
    
    ' 找到Logs工作表的最后一行空行
    emptyrow = book2.Sheets("Logs").Range("A1000").End(xlUp).Row + 1
    
    ' 传输J9:K9到Logs的A列开始的两个单元格
    book2.Sheets("Logs").Range("A" & emptyrow).Resize(1, 2).Value = ThisWorkbook.Sheets("Request Form").Range("J9:K9").Value
    ' 修正区域引用为J12:K12(假设你要的是这一行)
    book2.Sheets("Logs").Range("B" & emptyrow).Resize(1, 2).Value = ThisWorkbook.Sheets("Request Form").Range("J12:K12").Value
    ' 传输C12的值到Logs的C列
    book2.Sheets("Logs").Range("C" & emptyrow).Value = ThisWorkbook.Sheets("Request Form").Range("C12").Value
    
    ' 按需保存并关闭目标工作簿
    book2.Save
    book2.Close
End Sub

另外,记得在模块顶部加上Option Explicit,它会帮你检查所有未声明的变量,减少很多隐性bug哦~

内容的提问来源于stack exchange,提问作者Jerley Garcia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 10:37:29