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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:32:46