Excel 2007: «Ошибка автоматизации» при сортировке данных с использованием VBA (80010105) - PullRequest
0 голосов
/ 30 марта 2012

Я запускаю сценарий 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

Любые предложения приветствуются!Спасибо

1 Ответ

0 голосов
/ 03 апреля 2012

Проблема в том, что вы неправильно ссылаетесь на свои диапазоны. Код сортировки, который вы используете, был написан для сортировки диапазонов на активном листе в текущем экземпляре 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
...