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

VBA从UserForm复制粘贴数据时出现"Object Required"错误原因排查

解决VBA复制UserForm数据时的"Object Required"错误

错误原因

你触发错误的核心问题是:你在控件的.Value属性上调用了.Copy方法。.Value返回的是控件的文本/数值(是数据值,不是对象),而.Copy是对象(比如控件本身、单元格对象)才有的方法,VBA找不到可执行Copy操作的对象,所以抛出"Object Required"错误。

另外你代码里定义了lCopyLastRow变量但完全没用到,属于冗余代码,可以删掉。

两种解决方法

方法1:直接赋值(推荐,更高效稳定)

跳过剪贴板,直接把控件的值赋值给目标单元格,这是最常用也最可靠的方式,不会依赖剪贴板状态:

Dim wsDest As Worksheet
Dim lDestLastRow As Long

Set wsDest = ThisWorkbook.Worksheets("backend")
lDestLastRow = wsDest.Cells(wsDest.Rows.Count, "I").End(xlUp).Offset(1).Row

' 直接赋值控件值到目标单元格
wsDest.Range("I" & lDestLastRow).Value = SalesForm.BHSDDATEIF.Value
wsDest.Range("H" & lDestLastRow).Value = SalesForm.BHSDREPNUMBERIF.Value
wsDest.Range("S" & lDestLastRow).Value = SalesForm.BHSDMAINNUMBERLF.Value
wsDest.Range("T" & lDestLastRow).Value = SalesForm.BHSDTAPNAMELF.Value
wsDest.Range("U" & lDestLastRow).Value = SalesForm.BHSDCOMPANYNAMELF.Value
wsDest.Range("V" & lDestLastRow).Value = SalesForm.BHSDEMAILLF.Value
wsDest.Range("W" & lDestLastRow).Value = SalesForm.BHSDADDRESSLF.Value
wsDest.Range("X" & lDestLastRow).Value = SalesForm.BHSDCSZLF.Value
wsDest.Range("F" & lDestLastRow).Value = SalesForm.BHSDAMOUNTIF.Value
wsDest.Range("G" & lDestLastRow).Value = SalesForm.BHSDCCAMOUNTIF.Value
wsDest.Range("B" & lDestLastRow).Value = SalesForm.BHSDCARDNUMIF.Value
wsDest.Range("C" & lDestLastRow).Value = SalesForm.BHSDEXPIF.Value
wsDest.Range("D" & lDestLastRow).Value = SalesForm.BHSDCVVIF.Value
wsDest.Range("E" & lDestLastRow).Value = SalesForm.BHSDZIPIF.Value
wsDest.Range("A" & lDestLastRow).Value = SalesForm.BHSRUNDATEIF.Value
wsDest.Range("M" & lDestLastRow).Value = SalesForm.BHSDNOTESIF.Value
End Sub

方法2:保留Copy操作(需去掉.Value)

如果一定要用Copy-Paste逻辑,直接对控件对象调用.Copy,然后用目标单元格的.PasteSpecial方法粘贴:

Dim wsDest As Worksheet
Dim lDestLastRow As Long

Set wsDest = ThisWorkbook.Worksheets("backend")
lDestLastRow = wsDest.Cells(wsDest.Rows.Count, "I").End(xlUp).Offset(1).Row

' 直接复制控件内容,粘贴到目标单元格
SalesForm.BHSDDATEIF.Copy
wsDest.Range("I" & lDestLastRow).PasteSpecial xlPasteValues

SalesForm.BHSDREPNUMBERIF.Copy
wsDest.Range("H" & lDestLastRow).PasteSpecial xlPasteValues

' 其余控件同理,依次替换即可
' ...

' 最后清除剪贴板
Application.CutCopyMode = False
End Sub

注意事项

  • 方法1的直接赋值不会修改剪贴板内容,也不会因为剪贴板被其他程序占用而出错,优先选择。
  • 确保UserForm的控件名称和代码里的完全一致,比如SalesForm确实是你的窗体名称,所有控件名(如BHSDDATEIF)没有拼写错误——如果控件名写错,也会触发类似的对象未找到错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:57:45