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

