VBA复制当前工作簿指定列到新工作簿并计算消费总额报错处理
报错原因
原代码存在多个直接触发运行时错误的问题:
- 拼写错误:
workshets属于拼写失误,正确写法是Worksheets,会导致源工作表对象赋值失败 - 对象赋值逻辑完全错误:
Set nws = nwb.Worksheets("Sheet1").Range("B2").Value = nws.Range("B2").Value这行既没有正确给nws工作表对象赋值,还在nws未初始化的状态下调用其属性,直接抛出Object variable or With block variable not set错误 - 冗余逻辑问题:全表复制后再调用Copy/PasteSpecial转值的写法效率极低,且未指定粘贴目标,容易出现异常
- 未实现消费金额统计的相关逻辑
可直接运行的修正代码
Sub CopyDataToNewWB() Dim wb As Workbook, ws As Worksheet Dim nwb As Workbook, nws As Worksheet Dim lastRow As Long, amountCol As Long Dim totalAmount As Double ' 绑定源工作簿与工作表,若源表名不是Sheet1请自行修改 Set wb = ThisWorkbook Set ws = wb.Worksheets("Sheet1") ' 复制工作表生成新工作簿 ws.Copy Set nwb = ActiveWorkbook Set nws = nwb.ActiveSheet ' 一次性将所有单元格转为纯值,断开公式关联 With nws.UsedRange .Value = .Value End With ' 按表头匹配消费金额列,适配列位置变动 On Error Resume Next amountCol = nws.Rows(1).Find("消费金额", xlValues, xlWhole).Column On Error GoTo 0 If amountCol = 0 Then MsgBox "表头未找到「消费金额」字段,请检查后重试", vbExclamation nwb.Close False Exit Sub End If ' 统计消费金额总和 lastRow = nws.Cells(nws.Rows.Count, amountCol).End(xlUp).Row totalAmount = WorksheetFunction.Sum(nws.Range(nws.Cells(2, amountCol), nws.Cells(lastRow, amountCol))) ' 写入统计结果 With nws.Cells(lastRow + 1, amountCol) .Value = totalAmount .Font.Bold = True .Offset(0, -1) = "消费总金额:" .Offset(0, -1).Font.Bold = True End With ' 自动调整列宽适配内容 nws.UsedRange.EntireColumn.AutoFit MsgBox "操作完成,消费总金额为:" & Format(totalAmount, "#,##0.00"), vbInformation End Sub
使用说明
- 运行前确认源数据的工作表名称为
Sheet1,如果名称不同请修改代码中对应位置的表名 - 代码会自动保留源表所有字段(包含姓名、年龄、消费金额、日期),不需要手动指定列
- 复制到新工作簿的内容全部为纯值,不会因为原工作簿路径变动出现引用错误
- 统计结果会自动写在消费金额列的最后一行数据下方,自动加粗标识,运行完成后会弹窗提示总金额
- 如果表头不存在「消费金额」字段,代码会弹出提示并自动关闭未保存的新工作簿,不会抛出运行时错误
内容的提问来源于stack exchange,提问作者Ali C
相关产品推荐
相关产品推荐

