在多工作簿数据提取中,如何激活同名指定工作表?
问题分析与修正代码
你的代码主要有两个问题导致无法正常激活"7b"工作表:
- 重复执行
Workbooks.Open FileNames(i),第二次打开会覆盖之前的激活状态,完全属于冗余操作 - 过度依赖
ActiveWorkbook、Select这类不稳定的操作,一旦窗口焦点意外变化就会触发错误
直接用对象变量引用工作簿和工作表才是可靠的写法,下面是修正后的代码:
Sub Extract() Dim FileNames As Variant Dim i As Integer Dim sourceWb As Workbook Dim sourceWs As Worksheet Dim targetWs As Worksheet Application.ScreenUpdating = False Set targetWs = ThisWorkbook.Sheets(ActiveSheet.Name) ' 固定引用当前目标工作表 targetWs.Range("C2").Select ' 定位起始粘贴位置 FileNames = Application.GetOpenFilename(FileFilter:="Excel Filter (*.xlsx), *.xlsx", Title:="Open File(s)", MultiSelect:=True) ' 处理用户取消选择文件的情况 If Not IsArray(FileNames) Then Exit Sub For i = 1 To UBound(FileNames) Set sourceWb = Workbooks.Open(FileNames(i)) ' 先检查工作表是否存在,避免报错中断 On Error Resume Next Set sourceWs = sourceWb.Sheets("7b") On Error GoTo 0 If Not sourceWs Is Nothing Then ' 直接复制粘贴,无需反复切换激活状态 sourceWs.Range("B2:H8").Copy targetWs.Activate ActiveCell.PasteSpecial Paste:=xlPasteAll, Transpose:=True ' 下移一行准备下一次粘贴 ActiveCell.Offset(1, 0).Activate Else MsgBox "文件" & FileNames(i) & "中未找到名为""7b""的工作表" End If sourceWb.Close SaveChanges:=False Set sourceWs = Nothing ' 释放变量 Next i Application.ScreenUpdating = True End Sub
关键改进点:
- 用
sourceWb和sourceWs变量直接绑定打开的工作簿和目标工作表,彻底摆脱对ActiveWorkbook的依赖 - 删除了重复打开工作簿的冗余代码
- 增加工作表存在性检查,避免因工作表缺失导致程序崩溃
- 仅在必要时激活目标工作表,减少不必要的窗口切换
内容的提问来源于stack exchange,提问作者Camilo
相关产品推荐
相关产品推荐

