使用VBA生成新工作簿后原工作簿被硬编码的问题排查请求
问题原因
你的代码直接将遍历到的名称写入了原工作簿的B2单元格(rng = ws.Range("A" & i),而rng指向原工作表的B2),这是导致原工作簿数据被硬编码的核心原因。另外,依赖剪贴板的数值粘贴方式也存在可优化空间。
修改后的代码
Sub CreateWorkbooks() Dim wb As Workbook Dim ws As Worksheet Dim nwb As Workbook Dim nws As Worksheet Dim path As String Dim myDate As String Dim x As Integer Dim nameStr As String ' 新增变量存储名称,避免修改原工作表 x = ThisWorkbook.Worksheets("Summary").Range("C77").Value ' 避免依赖ActiveSheet Set wb = ThisWorkbook Set ws = wb.Worksheets("Summary") path = "X:\Private\Forecast\Forecasts by name\" myDate = Format(Now(), "MM-DD-YYYY") For i = 77 To x nameStr = ws.Range("A" & i).Value ' 用变量存名称,不修改原工作表 ws.Copy Set nwb = ActiveWorkbook Set nws = nwb.Worksheets("Summary") ' 直接赋值代替剪贴板粘贴,更高效且避免剪贴板占用 nws.UsedRange.Value = nws.UsedRange.Value Application.DisplayAlerts = False nwb.SaveAs Filename:=path & nameStr & " " & myDate & ".xlsx", FileFormat:=xlWorkbookDefault nwb.Close Application.DisplayAlerts = True Next i End Sub
关键修改说明
- 新增
nameStr字符串变量:专门存储遍历到的名称,不再直接修改原工作簿的B2单元格,从根源避免原数据被改动。 - 移除不必要的单元格操作:原代码中
rng指向原工作表B2并被赋值,现在完全删除该操作,改用变量存储名称。 - 优化数值粘贴逻辑:用
nws.UsedRange.Value = nws.UsedRange.Value代替剪贴板复制粘贴,跳过剪贴板操作,既提升运行效率又避免潜在的剪贴板冲突问题。 - 修正
x的赋值逻辑:原代码依赖ActiveSheet,改为直接指定原工作簿的Summary工作表,避免因当前激活工作表变化导致的错误。
内容的提问来源于stack exchange,提问作者darthdepression
相关产品推荐
相关产品推荐

