概览
利用vba批量处理excel基础操作是:
- 打开一个excel工作表,使用Alt+F11调出vba编辑器
- 插入->模块
- 使用Alt+F8运行
一.合并工作表
需求: 需要用vba批量处理excel文件,背景如下: 有一个文件夹,文件夹下有test01、test02两个excel工作簿,且这两个工作簿只有一个工作表,为Sheet1; 预期效果:希望创建一个新的工作簿,比如名称为mergeBook,希望该工作簿有两个工作表,表名分别为test01和test02,该工作表对应着原先test01、test02两个excel工作簿Sheet1工作表的内容
vba代码
Sub MergeWorksheets()
Dim folderPath As String
Dim fileName As String
Dim sourceWorkbook As Workbook
Dim targetWorkbook As Workbook
Dim targetSheet As Worksheet
' 设置文件夹路径,请根据实际情况修改
folderPath = "C:\YourFolderPath\" ' 替换为实际文件夹路径
' 检查文件夹是否存在,如果不存在则创建
If Dir(folderPath, vbDirectory) = "" Then
MkDir folderPath
End If
' 创建新的工作簿 mergeBook
Set targetWorkbook = Workbooks.Add
On Error Resume Next ' 忽略可能的错误
targetWorkbook.SaveAs Filename:=folderPath & "mergeBook.xlsx"
If Err.Number <> 0 Then
MsgBox "保存文件时出错,请检查文件夹路径和权限。错误代码: " & Err.Number
Err.Clear
On Error GoTo 0
Exit Sub
End If
On Error GoTo 0 ' 恢复错误处理
' 获取文件夹中的第一个 Excel 文件
fileName = Dir(folderPath & "*.xlsx")
' 循环遍历文件夹中的所有 Excel 文件
Do While fileName <> ""
' 排除合并后的工作簿
If fileName <> "mergeBook.xlsx" Then
' 打开源工作簿
Set sourceWorkbook = Workbooks.Open(folderPath & fileName)
' 清理文件名,去除非法字符
Dim validName As String
validName = Replace(fileName, ".xlsx", "")
validName = Replace(validName, "\", "")
validName = Replace(validName, "/", "")
validName = Replace(validName, "?", "")
validName = Replace(validName, "*", "")
validName = Replace(validName, "[", "")
validName = Replace(validName, "]", "")
' 截断名称,确保不超过 31 个字符
If Len(validName) > 31 Then
validName = Left(validName, 31)
End If
' 检查名称是否已存在,如果存在则添加序号
Dim newName As String
newName = validName
Dim i As Integer
i = 1
Do While WorksheetExists(newName, targetWorkbook)
newName = validName & " (" & i & ")"
i = i + 1
Loop
' 在目标工作簿中添加新的工作表
Set targetSheet = targetWorkbook.Sheets.Add(After:=targetWorkbook.Sheets(targetWorkbook.Sheets.Count))
targetSheet.Name = newName
' 复制源工作表的内容到目标工作表
sourceWorkbook.Sheets("Sheet1").Cells.Copy targetSheet.Cells
' 关闭源工作簿
sourceWorkbook.Close SaveChanges:=False
End If
' 获取下一个 Excel 文件
fileName = Dir
Loop
' 保存并关闭目标工作簿
targetWorkbook.Save
targetWorkbook.Close
End Sub
Function WorksheetExists(sheetName As String, wb As Workbook) As Boolean
Dim ws As Worksheet
On Error Resume Next
Set ws = wb.Sheets(sheetName)
WorksheetExists = Err.Number = 0
Err.Clear
On Error GoTo 0
End Function
二. 拆分工作表
需求: 比如有一个excel表有多个工作簿,希望把工作表的工作簿拆分出来,新建成excel工作表
代码如下:
Sub SplitWorksheetsIntoFiles()
Dim ws As Worksheet
Dim wb As Workbook
Dim newWB As Workbook
Dim savePath As String
' 设置保存拆分后文件的路径,可根据实际情况修改
savePath = "C:\YourSavePath\"
' 检查保存路径是否存在,若不存在则创建
If Dir(savePath, vbDirectory) = "" Then
MkDir savePath
End If
' 获取当前工作簿
Set wb = ThisWorkbook
' 遍历当前工作簿中的每个工作表
For Each ws In wb.Sheets
' 创建一个新的工作簿
Set newWB = Workbooks.Add
' 将当前工作表复制到新工作簿中
ws.Copy Before:=newWB.Sheets(1)
' 删除新工作簿中默认创建的工作表
Application.DisplayAlerts = False
newWB.Sheets(2).Delete
Application.DisplayAlerts = True
' 保存新工作簿,文件名使用原工作表名
newWB.SaveAs Filename:=savePath & ws.Name & ".xlsx"
' 关闭新工作簿
newWB.Close SaveChanges:=False
Next ws
MsgBox "工作表拆分完成!"
End Sub