2015-04-01 46 views
5

我正在嘗試減少我正在使用的Excel工作簿的文件大小。我已經知道未使用的行是一個問題和不必要的圖像等。神祕的原因是爲什麼只有似乎增長的excel的祕密部分?進入增加文件大小的Excel Workbook對象的內容是什麼?

我可以

Sub workbook_objectsize() 
    With CreateObject("Scripting.FileSystemObject") 
      Set wb = ActiveWorkbook 
      WBObjectSize = .GetFile(wb.fullname).Size 
      MsgBox (Format(WBObjectSize, "#,##0") & " Bytes") 
    End With 
    End Sub 

發現我的整個文件的總大小,我可以發現由表的規模和使用

 Sub GetSheetSizes() 
     ' ZVI:2012-05-18 Excel VBA File Size by Worksheet in File 
     ' CAR:2014-10-07 Enhanced to take hidden and very hidden sheets into account 

     Dim a() As Variant 
     Dim Bytes As Double 
     Dim i As Long 
     Dim fileNameTmp As String 
     Dim wb As Workbook 
     Dim visState As Integer 

     Set wb = ActiveWorkbook 
     ReDim a(0 To wb.Sheets.Count, 1 To 2) 

     ' Turn off screen updating 
     Application.ScreenUpdating = False 
     On Error GoTo exit_ 

     ' Put names into a(,1) and sizes into a(,2) 
     With CreateObject("Scripting.FileSystemObject") 
      ' Build the temporary file name 
      Err.Clear 
      fileNameTmp = .GetSpecialFolder(2) & "\" & wb.Name & ".TMP" 
      ' Put workbook's name and size into a(0,) 
      a(0, 1) = wb.Name 
      a(0, 2) = .GetFile(wb.fullname).Size 
      ' Put each sheet name and its size into a(i,) 
      For i = 1 To wb.Sheets.Count 
      visState = wb.Sheets(i).Visible 
      wb.Sheets(i).Visible = -1 ' Show sheet long enough to copy it 
      DoEvents 
      wb.Sheets(i).Copy 

      ActiveWorkbook.SaveCopyAs fileNameTmp 

      wb.Sheets(i).Visible = visState 
      a(i, 1) = wb.Sheets(i).Name 
      a(i, 2) = .GetFile(fileNameTmp).Size 
      Bytes = Bytes + a(i, 2) 
      ActiveWorkbook.Close False 
      Next 
      Kill fileNameTmp 
     End With 

     ' Show workbook's name & size 
     Debug.Print a(0, 1), Format(a(0, 2), "#,##0") & " Bytes" 

     ' Show workbook object's size 
     Debug.Print "Wb Object", Format(a(0, 2) - Bytes, "#,##0") & " Bytes" 

     ' Show each sheet name and its size 
     For i = 1 To UBound(a) 
      Debug.Print a(i, 1), Format(a(i, 2), "#,##0") & " Bytes" 
     Next 

     exit_: 

     ' Restore screen updating 
     Application.ScreenUpdating = True 

    ' Show the reason of error if happened 
     If Err Then MsgBox Err.Description, vbCritical, "Error" 


    End Sub 

這裏是鍛鍊WB對象。我有MYWORKBOOK

步驟1.檢查總文件大小和文件大小由片+ WB對象

 MYWORKBOOK Ver0.34 test.xlsm  932,450 Bytes Total 
     Wb Object  201,679 Bytes 
     Home   312,904 Bytes 
     NISI_DETAIL 40,815 Bytes 
     DATABASE  49,186 Bytes 
     Settings  13,690 Bytes 
     NISI_LIST  27,484 Bytes 
     PleaseWait 21,232 Bytes 
     success  22,077 Bytes 
     Brands  34,721 Bytes 
     USER_LIST  26,819 Bytes 
     QUERY_LIST 37,880 Bytes 
     CAT_MAN_TOOLS 88,406 Bytes 
     Sheet1  9,997 Bytes 
     PROMO_LIST 45,560 Bytes 

步驟2. DELETE ALL SHEETS只留下一個新的空白Sheet 1中,並再次檢查

 MYWORKBOOK Ver0.34 test .xlsm  370,052 Bytes 
     Wb Object  361,589 Bytes 
     Sheet1  8,463 Bytes 

是文件大小減少了,但那是因爲我刪除了每張紙。但是,這個神祕的Wb對象實際上變大了。我勒個去???只有一張空白紙和一個370Kb文件 順便說一句,在新的工作簿上運行相同的測試yeilds的Wb對象大小爲0字節。

TL; DR:上面例子中的Wb對象究竟是什麼?它爲什麼持續增長?我怎樣才能減少到0字節?

+0

