Страницы: 1
RSS
Не удается уменьшить размер файла
 
Добрый вечер.

Прошу помощи, т.к. все, что предлагается в качестве методов по уменьшению размера файлов (в т.ч. читала здесь http://www.planetaexcel.ru/techniques/12/114/), не позволило найти причину.

Изначально стала возникать проблема в документе с большим количеством листов и большого размера: на нескольких листах не могу добавить строки, возникает сообщение, что потребуется обновить большое число данных, если принять - файл зависает, а затем и вовсе excel прощается.
Тогда один из таких листов скопировала в отдельную книгу, чтобы выявить причину .
Оборвала связи с исходным файлом.
Однако даже в отдельной книге строки не добавлялись.

Тогда:
Удалила все форматы
Удалила имена
Запустила макрос с поиском скрытых имен, было одно - удалила.
Удалила все объекты (кнопки с макросами)
Обновила через удаление все строки.
(сводных таблиц не было, общего доступа к книге также нет и не было)

Вроде, проверила все, остался пустой лист, но файл весит 2,7 Мб.
Где искать?
Очень нужно понять причину, чтобы в исходном документе (в модели) восстановить возможность добавления строк на листе.

Благодарю.

Собственно, "чистый" документ: лист Вывоз5
Исходник: лист Вывоз
 
Листы недоступны (нерабочие ссылки).

P.S. Возможно, моя Опера не принимает.
 
Ссылки рабочие. Открываются в ГуглДокс. Сохранил к себе. Пробую разобраться
Согласие есть продукт при полном непротивлении сторон
 
Нужно выделить только ячейки с данными и скопировать их в новый лист, а старый удалить.
Потом желательно сохранить книгу в формате xlsb - получится компактный (136КБ) и быстрый вариант, скачать можно здесь
Изменено: ZVI - 19.01.2016 23:31:45
 
ZVI, спасибо, но вариант с созданием нового листа и копированием данных я знаю и не обращалась бы за помощью. Конечно, если не удастся разобраться, так и придется делать, но не хотелось бы: этот вариант не подходит, потому как на данный лист (в файле с моделью, в котором он используется) много ссылок, соответственно, придется заново прописывать и линковать. Кроме того, таких "проблемных" листов несколько, в связи с чем работа увеличивается.
Задача - разобраться, где зарыт источник утяжеления, чтобы не прибегая к переносу данных и прописыванию заново формул, его устранить плюс на случай, если проблема вновь возникнет в будущем.
Изменено: erd85 - 20.01.2016 10:43:16
 
Доброе время суток
В какой-то степени, можно пойти путём Владимира, удалить SheetXXX.xml с большим содержанием, а потом отредактировать в архиве файла xlsm workbook.xml и workbook.xml.rels (правда, нужно будет тогда поэкспериментировать, что будет со ссылками на этот лист. Завтра попробую - отпишусь.
Изменено: Андрей VG - 20.01.2016 11:29:05
 
Можете использовать приведенный ниже код, который когда-то делался именно для таких целей.
Привожу его без изменений с английскими сообщениями, надеюсь это не смутит.
Нужно активировать проблемную книгу, нажать Alt-F8 и запустить MrExcelDiet.
Код
Sub MrExcelDiet()
' ZVI:2009-08-08 Active workbook excess formatting clearing
' Idea & original code of Just_Jon: http://www.mrexcel.com/forum/showthread.php?t=120831
' First attempt of modification: http://www.mrexcel.com/forum/showthread.php?t=339144
' Bugs tracking:
' 1. Range("A1") fixed to .Range("A1")
' 2. Exchanging:
'   .EntireRow.RowHeight to ws.StandardHeight
'   .EntireColumn.ColumnWidth to ws.StandardWidth
' Revised:2010-06-16
' 3.(ZVI:2010-06-16) Code for StandardHeight corrected. Comments shapes are skipped
  Const Title = "MrExcelDiet: Just_Jon's code modified by ZVI"
  Const vbTab2 = vbTab & vbTab
  Dim Wb As Workbook, Ws As Worksheet, LastCell As Range, Shp As Shape, Chrt As Chart
  Dim Prot As Boolean, ProtWarning As Boolean, DoCharts As Boolean
  Dim LastRow&, LastCol&, ShpLastRow&, ShpLastCol&, i&, ac, x
  Dim SheetsTotal&, SheetsCleared&, ChartsCleared&, SheetsProtSkipped&
  Dim FileNameTmp$, BytesInFileOld&, BytesInFileNew&
  ' Choose the clearing mode
  Set Wb = ActiveWorkbook
  x = MsgBox("Excess formatting clearing of " & Wb.Name & vbCr & vbCr & _
             "Apply full clearing?" & vbCr & vbCr & _
             "Yes" & vbTab & "- Full mode, including chart's AutoScaleFont=False" & vbCr & _
             "No" & vbTab & "- Medium mode, without charts processing" & vbCr & _
             "Cancel" & vbTab & "- Stop clearing & Exit", _
             vbInformation + vbYesNoCancel, _
             Title)
  If x = vbCancel Then Exit Sub
  DoCharts = (x = vbYes)
  ' Freeze on
  With Application
    .ScreenUpdating = False
    .EnableEvents = False
    ac = .Calculation: .Calculation = xlCalculationManual
  End With
  ' Calculate the old file size
  On Error Resume Next
  With CreateObject("Scripting.FileSystemObject")
    FileNameTmp = .GetSpecialFolder(2) & "\" & Wb.Name & ".TMP"
    Wb.SaveCopyAs FileNameTmp
    BytesInFileOld = .GetFile(FileNameTmp).Size
  End With
  ' Processing in each worksheet
  ProtWarning = True
  SheetsTotal = Wb.Sheets.Count
  For Each Ws In Wb.Worksheets
    With Ws
      ' Clear an error flag
      Err.Clear
      ' Inform on processing status
      Application.StatusBar = "MrExcelDiet: processing of sheet " & Ws.Name
      ' Check protection
      Prot = .ProtectContents
      ' Try to unprotect without password
      If Prot Then .Unprotect ""
      If (Err <> 0 Or .ProtectContents) And ProtWarning Then
        SheetsProtSkipped = SheetsProtSkipped + 1
        x = MsgBox(Ws.Name & " is protected and will be skipped" & vbCr & vbCr & _
                   "Skip warning on protected sheets?" & vbCr & vbCr & _
                   "Yes" & vbTab & "- Skip warning, clear sheets silently" & vbCr & _
                   "No" & vbTab & "- Warning on each protected sheets" & vbCr & _
                   "Cancel" & vbTab & "- Stop clearing & Exit", _
                   vbExclamation + vbYesNoCancel, _
                   Title)
        ProtWarning = (x = vbNo)
        If x = vbCancel Then GoTo exit_
      Else
        ' Count processed worksheets
        SheetsCleared = SheetsCleared + 1
        ' Determine the last used cell with a formula or value or comment in Ws
        Set LastCell = GetLastCell(Ws)
        ' Determine the last column and last row
        If Not LastCell Is Nothing Then
          LastCol = LastCell.Column
          LastRow = LastCell.Row
        End If
        ' Determine if any merged cells are beyond the last row
        For Each x In Range(.Cells(LastRow, 1), .Cells(LastRow, LastCol))
          If x.MergeCells Then
            With x.MergeArea
              LastRow = Max(LastRow, .Rows(.Rows.Count).Row)
            End With
          End If
        Next
        ' Determine if any merged cells are beyond the last column
        For Each x In Range(.Cells(1, LastCol), .Cells(LastRow, LastCol))
          If x.MergeCells Then
            With x.MergeArea
              LastCol = Max(LastCol, .Columns(.Columns.Count).Column)
            End With
          End If
        Next
        ' Determine if any shapes are beyond the last row and last column
        ShpLastCol = LastCol
        ShpLastRow = LastRow
        For Each Shp In .Shapes
          If Shp.Type <> msoComment Then  ' ZVI:2010-06-16
            ShpLastCol = Max(ShpLastCol, Shp.BottomRightCell.Column)
            ShpLastRow = Max(ShpLastRow, Shp.BottomRightCell.Row)
          End If
        Next
        ' Clear cells beyond the last column
        If LastCol < .Columns.Count Then
          With .Range(.Columns(LastCol + 1), .Columns(.Columns.Count))
            .Clear
            If LastCol >= ShpLastCol Then
              ' Set StandardWidth to columns which are beyond the last col
              .EntireColumn.ColumnWidth = IIf(Ws.StandardWidth, Ws.StandardWidth, 8.43)  'Ws.StandardWidth
            End If
          End With
          If ShpLastCol < .Columns.Count Then
            ' Set StandardWidth to columns which are beyond the Shapes
            With .Range(.Columns(ShpLastCol + 1), .Columns(.Columns.Count))
              .EntireColumn.ColumnWidth = IIf(.StandardWidth, .StandardWidth, 8.43)  'Ws.StandardWidth
            End With
          End If
        End If
        ' Clear cells beyond the last row
        If LastRow < .Rows.Count Then
          With .Range(.Rows(LastRow + 1), .Rows(.Rows.Count))
            .Clear
            If LastRow >= ShpLastRow Then
              ' Set StandardWidth to rows which are beyond the last row
              .EntireRow.RowHeight = IIf(Ws.StandardHeight, Ws.StandardHeight, 12.75)
            End If
          End With
          If ShpLastRow < .Rows.Count Then
            ' Set StandardHeight to rows which are beyond the Shapes
            With .Range(.Rows(ShpLastRow + 1), .Rows(.Rows.Count))
              .EntireRow.RowHeight = IIf(.StandardHeight, .StandardHeight, 12.75)
            End With
          End If
        End If
        ' Reset last cell position of the sheet
        With .UsedRange: End With
        ' Protect the sheet if it was unprotected
        If Prot Then .Protect
      End If
      ' Apply setting to worksheet's charts: ChartArea.AutoScaleFont = False
      If DoCharts Then
        For i = 1 To .ChartObjects.Count
          Application.StatusBar = "MrExcelDiet: processing of chart " & .ChartObjects(i).Name
          .ChartObjects(i).Chart.ChartArea.AutoScaleFont = False
          ChartsCleared = ChartsCleared + 1
        Next
      End If
    End With
  Next
  ' Apply setting to workbook's charts: ChartArea.AutoScaleFont = False
  If DoCharts Then
    With Wb
      For i = 1 To .Charts.Count
        ' Clear an error flag
        Err.Clear
        ' Inform on processing status
        Application.StatusBar = "MrExcelDiet: processing of chart " & .Charts(i).Name
        ' Check chart sheet protection
        Prot = .Charts(i).ProtectContents
        ' Try to unprotect chart sheet without password
        If Prot Then .Charts(i).Unprotect ""
        If (Err <> 0 Or .Charts(i).ProtectContents) And ProtWarning Then
          SheetsProtSkipped = SheetsProtSkipped + 1
          x = MsgBox(Ws.Name & " is protected and will be skipped" & vbCr & vbCr & _
                     "Skip warning on protected sheets?" & vbCr & vbCr & _
                     "Yes" & vbTab & "- Skip warning, clear sheets silently" & vbCr & _
                     "No" & vbTab & "- Warning on each protected sheets" & vbCr & _
                     "Cancel" & vbTab & "- Stop clearing & Exit", _
                     vbExclamation + vbYesNoCancel, _
                     Title)
          ProtWarning = (x = vbNo)
          If x = vbCancel Then GoTo exit_
        Else
          ' Set AutoScaleFont = False for chart sheet
          .Charts(i).ChartArea.AutoScaleFont = False
          SheetsCleared = SheetsCleared + 1
          ChartsCleared = ChartsCleared + 1
          ' Protect the chart sheet if it was unprotected
          If Prot Then .Charts(i).Protect
        End If
      Next
    End With
  End If
exit_:
  ' Calculate the new file size
  Wb.SaveCopyAs FileNameTmp
  BytesInFileNew = CreateObject("Scripting.FileSystemObject").GetFile(FileNameTmp).Size
  Kill FileNameTmp
  ' Freeze off
  With Application
    .Calculation = ac
    .ScreenUpdating = True
    .EnableEvents = True
  End With
  ' Report on results
  Application.StatusBar = False
  x = MsgBox("Statistics of excess formatting clearing" & vbLf & vbLf & _
             "Workbook:" & vbTab & ActiveWorkbook.Name & "'" & vbLf & _
             "Sheets total:" & vbTab2 & SheetsTotal & vbLf & _
             "Sheets cleared:" & vbTab2 & SheetsCleared & vbLf & _
             "Protected sheets skipped: " & vbTab & SheetsProtSkipped & vbLf & _
             "Other sheets skipped:" & vbTab & SheetsTotal - SheetsCleared - SheetsProtSkipped & vbLf & _
             "Charts cleared:" & vbTab2 & ChartsCleared & vbLf & _
             "File size old:" & vbTab & Format(BytesInFileOld, "# ### ##0") & " Bytes" & vbLf & _
             "File size new:" & vbTab & Format(BytesInFileNew, "# ### ##0") & " Bytes" & vbLf & _
             vbLf & _
             "Save the cleared workbook to keep the changes?" & vbLf & _
             "Yes" & vbTab & "- Save & Exit" & vbLf & _
             "No" & vbTab & "- Exit without saving, cleared", _
             vbInformation + vbYesNo + IIf(BytesInFileNew < BytesInFileOld, vbDefaultButton1, vbDefaultButton2), _
             Title)
  If x = vbYes Then Wb.Save
End Sub

' ZVI:2009-02-02 Get last cell within values/formulas/comments of sheet Sh
' Auto-filtered & hidden rows/columns are also calculated without ShowAllData
' ActiveSheet is used if optional Sh is missing
' If VisibleOnly=True then only visible cells are searched
Function GetLastCell(Optional Sh As Worksheet, Optional VisibleOnly As Boolean) As Range
  Dim SpecCells(), Rng As Range, r&, c&, x, a
  SpecCells = Array(xlCellTypeConstants, xlCellTypeFormulas, xlCellTypeComments)
  On Error Resume Next
  If Sh Is Nothing Then Set Sh = ActiveSheet
  Set Rng = Sh.UsedRange
  If VisibleOnly Then Set Rng = Rng.SpecialCells(xlCellTypeVisible)
  For Each x In SpecCells
    For Each a In Rng.SpecialCells(x).Areas
      With a.Cells(a.Rows.Count, a.Columns.Count)
        c = Max(c, .Column)
        r = Max(r, .Row)
      End With
    Next
  Next
  If r * c <> 0 Then Set GetLastCell = Sh.Cells(r, c)
End Function

' Aux function: max value of arguments
Private Function Max(ParamArray Values())
  Dim x
  For Each x In Values
    If x > Max Then Max = x
  Next
End Function


Ваша книга  "лист Вывоз5.xlsx" ужалась этим кодом с 2 838 510 Байт до 9 739 Байт
Изменено: ZVI - 20.01.2016 11:51:04
 
Доброе время суток
Владимир, спасибо за науку, ваш код работает чётко. Только вот понять не могу. Очищать/удалять столбцы/строки вне пределов используемой области пробовал, но никакого эффекта не получил.
Насколько понял, в действиях (учитывая что диаграмм и прочих объектов на листе нет) основная разница в том, что у вас устанавливается для области вне пределов используемого диапазона ширина/высота столбцов/строк по умолчанию. Или я ещё какой-то момент упускаю?
 
Цитата
Андрей VG написал: Насколько понял, в действиях (учитывая что диаграмм и прочих объектов на листе нет) основная разница в том, что у вас устанавливается для области вне пределов используемого диапазона ширина/высота столбцов/строк по умолчанию. Или я ещё какой-то момент упускаю?
Доброе утро, Андрей. Да, это тот самый случай. Когда дорабатывал код, собрал коллекцию артефактных файлов и на них отрабатывал различные методы. Был еще один метод в запасе для какого-то редкого случая, но до реализации в коде не дошло.
Изменено: ZVI - 21.01.2016 04:03:39
 
Владимир, ещё раз большое спасибо за пояснения. Я уже думал над вариантом правки самого sheet1.xml, установкой узла dimension в реальный диапазон, как у вас по области значений, формул, а остальное - лишние узлы данных по столбцам/строкам удалить и пересохранить.
 
Простите, можно приклеюсь к теме тяжелых файлов с вопросом об утяжелении файла гиперссылками?

Подскажите, пожалуйста, в сравнительном отношении файл весом 22 737 Кб имеющий основную вкладку с данными в 62 507 строк и 35 столбцов, плюс справочник, откуда подтягиваются ВПРми данные в основную многострочную вкладку и пару сводных таблиц имеет разумное соотношение объема информации и веса, или слишком тяжелый? Просто при открытии этих файлов и работе с ними долго думает комп, если еще парочку файлов открыть - вообще беда...айтишник говорит, что проблема не в компах....

и еще, второстепенный вопрос, насколько тяжелее и медленнее делают файл гиперссылки? Например, если в базе данных на 2 000 строк и 15 столбцов, тоже с ВПР и справочником сделать гиперссылки на сканы самих документов, которые занесены в базу, файл умрет?
 
Цитата
написал:
Можете использовать приведенный ниже код, который когда-то делался именно для таких целей.Привожу его без изменений с английскими сообщениями, надеюсь это не смутит.Нужно активировать проблемную книгу, нажать Alt-F8 и запустить MrExcelDiet.
Хоть и много времени прошло, но не могу не поблагодарить.
Чуть работа не стала.
Чего только не пробовала, только этот код сработал так четко
Страницы: 1
Читают тему
Наверх