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

