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

嵌入UserForm的Spreadsheet获取最后行列遇Run-time error '91',求语法验证

解决UserForm中Spreadsheet控件获取最后一行时的Run-time Error '91'问题

嘿,我来帮你搞定这个问题!首先,你用到的Find语法本身逻辑是对的,但触发Run-time Error '91'(对象变量或With块变量未设置),大概率是两个原因导致的:要么Find方法没找到任何内容返回了Nothing,直接访问.Row就会报错;要么是对Spreadsheet控件的工作表引用存在细微的兼容性问题。

下面是具体的排查和解决步骤:

1. 先处理Find返回Nothing的情况

如果你的Sheet1是空的,或者所有单元格都是空值,Find方法会返回Nothing,这时候直接取.Row就会触发91错误。所以必须先判断是否找到有效对象:

Dim lastCell As Range
Dim ws As Object ' 用Object兼容Spreadsheet控件的工作表类型

' 先明确引用工作表对象
Set ws = Hold_Summary_UserForm.Spreadsheet1.Sheets("Sheet1")

' 执行查找并判断结果
Set lastCell = ws.Cells.Find( _
    What:="*", _
    SearchOrder:=xlByRows, _
    LookIn:=xlValues, _
    SearchDirection:=xlPrevious _
)

If Not lastCell Is Nothing Then
    LastRow = lastCell.Row
Else
    LastRow = 1 ' 表格为空时默认第一行,可根据需求调整
End If

2. 验证Spreadsheet控件的工作表名称

有时候UserForm里的Spreadsheet控件默认工作表名称可能不是Sheet1,你可以打开UserForm设计模式,选中Spreadsheet控件,查看其属性面板里的工作表名称,确保和代码中的引用完全一致。

3. 替代方法:不用Find获取最后一行

如果还是有问题,可以试试两种更稳妥的替代方案:

方案A:使用UsedRange

Dim ws As Object
Set ws = Hold_Summary_UserForm.Spreadsheet1.Sheets("Sheet1")

If ws.UsedRange.Rows.Count > 0 Then
    LastRow = ws.UsedRange.Rows(ws.UsedRange.Rows.Count).Row
Else
    LastRow = 1
End If

注意:UsedRange可能包含曾经编辑过后来清空的单元格,如果你需要严格的“有内容的最后一行”,这个方法可能不太精准,但胜在简单直接。

方案B:使用SpecialCells

Dim ws As Object
Set ws = Hold_Summary_UserForm.Spreadsheet1.Sheets("Sheet1")
Dim lastRow As Long

On Error Resume Next ' 捕获空表时的错误
lastRow = ws.Cells.SpecialCells(xlCellTypeLastCell).Row
On Error GoTo 0

If lastRow = 0 Then
    lastRow = 1
End If

总结

你的原始语法逻辑是正确的,但缺少了对Find返回值为空的判断,同时要注意UserForm中Spreadsheet控件的工作表对象和普通Worksheet对象的兼容性,用Object类型引用会更稳妥。按照上面的方法调整后,应该就能解决91错误了。

内容的提问来源于stack exchange,提问作者M. Marzouk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:13:25