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
相关产品推荐
相关产品推荐

