关于Excel VBA排序:Excel VBA排序-从Access 2007自动执行时出错

Excel VBA Sort - Error when automated from Access 2007

我在Excel 2007 VBA中编写了一些代码,其中包括一些排序,并且在Excel中运行良好。现在,我正在尝试使其从Access 2007开始工作,从而使Excel自动化。

当我进入Apply方法时,出现此错误:

"排序参考无效。确保它在要排序的数据中,并且第一个"排序依据"框不相同或为空白"

但是两个排序键在我要排序的数据中。另外,Add方法的关键参数是完全限定的。

这是我的代码。首先,这是在Excel中有效的方法:
(data_sheet是工作表参考)

1
2
3
4
5
6
7
8
9
10
11
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中的显式常量,返回相同的值)。

1
2
3
4
5
6
7
8
9
10
11
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语句,但遇到相同的错误:

1
2
3
4
5
6
7
8
9
10
11
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

我还尝试了完全删除With语句:

1
2
3
4
5
6
7
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错误;这是一个弹出对话框。然后它忽略了该过程中的错误处理程序,而忽略了调用过程中的错误。

有什么建议吗?

谢谢,

格雷格

更新:

我试图关闭工作簿,退出Excel,实例化一个新的Excel实例,然后重新打开工作簿,就像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

但是这样做之后,我遇到了相同的错误(在排序的同一Apply行上)。

格雷格


@KazJaw:谢谢,使用了旧样式排序(Range.Sort)。现在是我的代码:

1
2
3
4
5
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

现在我必须为自己不去想而打了巴掌! :-)

格雷格