大問題和有趣的研究來支持它!不幸的是,我有一種感覺,它將作爲舊金山關閉。 :( – FreeMan 2015-04-01 19:36:08

+0

什麼是OT?我希望它沒有關閉,我真的需要這個答案。我已經瀏覽了所有網頁。 – 2015-04-01 19:43:04

+0

OT = Off topic。由於它與編程或代碼無關,有些人可能會投票結束它會讓我着迷於爲你找到原因 – FreeMan 2015-04-01 19:46:09

回答

1

對於文件減少我使用的代碼,但在你的情況下,我沒有看到它會幫助根據你發佈。我非常希望能夠根據GSergs的建議查看zip文件的內容。

這裏是我的文件縮減代碼,如果你想嘗試,但就像我說的,我不認爲它會得到你希望它小,但它是值得一試:

Sub LipoSuction2() 
'Written by Daniel Donoghue 18/8/2009 
'The purpose of this code is to offer an alternative to the original Liposuction code written by JBeaucaire for the MrExcel forums www.mrexcel.com 
Dim ws As Worksheet 
Dim CurrentSheet As String 
Dim OldSheet As String 
Dim Col As Long 
Dim r As Long 
Dim BottomrRow As Long 
Dim EndCol As Long 
'Begin addition 6/4/2010 for request: http://www.mrexcel.com/forum/showthread.php?p=2269274#post2269274 
Dim Pic As Object 
'End Addition 6/4/2010 for request: http://www.mrexcel.com/forum/showthread.php?p=2269274#post2269274 
For Each ws In Worksheets 
    ws.Activate 
    'Put the sheets in a variable to make it easy to go back and forth 
    CurrentSheet = ws.Name 
    'Rename the sheet to its name with TRMFAT at the end 
    OldSheet = CurrentSheet & "TRMFAT" 
    ws.Name = OldSheet 
    'Add a new sheet and call it the original sheets name 
    Sheets.Add 
    ActiveSheet.Name = CurrentSheet 
    Sheets(OldSheet).Activate 
    'Find the bottom cell of data on each column and find the further row 
    For Col = 1 To Columns.Count 'Find the REAL bottom row 
     If Cells(Rows.Count, Col).End(xlUp).Row > BottomRow Then 
      BottomRow = Cells(Rows.Count, Col).End(xlUp).Row 
     End If 
    Next 
    'Find the end cell of data on each row that has data and find the furthest one 
    For r = 1 To BottomRow 'Find the REAL most right column 
     If Cells(r, Columns.Count).End(xlToLeft).Column > EndCol Then 
      EndCol = Cells(r, Columns.Count).End(xlToLeft).Column 
     End If 
    Next 
    'Copy the REAL set of data 
    Range(Cells(1, 1), Cells(BottomRow, EndCol)).Copy 
    Sheets(CurrentSheet).Activate 
    'Paste everything 
    Range("A1").PasteSpecial xlPasteAll 
    'Paste Column Widths 
    Range("A1").PasteSpecial xlPasteColumnWidths 
    'Begin addition 6/4/2010 for request: http://www.mrexcel.com/forum/showthread.php?p=2269274#post2269274 
    Sheets(OldSheet).Activate 
    For Each Pic In ActiveSheet.Pictures 
     Pic.Copy 
     Sheets(CurrentSheet).Paste 
     Sheets(CurrentSheet).Pictures(Pic.Index).Top = Pic.Top 
     Sheets(CurrentSheet).Pictures(Pic.Index).Left = Pic.Left 
    Next 
    Sheets(CurrentSheet).Activate 
    'End Addition 6/4/2010 for request: http://www.mrexcel.com/forum/showthread.php?p=2269274#post2269274 
    'Reset the variable for the next sheet 
    BottomRow = 0 
    EndCol = 0 
Next 
'Excel will automatically replace the sheet references for you on your formulas, the below part puts them back 
'This is done with a simple reaplce, replacing TRMFAT with nothing 
For Each ws In Worksheets 
    ws.Activate 
    Cells.Replace "TRMFAT", "" 
Next 
'Poll through the sheets and delete the original bloated sheets 
For Each ws In Worksheets 
    If Not Len(Replace(ws.Name, "TRMFAT", "")) = Len(ws.Name) Then 
     Application.DisplayAlerts = False 
     ws.Delete 
     Application.DisplayAlerts = True 
    End If 
Next 
End Sub 
+0

這是之前和之後LipoSuction2 MYWORKBOOK Ver0.34 test.xlsm 368,718字節 Wb對象360,282字節 AFTER: MYWORKBOOK Ver0.34測試。xlsm 368,718字節 Wb對象360,281字節 – 2015-04-01 20:21:18

+1

我認爲它取消了大約1KB,但我仍然有一個完全空的工作簿,只有1張,而這個東西是368KB。任何其他想法?什麼是WB對象?我怎麼能殺死它? – 2015-04-01 20:22:54

+0

我肯定會將它重命名爲一個zip文件並將其打開以查看單個文件與空白書相比有什麼相似之處,如果您這樣做,請回復,我非常想知道答案:)。 – 2015-04-01 20:27:25