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

