请求修改VBA脚本:仅复制非空行至目标工作表
修改VBA脚本实现仅复制非空行到目标工作表
问题分析
原脚本会复制从第2行到列C最后一行的所有行,包括空行。我们需要调整逻辑,仅复制列C包含数据的非空行(你原本用列C判断最后一行,推测该列是关键数据列)。
修改后的完整代码
Sub Export_Basecosti() Dim fd As Office.FileDialog Dim fullFilePath As String Dim sourceWs As Worksheet Dim targetWb As Workbook Dim targetWs As Worksheet Dim lastRow As Long Dim dataRange As Range Dim nonEmptyRows As Range ' 获取当前工作簿名称 Dim currentWbName As String currentWbName = ThisWorkbook.Name ' 选择目标文件 Set fd = Application.FileDialog(msoFileDialogFilePicker) With fd .AllowMultiSelect = False .Title = "Scegli il file della Base Costi da Compilare" .Filters.Clear .Filters.Add "Excel Files", "*.xlsx;*.xlsm" ' 优先显示Excel文件,降低选错概率 .Filters.Add "All Files", "*.*" If .Show = True Then fullFilePath = .SelectedItems(1) ' 直接取完整文件路径,避免原代码仅取文件名导致的打开失败 Else MsgBox "未选择文件" Exit Sub End If End With ' 引用源工作表,避免使用Select/Activate Set sourceWs = ThisWorkbook.Sheets("Base Costi") lastRow = sourceWs.Cells(Rows.Count, "C").End(xlUp).Row ' 筛选列C非空的行 With sourceWs Set dataRange = .Range("A2:C" & lastRow) ' 可根据实际数据范围调整列数 On Error Resume Next ' 防止无空行时触发错误 Set nonEmptyRows = dataRange.Columns(3).SpecialCells(xlCellTypeConstants).EntireRow On Error GoTo 0 End With ' 检查是否有可复制的非空行 If nonEmptyRows Is Nothing Then MsgBox "没有非空行可复制" Exit Sub End If ' 打开目标工作簿并粘贴数据 Set targetWb = Workbooks.Open(fullFilePath) Set targetWs = targetWb.Sheets("Bid COSTS - Link") ' 清空目标区域 targetWs.Rows("8:508").ClearContents ' 粘贴非空行的值 nonEmptyRows.Copy targetWs.Range("A8").PasteSpecial Paste:=xlPasteValues ' 清理剪贴板 Application.CutCopyMode = False ' 保存并关闭目标工作簿 targetWb.Save targetWb.Close MsgBox "Base Costi Copiata" End Sub
关键修改说明
- 修复文件路径问题:原代码仅取文件名,若文件不在当前工作簿目录下会打开失败,改为直接获取完整文件路径。
- 移除冗余操作:删掉
Activate和Select,改用对象直接引用工作表,提升代码稳定性和执行效率。 - 非空行筛选逻辑:通过
SpecialCells(xlCellTypeConstants)精准筛选列C有数据的行,确保只复制非空内容;添加错误处理避免无数据时报错。 - 优化文件筛选:优先显示Excel格式文件,减少误操作概率。
内容的提问来源于stack exchange,提问作者blasfemo
相关产品推荐
相关产品推荐

