基于多条件If Then语句的Excel跨工作表数值迁移VBA实现需求
满足条件时复制Master工作表数据到Bun_Dept的VBA实现
原代码存在的问题
- 变量声明不规范:
Dim Data, Bun, Bun_Dept, Master As Worksheet中仅Master被声明为Worksheet类型,其余变量默认是Variant类型,需逐个明确类型 - 循环逻辑错误:原代码先遍历完所有
i再执行条件判断,此时i的值已经超出循环范围,无法正确获取目标行数据;j的循环为空操作,没有起到定位写入行的作用 - 消息框使用错误:
MsgBox ("Data.Cells(i, 1).Value")会直接输出字符串而非单元格实际值,且位置错误 - 未处理写入行的递增:每次写入数据后需要将
j加1,避免覆盖之前的内容
修复后的完整代码
Sub CopyFilteredValues() Dim wb As Workbook Dim Data As Worksheet, Bun As Worksheet Dim lastrow As Long, j As Long Dim i As Integer ' 初始化工作表对象 Set Data = ThisWorkbook.Worksheets("Master") Set Bun = ThisWorkbook.Worksheets("Bun_Dept") ' 获取Bun_Dept工作表中B列最后一行,作为写入起始行(从第4行开始,若已有数据则接在后面) j = Bun.Cells(Rows.Count, "B").End(xlUp).Row ' 如果起始行小于4,则从第4行开始写入 If j < 4 Then j = 4 ' 遍历Master工作表第5行到最后一行的数据 lastrow = Data.Cells(Rows.Count, "A").End(xlUp).Row For i = 5 To lastrow ' 判断当前行是否满足条件 If Data.Cells(i, 7).Value = "Location" And _ Data.Cells(i, 18).Value = "BUN" And _ Data.Cells(i, 73).Value <> "" Then ' 复制指定单元格数据到Bun_Dept对应位置 Bun.Cells(j, 2).Value = Data.Cells(i, 1).Value Bun.Cells(j, 3).Value = Data.Cells(i, 2).Value Bun.Cells(j, 4).Value = Data.Cells(i, 4).Value Bun.Cells(j, 5).Value = Data.Cells(i, 5).Value Bun.Cells(j, 6).Value = Data.Cells(i, 58).Value Bun.Cells(j, 7).Value = Data.Cells(i, 59).Value Bun.Cells(j, 8).Value = Data.Cells(i, 26).Value Bun.Cells(j, 9).Value = Data.Cells(i, 25).Value Bun.Cells(j, 12).Value = Data.Cells(i, 73).Value Bun.Cells(j, 13).Value = Data.Cells(i, 74).Value ' 弹出当前复制的行ID(可选,可删除) MsgBox "已复制行ID:" & Data.Cells(i, 1).Value ' 写入行号递增,准备下一次写入 j = j + 1 End If Next i MsgBox "数据复制完成!" End Sub
关键修改说明
- 规范变量声明:明确
Data和Bun为Worksheet类型,避免Variant类型带来的潜在问题 - 调整循环逻辑:将条件判断放入
i的循环内,确保每一行都被检查;初始化j为Bun_Dept的最后一行,每次写入后递增 - 修正消息框:输出实际单元格值而非字符串,添加完成提示
- 增加边界处理:当Bun_Dept的B列没有数据时,从第4行开始写入,符合原代码的起始行要求
内容的提问来源于stack exchange,提问作者GSpencer
相关产品推荐
相关产品推荐

