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 |
现在我必须为自己不去想而打了巴掌! :-)
格雷格