Excel VBA宏求助:跨工作表查找PO#并复制数据代码失效问题
问题分析与解决方案
原代码失效的核心原因是依赖Activate、Select这类需要切换活动工作表的操作,当你在「Close P.O. Form」工作表点击按钮时,这些操作会因为活动工作表不是「Data Base」而出错;同时代码没处理找不到目标PO#的情况,也会导致崩溃。
修正后的代码
Sub Close_PO() Dim Fnd As Range Dim Data_Base As Worksheet Dim Close_PO_Form As Worksheet Dim Close_PO_Number As Variant ' 初始化工作表对象 Set Data_Base = Worksheets("Data Base") Set Close_PO_Form = Worksheets("Close P.O. Form") ' 获取要查找的PO编号(直接取单元格值,无需用Range对象传递) Close_PO_Number = Close_PO_Form.Range("B4").Value ' 处理空输入的情况 If Close_PO_Number = "" Then MsgBox "请输入要关闭的PO编号!", vbExclamation Exit Sub End If ' 在Data Base的A列查找PO编号 Set Fnd = Data_Base.Range("A:A").Find( _ What:=Close_PO_Number, _ LookIn:=xlValues, _ LookAt:=xlWhole, _ SearchDirection:=xlNext, _ MatchCase:=False) ' 判断是否找到目标PO If Not Fnd Is Nothing Then ' 直接赋值,替代复制粘贴,更高效稳定 Fnd.Offset(0, 12).Value = Close_PO_Form.Range("D4").Value Debug.Print "找到PO,已更新:" & Fnd.Address Else MsgBox "未找到指定的PO编号:" & Close_PO_Number, vbInformation End If End Sub
关键修改点
- 移除所有
Activate、Select、Selection操作:直接通过Range对象操作单元格,完全不依赖当前活动工作表,避免切换工作表带来的异常。 - 替换复制粘贴为直接赋值:
Fnd.Offset(0,12).Value = ...比复制粘贴更高效,还不会占用剪贴板内容。 - 增加输入校验:防止用户空输入就点击按钮触发无效操作。
- 增加查找结果判断:找不到PO#时弹出提示,避免代码因对象为空报错崩溃。
内容的提问来源于stack exchange,提问作者mark
相关产品推荐
相关产品推荐

