如何使用VBA将指定区域的特定单元格复制到新工作表区域
VBA宏修正方案
Option Explicit ' BOM Generation Sub BuildBOM() Dim c As Range Dim j As Long ' 用Long避免行数超过Integer上限报错 Dim SourceSht As Worksheet Dim TargetSht As Worksheet ' 定义源表和目标表 Set SourceSht = ThisWorkbook.Sheets("Estimate") Set TargetSht = ThisWorkbook.Sheets("BOM") ' 写入起始行 j = 9 ' 先清空BOM表原有数据 TargetSht.Rows(j & ":" & TargetSht.Rows.Count).ClearContents ' 第一个循环:处理Materials表(A列非空行) For Each c In SourceSht.Range("A9:A100") If Trim(c.Value) <> "" Then ' 加Trim过滤空格导致的误判 ' 对应复制A→A、C→B、G→C TargetSht.Cells(j, "A").Value = SourceSht.Cells(c.Row, "A").Value TargetSht.Cells(j, "B").Value = SourceSht.Cells(c.Row, "C").Value TargetSht.Cells(j, "C").Value = SourceSht.Cells(c.Row, "G").Value j = j + 1 End If Next c ' 第二个循环:处理Labour表(I列非空行),接续上一个循环的最后一行写入 For Each c In SourceSht.Range("I9:I100") If Trim(c.Value) <> "" Then ' 对应复制I→A、K→B、M→C TargetSht.Cells(j, "A").Value = SourceSht.Cells(c.Row, "I").Value TargetSht.Cells(j, "B").Value = SourceSht.Cells(c.Row, "K").Value TargetSht.Cells(j, "C").Value = SourceSht.Cells(c.Row, "M").Value j = j + 1 End If Next c ' 可选:如果需要保留原表单元格格式,可将上述赋值逻辑替换为Copy Paste逻辑,示例如下: ' SourceSht.Cells(c.Row, "A").Copy ' TargetSht.Cells(j, "A").PasteSpecial Paste:=xlPasteAll ' Application.CutCopyMode = False End Sub
核心修改点
- 去掉了原逻辑中错误的整列复制操作,改为逐行读取指定列的值写入目标表,不会出现整列覆盖的问题
- 补全了所有变量声明,添加
Option Explicit避免未定义变量导致的运行错误 - 把行数变量
j的类型改为Long,避免后续行数超过Integer上限(32767)时报错 - 添加
Trim()函数过滤单元格首尾空格,避免空格导致的非空误判 - 补充了第二个循环处理Labour表的逻辑,自动沿用上一个循环的最终行号继续写入,符合需求中「接在第一部分数据之后」的要求
- 移除了不必要的
TargetSht.Activate操作,直接通过工作表对象操作单元格,运行效率更高,也不会出现工作表切换的闪屏问题
内容的提问来源于stack exchange,提问作者TimLavelle
相关产品推荐
相关产品推荐

