VBA将xlsb数据跨目录写入关闭的xlsx文件无数据问题求助
问题根因与修复方案
- 核心错误:
Set pasteSheet = Worksheets("flight_plan_input")没有明确指定所属工作簿,VBA默认会从运行代码的xlsb文件中查找同名工作表,而非你刚打开的目标xlsx文件,导致数据实际被写入到xlsb自身的工作表中,目标xlsx自然没有更新。同目录下文件打开时会自动切换活动工作簿,所以刚好能命中目标,跨目录时活动工作簿未切换就会失效。 - 次关键错误:粘贴时的
Rows.Count未绑定目标工作表,会默认取当前活动工作簿的行计数,可能出现行定位错误。 - 可优化问题:复制源的
ActiveSheet未绑定xlsb工作簿,目标工作簿未用变量接收,硬编码文件名容易出现匹配错误。
修正后代码
Private Sub CommandButton2_Click() ' 声明变量 Dim targetWb As Workbook Dim pasteSheet As Worksheet Dim sourceSheet As Worksheet ' 绑定当前xlsb中需要复制的源工作表,避免活动窗口错位 Set sourceSheet = ThisWorkbook.ActiveSheet ' 也可以改成ThisWorkbook.Worksheets("你的源工作表名") 稳定性更高 ' 用变量接收打开的目标xlsx工作簿,避免文件名匹配错误 Set targetWb = Workbooks.Open("C:\wamp64\www\aircraft\flt_plan_input.xlsx") ' 明确指定工作表属于刚打开的目标xlsx文件 Set pasteSheet = targetWb.Worksheets("flight_plan_input") If sourceSheet.Range("A1507") <> "" Then sourceSheet.Range("A1506:Q1506").Copy ' 明确绑定pasteSheet的行计数,定位正确的空白行 pasteSheet.Cells(pasteSheet.Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValuesAndNumberFormats Application.CutCopyMode = False End If ' 直接用变量关闭目标工作簿,不需要再匹配文件名 targetWb.Close SaveChanges:=True End Sub
额外注意事项
- 如果用户设备的UAC权限控制严格,可能会阻止VBA写入C盘wamp64目录,建议将目标xlsx的目录权限设置为普通用户可读写,或者将目标文件放到用户目录下的Web站点目录中,避免权限拦截导致写入失败。
- 建议把源工作表的引用从
ActiveSheet改为固定的工作表名称,比如ThisWorkbook.Worksheets("计划填写页"),避免用户误切到其他工作表点击按钮时复制错误数据。
内容的提问来源于stack exchange,提问作者Gary Wilson
相关产品推荐
相关产品推荐

