VBA技术问询:如何将以FY开头的工作表加入数组并复制到新工作簿
筛选“FY”开头工作表并复制到新工作簿的VBA实现
问题分析
你的代码目前存在两个问题:一是If语句缺少对应的End If,二是未正确实现将符合条件的工作表存入数组的逻辑。下面给出完整解决方案,重点说明数组动态构建和工作表复制的实现方式。
完整代码
Sub Generate_Report() Dim current As Worksheet Dim wsArray() As Worksheet Dim wsCount As Integer wsCount = 0 ' 遍历所有工作表,筛选以"FY"开头的存入数组 For Each current In ThisWorkbook.Worksheets If Left(current.Name, 2) = "FY" Then wsCount = wsCount + 1 ' 动态扩展数组,保留已有元素 ReDim Preserve wsArray(1 To wsCount) ' 将当前工作表对象存入数组 Set wsArray(wsCount) = current End If Next current ' 如果数组中有符合条件的工作表,复制到新工作簿 If wsCount > 0 Then ' 复制数组内的所有工作表到新工作簿(新工作簿会自动创建) wsArray.Copy Else MsgBox "未找到以""FY""开头的工作表" End If End Sub
关键代码说明
- 动态数组构建:
- 声明
wsArray() As Worksheet作为存储工作表对象的数组,wsCount用于统计符合条件的工作表数量 - 每次找到目标工作表时,用
ReDim Preserve扩展数组长度,Preserve关键字确保之前存入的元素不会丢失 - 由于工作表是对象类型,必须通过
Set语句将其赋值给数组元素
- 声明
- 工作表复制:
- 调用
wsArray.Copy会自动创建新工作簿,并将数组内所有工作表一次性复制进去,效率更高 - 增加
wsCount > 0的判断,避免无目标工作表时执行复制操作引发报错
- 调用
- 原代码修正:补上了缺失的
End If,同时明确遍历当前工作簿的工作表(ThisWorkbook.Worksheets),消除歧义
内容的提问来源于stack exchange,提问作者ayyyran
相关产品推荐
相关产品推荐

