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

VBA宏无输出无报错求助:指定工作表间数据复制问题

排查VBA宏无输出问题

你的宏运行无报错但没输出,大概率是列查找失败、循环范围错误或条件不匹配导致的,按以下步骤排查:

1. 检查表头查找是否成功

代码用Find方法获取列号,如果"Output Table"工作表的表头里,Region/Strategy/Asset Group/Deal Status存在拼写错误、空格、大小写差异或隐藏字符,Find会返回Nothing,直接取.Column会触发错误,但你说没报错,说明表头文本和代码里的关键字完全不匹配,导致后续所有条件判断都不成立。

验证方法:
在宏开头加调试语句,运行后查看立即窗口的变量值:

Debug.Print "regionCol: " & regionCol
Debug.Print "strategyCol: " & strategyCol
Debug.Print "assetCol: " & assetCol
Debug.Print "statusCol: " & statusCol

如果输出是0,说明对应表头没找到,需要修正表头文本或代码里的查找关键字。

2. 修正数据行循环范围

代码里wsData.Cells(Rows.Count, 1).End(xlUp).Row的Rows.Count没指定工作表,默认取活动工作表的行数,若活动表不是"Output Table",会导致循环范围错误(比如循环行数为0,根本没进入循环)。

修正代码:
把循环行范围改成:

For i = 2 To wsData.Cells(wsData.Rows.Count, 1).End(xlUp).Row

3. 优化条件匹配的精准度

数据单元格的文本可能存在以下问题导致条件不成立:

  • 前后有空格(比如"Americas "而非"Americas")
  • 大小写不一致(比如"breit"而非"BREIT")
  • 单元格是公式计算结果而非纯文本

优化方法:
用Trim去除空格,UCase统一转大写,确保匹配精准:

If UCase(Trim(wsData.Cells(i, regionCol).Value)) = "AMERICAS" And _
   UCase(Trim(wsData.Cells(i, strategyCol).Value)) = "BREIT" And _
   UCase(Trim(wsData.Cells(i, assetCol).Value)) = "LOGISTICS" And _
   UCase(Trim(wsData.Cells(i, statusCol).Value)) = "REQUIRES IMMEDIATE ATTENTION" Then

4. 确认目标输出行位置

代码中outputRow2 = 513,但注释写的是"Start from row 17",明显是笔误。如果数据符合第二个条件,会被复制到第513行及以下,你可能没滚动到对应位置,误以为没输出。

临时验证:
把outputRow2改成17,运行后查看第17行是否有数据。

修正后的完整代码

Sub Copy_Deals_To_Report()
    Dim wsData As Worksheet
    Dim wsReport As Worksheet
    Dim lastRow As Long
    Dim regionCol As Long
    Dim strategyCol As Long
    Dim assetCol As Long
    Dim statusCol As Long
    Dim outputRow1 As Long
    Dim outputRow2 As Long
    Dim i As Long ' 声明循环变量i
    
    ' 设定工作表
    Set wsData = ThisWorkbook.Worksheets("Output Table")
    Set wsReport = ThisWorkbook.Worksheets("Output Format - Americas")
    
    ' 查找列号并添加错误处理
    On Error Resume Next
    regionCol = wsData.Range("A1:R1").Find("Region", LookIn:=xlValues, LookAt:=xlWhole).Column
    strategyCol = wsData.Range("A1:R1").Find("Strategy", LookIn:=xlValues, LookAt:=xlWhole).Column
    assetCol = wsData.Range("A1:R1").Find("Asset Group", LookIn:=xlValues, LookAt:=xlWhole).Column
    statusCol = wsData.Range("A1:R1").Find("Deal Status", LookIn:=xlValues, LookAt:=xlWhole).Column
    On Error GoTo 0
    
    ' 检查是否所有列都找到
    If regionCol = 0 Or strategyCol = 0 Or assetCol = 0 Or statusCol = 0 Then
        MsgBox "未找到一个或多个表头列!", vbExclamation
        Exit Sub
    End If
    
    ' 循环数据行并复制匹配内容到报告表
    outputRow1 = 11 ' 第一个条件从报告表第11行开始
    outputRow2 = 17 ' 修正注释与代码不一致的问题,可按需调整
    lastRow = wsData.Cells(wsData.Rows.Count, 1).End(xlUp).Row
    For i = 2 To lastRow ' 假设数据从第2行开始
        ' 第一个条件:统一转大写+去空格
        If UCase(Trim(wsData.Cells(i, regionCol).Value)) = "AMERICAS" And _
           UCase(Trim(wsData.Cells(i, strategyCol).Value)) = "BREIT" And _
           UCase(Trim(wsData.Cells(i, assetCol).Value)) = "LOGISTICS" And _
           UCase(Trim(wsData.Cells(i, statusCol).Value)) = "REQUIRES IMMEDIATE ATTENTION" Then
            wsData.Range("F" & i & ":R" & i).Copy wsReport.Range("A" & outputRow1 & ":M" & outputRow1)
            outputRow1 = outputRow1 + 1
        ' 第二个条件:Strategy为空,同样处理空格
        ElseIf UCase(Trim(wsData.Cells(i, regionCol).Value)) = "AMERICAS" And _
           Trim(wsData.Cells(i, strategyCol).Value) = "" And _
           UCase(Trim(wsData.Cells(i, assetCol).Value)) = "LOGISTICS" And _
           UCase(Trim(wsData.Cells(i, statusCol).Value)) = "ON THE MARKET" Then
            wsData.Range("F" & i & ":R" & i).Copy wsReport.Range("A" & outputRow2 & ":M" & outputRow2)
            outputRow2 = outputRow2 + 1
        End If
    Next i
End Sub

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:43:18