VBA从关闭工作簿复制Range无返回值问题求助
解决从关闭工作簿指定列复制数据到当前工作簿的问题
原代码核心问题
- 对象引用缺失:切换到目标工作簿后,
Range(Cells(16, Clmn), Cells(21, Clmn))未指定源工作簿的工作表,默认会引用当前活动的目标工作簿,导致复制错误区域。 - 未明确源工作表:打开源工作簿后直接操作活动表,易因源工作簿默认打开表不符出现问题。
- 选择逻辑冗余:需求仅需选列,但原代码让用户选择任意范围,增加操作复杂度。
修正后的代码
Sub ImportDataFromClosedWorkbook() Dim targetWb As Workbook Dim sourceWb As Workbook Dim sourceWs As Worksheet Dim targetRng As Range Dim sourceColRange As Range Dim sourceCol As Integer Dim xTitleId As String: xTitleId = "SAP Actuals" Set targetWb = ActiveWorkbook ' 选择源工作簿 With Application.FileDialog(msoFileDialogOpen) .Filters.Clear .Filters.Add "Excel 文件", "*.xlsx; *.xlsm; *.xlsb" .AllowMultiSelect = False If .Show <> -1 Then Exit Sub ' 用户取消选择则退出 Set sourceWb = Workbooks.Open(.SelectedItems(1)) Set sourceWs = sourceWb.Sheets(1) ' 指定源工作簿第一个工作表,可按需修改 End With ' 选择源列(点击目标列任意单元格即可) On Error Resume Next ' 处理用户取消选择的情况 Set sourceColRange = Application.InputBox(prompt:="点击源工作簿中要复制的列(任意单元格即可)", _ Title:=xTitleId, Type:=8) On Error GoTo 0 If sourceColRange Is Nothing Then sourceWb.Close False Exit Sub End If sourceCol = sourceColRange.Column ' 选择目标起始单元格 On Error Resume Next Set targetRng = Application.InputBox(prompt:="选择目标工作簿中粘贴的起始单元格", _ Title:=xTitleId, Type:=8) On Error GoTo 0 If targetRng Is Nothing Then sourceWb.Close False Exit Sub End If ' 直接赋值(比复制粘贴更高效,避免剪贴板问题) targetRng.Resize(6, 1).Value = sourceWs.Range(sourceWs.Cells(16, sourceCol), sourceWs.Cells(21, sourceCol)).Value targetRng.EntireColumn.AutoFit ' 自动调整列宽 ' 关闭源工作簿 sourceWb.Close SaveChanges:=False End Sub
关键修改说明
- 明确对象层级:所有
Range和Cells都指定父对象(sourceWs.),彻底避免跨工作簿引用错误。 - 简化列选择:仅需用户点击源列任意单元格,自动提取列号,贴合需求中“仅需列”的要求。
- 直接赋值替代复制粘贴:跳过剪贴板,既提升效率又避免格式问题,确保只获取数值。
- 增加错误处理:处理用户取消选择的情况,避免代码崩溃。
- 规范变量命名:变量名更具可读性,便于后续维护。
内容的提问来源于stack exchange,提问作者Cody
相关产品推荐
相关产品推荐

