|
|
本帖最后由 likeyouli 于 2025-9-5 16:06 编辑
一个工作簿(xlsx,xls,含很多工作表),超过200Mb就比较难打开了,超过500M甚至上GB的,就只能往而兴叹了 。
在不打开工作簿的情况下,将里边的工作表复制出来,每个工作表另存为一个工作簿:
Sub 大excel文件不打开将工作表拆分出来()
Dim filepath As String, weizhi As String, chaifen As Workbook, linshi As Worksheet, n as Integer
'让用户选择源文件
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "请选择要拆分的超大XLSX文件"
.Filters.Clear
.Filters.Add "Excel Files", "*.xlsx; *.xlsm; *.xls"
If .Show = -1 Then
filepath = .SelectedItems(1)
Else
MsgBox "未选择文件。操作已取消。"
Exit Sub
End If
End With
weizhi = Left(filepath, InStrRev(filepath, "\"))
Set linshi = ActiveWorkbook.Worksheets.Add
For n = 1 To 3
DoEvents
TableName = GetSheetNameByADO(filepath, n)
If TableName = "" Then Exit For
Application.CutCopyMode = False '取消任何当前的复制或剪切操作状态,避免影响后续操作
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array( _
"OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password="""";User ID=Admin;Data Source=" & filepath & ";Mode=Share Deny Write; Extended Proper", "ties=""HDR=YES;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine Type=37;" _
, _
"Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Databas" _
, _
"e Password="""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=Fal" _
, _
"se;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False;Jet OLEDB:Bypass User" _
, _
"Info Validation=False;Jet OLEDB:Limited DB Caching=False;Jet OLEDB:Bypass ChoiceField Validation=False" _
), Destination:=Range("$A$1")).QueryTable
.CommandType = xlCmdTable
.CommandText = Array("" & TableName & "$")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.SourceDataFile = filepath
.ListObject.DisplayName = "表5_xianyiyuan" & n
.Refresh BackgroundQuery:=False
End With
DoEvents
Range("表5_xianyiyuan" & n & "[#All]").Select
Selection.Copy
Set chaifen = Workbooks.Add
' Sheets.Add After:=ActiveSheet
chaifen.Worksheets(1).Range("a1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
chaifen.SaveAs weizhi & TableName
chaifen.Close False
Application.DisplayAlerts = False ' 禁用警告
ActiveSheet.Delete
Application.DisplayAlerts = True
Set linshi = ActiveWorkbook.Worksheets.Add
Next n
MsgBox "大excel文件的工作表拆分完毕"
End Sub
Function GetSheetNameByADO(filepath As String, sheetIndex As Integer) As String
On Error GoTo ErrorHandler
Dim conn As Object, rs As Object, i As Integer
Set conn = CreateObject("ADODB.Connection")
If LCase(Right(filepath, 4)) = ".xls" Then
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & filepath & ";Extended Properties='Excel 8.0;HDR=NO';"
Else
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & filepath & ";Extended Properties='Excel 12.0 Xml;HDR=NO';"
End If
Set rs = conn.OpenSchema(20) '20 = adSchemaTables
i = 0
Do While Not rs.EOF
If InStr(rs.Fields("TABLE_NAME").Value, "$") > 0 And _
Left(rs.Fields("TABLE_NAME").Value, 4) <> "MSys" Then
i = i + 1
If i = sheetIndex Then
GetSheetNameByADO = Replace(rs.Fields("TABLE_NAME").Value, "$", "")
Exit Do
End If
End If
rs.MoveNext
Loop
rs.Close
conn.Close
Exit Function
ErrorHandler:
GetSheetNameByADO = ""
On Error Resume Next
If Not rs Is Nothing Then rs.Close
If Not conn Is Nothing Then conn.Close
End Function
|
|