0

Я написал код в Excel 2007 VBA, который включает в себя некоторую сортировку и отлично работает в Excel. Теперь я пытаюсь заставить его работать с Access 2007, автоматизируя Excel.Excel VBA Sort - ошибка при автоматическом доступе из Access 2007

Когда я к методу Применить, я получаю эту ошибку:.

«Ссылка рода не является допустимой Убедитесь, что оно находится в пределах данных, которые вы хотите отсортировать, и первые Сортировать по коробке не то же или пустое "

Но два ключа сортировки находятся в пределах данных, которые я хочу сортировать. Кроме того, ключевые параметры метода Add полностью соответствуют требованиям.

Вот мой код. Во-первых, это то, что работает в Excel: (data_sheet является ссылкой лист)

With data_sheet.AutoFilter.Sort 
    With .SortFields 
     .Clear 
     .Add Key:=data_sheet.Cells(2, iColTicker), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
     .Add Key:=data_sheet.Cells(2, iColTempfieldDate), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
    End With 
    .Header = xlYes 
    .MatchCase = False 
    .Orientation = xlTopToBottom 
    .Apply 
End With 

Это отлично работает в Excel. Но я получаю ошибку на этом коде работает с Access 2007: (data_sheet снова ссылка рабочего листа, а также встроенные в Excel константа теперь явные константы в Access, возвращающие то же значение)

With data_sheet.Sort 
    With .SortFields 
     .Clear 
     .Add Key:=data_sheet.Cells(1, iColTicker), SortOn:=XL_SORT_ON_VALUES, Order:=XL_ASCENDING, DataOption:=XL_SORT_NORMAL 
     .Add Key:=data_sheet.Cells(1, iColTempfieldDate), SortOn:=XL_SORT_ON_VALUES, Order:=XL_ASCENDING, DataOption:=XL_SORT_NORMAL 
    End With 
    .Header = XL_YES 
    .MatchCase = False 
    .Orientation = XL_TOP_TO_BOTTOM 
    .Apply 
End With 

я пытался полностью квалифицируя внутреннее С утверждением, но получил ту же ошибку:

With data_sheet.Sort 
    With data_sheet.Sort.SortFields 
     .Clear 
     .Add Key:=data_sheet.Cells(1, iColTicker), SortOn:=XL_SORT_ON_VALUES, Order:=XL_ASCENDING, DataOption:=XL_SORT_NORMAL 
     .Add Key:=data_sheet.Cells(1, iColTempfieldDate), SortOn:=XL_SORT_ON_VALUES, Order:=XL_ASCENDING, DataOption:=XL_SORT_NORMAL 
    End With 
    .Header = XL_YES 
    .MatchCase = False 
    .Orientation = XL_TOP_TO_BOTTOM 
    .Apply 
End With 

Я также попытался удалить с заявления полностью:

data_sheet.Sort.SortFields.Clear 
data_sheet.Sort.SortFields.Add Key:=data_sheet.Cells(2, iColTicker), SortOn:=XL_SORT_ON_VALUES, Order:=XL_ASCENDING, DataOption:=XL_SORT_NORMAL 
data_sheet.Sort.SortFields.Add Key:=data_sheet.Cells(2, iColTempfieldDate), SortOn:=XL_SORT_ON_VALUES, Order:=XL_ASCENDING, DataOption:=XL_SORT_NORMAL 
data_sheet.Sort.Header = XL_YES 
data_sheet.Sort.MatchCase = False 
data_sheet.Sort.Orientation = XL_TOP_TO_BOTTOM 
data_sheet.Sort.Apply 

Во всех случаях я получаю сообщение об ошибке в строке Apply. Это не ошибка VBA; это всплывающее диалоговое окно. И затем он игнорирует мой обработчик ошибок в этой процедуре и ошибки в процедуре вызова.

Любые предложения?

Спасибо,

Грег

UPDATE:

Я попытался закрыть книгу, бросить Excel, инстанцировании новый экземпляр Excel, и повторное открытие книги, непосредственно перед сортировкой, как это:

Dim xlApp As Excel.Application, wbDashboard As Workbook 
Dim strDatasheetName As String, strDatasheetWorkbookName As String, strDatasheetWorkbookPath As String 
strDatasheetName = data_sheet.Name 
strDatasheetWorkbookName = data_sheet.Parent.Name 
strDatasheetWorkbookPath = data_sheet.Parent.Path 
Set xlApp = data_sheet.Parent.Parent 

data_sheet.Parent.Close SaveChanges:=True 
    Set data_sheet = Nothing: DoEvents 
xlApp.Quit 
    Set xlApp = Nothing: DoEvents 
Set xlApp = CreateObject("Excel.Application") 
Set wbDashboard = xlApp.Workbooks.Open(strDatasheetWorkbookPath & "\" & strDatasheetWorkbookName) 
wbDashboard.Activate: DoEvents 
DoEvents 
Set data_sheet = wbDashboard.Worksheets(strDatasheetName) 
data_sheet.Activate: DoEvents 
DoEvents 

Но после этого я получил ту же ошибку (на той же строке Применить) сортировки.

Грег

+0

Ваше описание звучит почти как ошибка компиляции, а не ошибка времени выполнения. Включили ли вы «Option Explicit» в разделе Declarations вашего модуля кода, а затем запустите Debug-> Compile из главного меню VB Editor? – HansUp

+0

Привет, HansUp, у меня есть Option Explicit в верхней части модуля.Я пробовал ваши предложения Debug-> Compile, и он, казалось, компилировался (ошибок нет, и выбор меню стал серым), но я получил ту же ошибку. –

+0

, не вдаваясь глубоко в ваш код и не тестируя его, я бы предложил использовать другой метод сортировки для объекта «Range», поэтому [TRY THIS] (http://msdn.microsoft.com/en-us/library/ff840646%28v = office.14% 29.aspx), без применения 'Autofilter'. –

ответ

0

@KazJaw: Спасибо, используя старый стиль сортировки (Range.Sort) работал. Вот мой код сейчас:

data_sheet.Cells.Sort _ 
    Key1:=data_sheet.Cells(2, iColTicker), Order1:=XL_ASCENDING, _ 
    Key2:=data_sheet.Cells(2, iColTempfieldDate), Order2:=XL_ASCENDING, _ 
    Header:=XL_YES, MatchCase:=False, Orientation:=XL_TOP_TO_BOTTOM, _ 
    DataOption1:=xlSortNormal, DataOption2:=XL_SORT_NORMAL 

Теперь я должен похлопать по бокам головы, чтобы не думать об этом сам! :-)

Greg

 Смежные вопросы

  • Нет связанных вопросов^_^