在一个文件夹中有四张EXCEL工作薄,文件名分别为汇总、氧化、车间、硫酸。请编写一个VBA程序,要求把文件名分别为氧化、车间、硫酸三张工作簿中的内容复制到文件名为汇总的工作簿中对应名称的工作表中,并支持模糊匹配。
时间: 2024-09-20 17:07:27 浏览: 64
在VBA中,可以使用`Application.GetOpenFilename`函数让用户选择需要合并的工作簿,然后遍历选定的文件,使用`Sheets.Add`和`CopyWorksheets`方法将指定工作表复制到目标工作簿。对于模糊匹配,我们可以先检查文件名是否包含关键词"氧化"、"车间"或"硫酸"。以下是简单的VBA程序示例:
```vba
Sub MergeWorkbooks()
Dim wsTarget As Worksheet ' 汇总工作表
Dim wbSource As Workbook ' 需要合并的源工作簿
Dim fileNames() As String ' 存放文件名数组
Dim fileName As String ' 当前文件名
Dim keyword As Variant ' 匹配的关键字
' 获取用户选择的源工作簿
fileNames = Application.GetOpenFilename("Excel Files (*.xls*),*.xls*", MultiSelect:=True)
' 检查并复制符合条件的工作簿
If fileNames <> False Then
For Each fileName In fileNames
Set wbSource = Workbooks.Open(fileName) ' 打开源工作簿
' 判断文件名是否包含关键词
keyword = Array("氧化", "车间", "硫酸")
If IsArrayIntersect(keyword, Mid(fileName, InStrRev(fileName, "\"), Len(fileName))) Then
Set wsTarget = ThisWorkbook.Sheets("汇总") ' 设置目标工作表
' 如果存在同名工作表,则复制,否则新建并复制
If wsTarget.Name <> wbSource.Worksheets(1).Name Then
wsTarget.Name = wbSource.Worksheets(1).Name ' 将源工作表重命名
End If
wbSource.Worksheets(1).Copy Before:=wsTarget ' 复制源工作表到目标位置
wbSource.Close SaveChanges:=False ' 关闭源工作簿
End If
Next fileName
Else
MsgBox "未选择任何文件"
End If
End Sub
Function IsArrayIntersect(arr1() As Variant, arr2() As Variant) As Boolean
Dim i As Long, j As Long
IsArrayIntersect = False
ReDim temp() As Variant
For i = LBound(arr1) To UBound(arr1)
For j = LBound(arr2) To UBound(arr2)
If arr1(i) = arr2(j) Then
ReDim Preserve temp(LBound(temp) To UBound(temp) + 1) As Variant
temp(UBound(temp)) = arr1(i)
IsArrayIntersect = True
Exit For
End If
Next j
Next i
If Not IsArrayIntersect Then
ReDim Erase temp
End If
End Function
阅读全文