none
Проблемы с совместимостью после программной сортировки VBA колонок в таблице Excel 2007. RRS feed

  • Вопрос

  • Добрый день, уважаемые знатоки!

    Работаю над автоматизацией таблицы учёта заправки картриджей и обслуживания оргтехники. Приложение — Office Excel 2007, автоматизацию осуществляю посредством VBA. После написания процедуры сортировки колонок таблицы на одном из листов и последующей её отработки и сохранения файла, при последующем открытии этого файла Excel стал выдавать сообщение "В книге ... обнаружено содержимое, которое не удалось прочитать. Попробовать восстановить содержимое книги? Если вы доверяете источнику этой книги, нажмите кнопку "Да". После открытия всё выглядит ОК, ничего вроде бы не потерялось. Но повторное сохранение после восстановления не помогает, при следующем открытии эта же ошибка возникает снова.

    Проблема совершенно очевидно связана с отработкой свеженаписанной процедуры сортировки колонок, поскольку, если я удаляю из таблицы обработанные этой процедурой столбцы, сообщение об ошибке больше не появляется. Поэтому у меня есть сугубые опасения, что вышеозначенную процедуру сортировки колонок я написал некорректно. Далее привожу код самой процедуры и кусок кода, из которого она вызывается. Выгруженная проблемная страница в виде отдельной книги (без кода VBA) находится здесь (архив Книга1.zip). Сортировка колонок проводится по значениям ячеек первой строки, содержащим дату (т.е. начиная с колонки "C" и далее вправо) листа "Ремонт".

    Подскажите, пожалуйста, в чём я неправ и как следует корректно переписать процедуру сортировки.

    Dim rngKey As Range 'Диапазон ключа сортировки.
    Dim rngSort As Range 'Диапазон сортировки.
    Dim rng As Range 'Временный диапазон.
    Set PExpsSheet = ThisWorkbook.Worksheets("Ремонт")
    ...
    'Сортируем колонки, чтобы даты шли по возрастанию. Для этого сначала определяем ключевой диапазон (по которому осуществляем сортировку).
    With PExpsSheet
    Set rngKey = .Range("Ser.No").Cells(1)
    Set rngKey = rngKey.Offset(-1, 1)
    Set rngSort = rngKey
    Set rng = LastInRow(rngKey)
    Set rngKey = .Range(rngKey, rng)
    'Теперь определяем сортируемый диапазон.
    Set rng = rng.EntireColumn
    Set rngSort = .Range(rngSort, rng.Cells(.Range("Ser.No").Rows.Count + 1))
    Call SortTableByRows(PExpsSheet, rngSort, rngKey) 'Вызываем процедуру сортировки.
    End With
    ...
    
    Public Sub SortTableByRows(sSheet As Worksheet, sRange As Range, sKey1 As Range, Optional sKey2 As Range, Optional sKey3 As Range, Optional sKey4 As Range, Optional sKey5 As Range)
    'Процедура выполняет сортировку столбцов диапазона sRange на заданном листе sSheet по ключевым диапазонам sKey1-5.
    Application.ScreenUpdating = False
    With sSheet.Sort
    With .SortFields
    .Clear
    .Add Key:=sKey1, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers
    If Not sKey2 Is Nothing Then .Add Key:=sKey2, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers
    If Not sKey3 Is Nothing Then .Add Key:=sKey3, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers
    If Not sKey4 Is Nothing Then .Add Key:=sKey4, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers
    If Not sKey5 Is Nothing Then .Add Key:=sKey5, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers
    End With
    .SetRange sRange
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlLeftToRight
    .SortMethod = xlPinYin
    .Apply
    End With
    Application.ScreenUpdating = True
    End Sub
    


    8 сентября 2011 г. 10:40

Ответы

Все ответы