Страницы: 1
RSS
Как узнать размер (удельный вес, вклад) отдельных листов в файле
 
Файл Excel содержит много листов, файл большой.
Как можно узнать размер (удельный вес, вклад) каждого листа в общий размер файла?
Нужно, что бы вычислить самые тяжелые листы.
 
Есть такой вариант:
Копируем книгу-считываем её размер в байтах.
Далее начинаем удалять по одному листу. После каждого удаления сохраняем книгу и считываем её размер в байтах. Дальше ясно - из предыдущего размера вычитаем текущий. Хотя бы примерно получите.
Возможно, будет некий остаток - это возможное наличие в книге именованных формул.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Можно и помучиться

файлы офиса 2007 и старше.
Распаковали архиватором
идем в папку xl
xl\workbook.xml получаем имя листа и ID
идем в папку xl\_rels
xl\_rels\workbook.xml по ID получаем имя файла в папке xl\worksheets
В папке xl\worksheets\ ищем листы,меряем их размер
sheet1.xml
sheet2.xml
.......
 
The_Prist, это вариант. Но если листов >100 и некоторые из них скрыты то это напряжно.
Может быть есть какая то надстройка для этого?

Doober, спасибо. Это очень помогло.
 
Я имел ввиду кодом. Надстройки подобной не видал. Если будет время - позже выложу примерный код.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Если в листе есть код, удаление листа может порушить программу.
Можно наоборот копировать лист (в новую книгу), сохранять его в %temp% и измерять размер файла.
 
Алексей, тоже бяка может получиться если есть ссылки внутри листа на другие листы...Тогда вес будет неверным, т.к. ссылки на другую книгу тяжелее. Тоже сначала подумал именно про копирование, но решил, что вряд ли чего порушится, если удалять именно в копии книги - запрет на события и сообщения - и не думаю, что будут проблемы. Замеры-то будем делать из другого файла.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
ну вот что-то вроде того(не претендую на оригинальность и окончательную достоверность, а так же оптимальность):

Код
Sub GetShLen()
    Dim wbWork As Workbook
    Dim sTmpPath As String, sWorkFileName As String
    Dim wsSh, li As Long
    Dim dblLen As Double, dblShLen2 As Double, dblShLen As Double
    Dim avResLen()

    sTmpPath = "C:\" 'Environ("temp")
    If Right(sTmpPath, 1) <> "\" Then sTmpPath = sTmpPath & "\"

    sWorkFileName = sTmpPath & "templen_" & ActiveWorkbook.Name
    
    With Application
        .ScreenUpdating = 0
        .DisplayAlerts = 0
        .EnableEvents = 0
        .Calculation = xlCalculationManual
    End With
    ActiveWorkbook.SaveCopyAs sWorkFileName
    dblLen = FileLen(sWorkFileName)
    Set wbWork = Workbooks.Open(sWorkFileName, False)
    ReDim avResLen(1 To wbWork.Sheets.Count)
    wbWork.Sheets.Add wbWork.Sheets(1)
    For li = wbWork.Sheets.Count To 2 Step -1
        wbWork.Sheets(li).Delete
        wbWork.Save
        dblShLen2 = FileLen(sWorkFileName)
        dblShLen = dblLen - dblShLen2
        avResLen(li - 1) = dblShLen
        dblLen = dblShLen2
    Next li
    wbWork.Close 0
    Kill sWorkFileName
    
    Debug.Print "Размеры листов файла " & ActiveWorkbook.Name & ":"
    For li = UBound(avResLen) To LBound(avResLen) Step -1
        Debug.Print "Лист №" & li & " - " & avResLen(li) & " b"
    Next li
    
    With Application
        .ScreenUpdating = 1
        .DisplayAlerts = 1
        .EnableEvents = 1
        .Calculation = xlCalculationAutomatic
    End With
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Doober написал:
файлы офиса 2007 и старше.Распаковали архиваторомидем в папку xl xl\workbook.xml получаем имя листа и IDидем в папку xl\_rels xl\_rels\workbook.xml по ID получаем имя файла в папке xl\worksheetsВ папке xl\worksheets\ ищем листы,меряем их размерsheet1.xmlsheet2.xml
Спасибо!
 
andrei-lupasco@yandex.ru, ознакомьтесь с правилами, после этого зайдите в свой профиль и поменяйте отображаемое имя (логин).
И ещё запомните: кнопка цитирования не для ответа!
Страницы: 1
Наверх