Excel 2007: ошибка автоматизации при сортировке данных с помощью VBA (80010105)

Я запускаю сценарий VBA из файла Excel, который открывает другой файл, манипулирует данными и некоторыми диаграммами, а затем сохраняет их. Все работает отлично, за исключением случаев, когда я пытаюсь отсортировать данные. Когда я дохожу до строки .SortFields.Add Key:=Range("J3:J11")..., я получаю сообщение об ошибке

    Run-time error '-2147417851 (80010105)':
    Automation error
    The server threw an exception

Я уверен, что это как-то связано с тем, как я ссылаюсь на объект Excel, но я перепробовал все и не нашел решения. Код сортировки был заимствован из макрорекордера и изменен.

Private Sub button1_Click()
Dim path As String
Dim exl As Excel.Application
path = ActiveWorkbook.path & "\"
Set exl = CreateObject("Excel.Application")

With exl
    .Workbooks.Open path & "bin\Integrated UPSIDE with Summary.xlsm"

    <...other code...>

    With .Worksheets("Summary").Sort
        .SortFields.Clear
        .SortFields.Add Key:=Range("J3:J11") _
            , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
        .SetRange Range("C2:P11")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

    <...other code...>

.Workbooks.Close
End With
exl.QUIT
End Sub

Любые предложения БОЛЬШИМ образом оценены! Спасибо


person Justin B    schedule 30.03.2012    source источник
comment
Измените Range("J3:J11") на .Range("J3:J11") и повторите попытку. Аналогично для Range("C2:P11") :)   -  person Siddharth Rout    schedule 30.03.2012


Ответы (1)


Проблема в том, что вы неправильно ссылаетесь на свои диапазоны. Используемый вами код сортировки был написан для диапазонов сортировки на активном листе в текущем экземпляре Excel.

Самый простой способ исправить это — указать диапазоны как находящиеся в другом экземпляре Excel.

.SortFields.Add Key:=exl.Worksheets("Summary").Range("J3:J11") _
              , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
.SetRange exl.Worksheets("Summary").Range("C2:P11")

Однако я бы предложил вместо этого использовать объекты Workbook и Worksheet.

Private Sub button1_Click()
    Dim path As String
    Dim exl As Excel.Application
    Dim wbk As Workbook, sht As Worksheet
    path = ActiveWorkbook.path & "\"
    Set exl = CreateObject("Excel.Application")

    With exl
        Set wbk = .Workbooks.Open(path & "bin\Integrated UPSIDE with Summary.xlsm")

        '<...other code...>

        Set sht = wbk.Worksheets("Summary")
        With sht.Sort
            .SortFields.Clear
            .SortFields.Add Key:=sht.Range("J3:J11") _
                , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
            .SetRange sht.Range("C2:P11")
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With

        '<...other code...>

        wbk.Close
        Set sht = Nothing
        Set wbk = Nothing
    End With
    exl.Quit
End Sub
person mischab1    schedule 03.04.2012