需求:可以将多个工作簿的第一个sheet合并到一个工作簿中,并且每一个sheet的名字用工作簿来命名。
Sub 合并工作簿sheet()
sPath = Excel.ThisWorkbook.Path
Set x = Application.FileDialog(msoFileDialogFilePicker)
Application.ScreenUpdating = False
With x
.AllowMultiSelect = True
'.ButtonName = "请选择"
'.Title = "xxx"
.InitialFileName = sPath
If .Show = 0 Then Exit Sub
Application.ScreenUpdating = False
For Each file In .SelectedItems
Filename = split0(file, -1, "\")
Set 原始表 = Workbooks.Open(file)
原始表.Sheets(1).Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
原始表.Close savechanges:=False
'ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count).Name = Replace(file.Name, "")
For Each 符号 In Array("""", "*", "<", ">", "?", "\", "/", "|", ":", "[", "]", ".xlsx", ".xls")
If InStr(Filename, 符号) Then
Filename = Replace(Filename, 符号, "")
End If
Next
ThisWorkbook.ActiveSheet.Name = Left(Filename, 30)
Next
End With
Application.ScreenUpdating = True
End Sub
Function split0(单元格, 第几个字段, Optional 可选分隔符)
y = 单元格
If IsMissing(可选分隔符) Then
x = Split(y, " ")
Else
x = Split(y, 可选分隔符)
End If
For i = 0 To UBound(x)
If x(i) <> "" Then
j = j + 1
End If
Next
Dim brr() As String
ReDim brr(1 To j)
j = 0
For i = 0 To UBound(x)
If x(i) <> "" Then
j = j + 1
brr(j) = x(i)
End If
Next
If 第几个字段 < 0 Then
第几个字段 = UBound(brr) + 第几个字段 + 1
End If
split0 = Trim(brr(第几个字段))
End Function
注意点:
1、Application.FileDialog(msoFileDialogFilePicker) 可以多选文件,并且可以设置打开时的初始路径,比较好用
2、重新改造了split函数,可以获取倒数第一个值,就是文件名
3、对于文件名中的特殊符号以及后缀,要舍去,我用数组循环遍历删除
4、ThisWorkbook.ActiveSheet.Name = Left(Filename, 30) 一定要用activesheet 不然这个表格在多次使用时,名称可能没改掉。原理:每次sheet新增时,表格都会新增sheet索引,如果删除了表格,索引也不会减少,和实际的sheet.cout不一致,所以sheets(n) 这种方式无法选择到正在被增加的sheet,每次sheet增加时,被增加的都会变成activesheet,所以用这个来设置名称,不会出错
5、用Application.ScreenUpdating 控制屏幕刷新的动画,可以加快速度
2883

被折叠的 条评论
为什么被折叠?



