VBA使用变量处理工作表及范围时遇方法/数据对象未找到错误求助
VBA跨工作表复制数据报错修复
错误根源
报错行sourceSheet.sourceRange.Select写法完全错误:sourceRange是你已经传入的Range对象,它本身已经和对应的sourceSheet绑定,Worksheet对象根本没有名为sourceRange的属性,所以触发“方法或数据对象未找到”错误。
另外,你的代码大量使用Select和Selection,这是VBA的不良写法,容易因工作表激活状态变化引发意外错误,必须改掉。
修正后的完整代码
Public Function fCopyVerfügbarkeitenData() Dim sourceRange As Range Dim targetRange As Range Dim sourceSheet As Worksheet Dim targetSheet As Worksheet Set sourceSheet = Sheets("Verfügbarkeit_Daten") Set targetSheet = Sheets("Verfügbarkeiten") Set sourceRange = sourceSheet.Range("A4") Set targetRange = targetSheet.Range("A2") sourceSheet.Visible = True Tabelle18.refreshVerfuegbarkeiten ' 不需要Call,直接调用即可 Call fCopyPasteValues(sourceSheet, targetSheet, sourceRange, targetRange) sourceSheet.Visible = False End Function Sub fCopyPasteValues(sourceSheet As Worksheet, targetSheet As Worksheet, sourceRange As Range, targetRange As Range) Dim fullSourceRange As Range ' 从sourceRange出发,获取到数据区域的右下角单元格 Set fullSourceRange = sourceSheet.Range( _ sourceRange, _ sourceRange.End(xlDown).End(xlToRight) _ ) ' 直接复制粘贴值和数字格式,无需Select fullSourceRange.Copy targetRange.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, _ Operation:=xlNone, SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False ' 给目标区域设置日期格式,覆盖整个复制过来的数据区域 targetSheet.Range(targetRange, targetRange.Offset(fullSourceRange.Rows.Count - 1, fullSourceRange.Columns.Count - 1)).NumberFormat = "m/d/yyyy" End Sub
关键优化说明
- 移除所有
Select/Selection/Activate操作:直接通过对象引用操作单元格,避免因工作表激活状态变化导致的错误,同时提升代码运行效率 - 修正日期格式设置范围:原代码只给
targetRange单个单元格设置格式,现在覆盖整个复制的数据区域 - 调整变量声明顺序:先绑定工作表,再获取对应工作表的Range,逻辑更清晰
- 去掉冗余的
Call关键字:VBA中调用子程序直接写名称即可
内容的提问来源于stack exchange,提问作者Lupus
相关产品推荐
相关产品推荐

