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

Excel VBA排序-从Access 2007自动执行时出错,excel,vba,ms-access,ms-access-2007,office-automation,Excel,Vba,Ms Access,Ms Access 2007,Office Automation,我在Excel2007VBA中编写了一些代码,其中包括一些排序,它在Excel中运行良好。现在我正试图让它从Access 2007开始工作,自动化Excel 当我使用Apply方法时,会出现以下错误: 排序引用无效。请确保它位于要排序的数据内,并且第一个“排序依据”框不相同或不为空 但这两个排序键在我要排序的数据中。Add方法的关键参数也是完全合格的 这是我的密码。首先,这是Excel中的工作原理: (数据表是工作表参考) 这在Excel中运行良好。但是我从Access 2007中得到了运行此代

我在Excel2007VBA中编写了一些代码,其中包括一些排序,它在Excel中运行良好。现在我正试图让它从Access 2007开始工作,自动化Excel

当我使用Apply方法时,会出现以下错误:

排序引用无效。请确保它位于要排序的数据内,并且第一个“排序依据”框不相同或不为空

但这两个排序键在我要排序的数据中。Add方法的关键参数也是完全合格的

这是我的密码。首先,这是Excel中的工作原理: (数据表是工作表参考)

这在Excel中运行良好。但是我从Access 2007中得到了运行此代码的错误: (数据表还是工作表参考,内置Excel常量现在是Access中的显式常量,返回相同的值)

我尝试使用语句完全限定内部,但得到了相同的错误:

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错误;这是一个弹出对话框。然后它会忽略该过程中的错误处理程序和调用过程中的错误

有什么建议吗

谢谢

格雷格

更新:

在排序之前,我尝试关闭工作簿、退出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
但在做了那个之后,我得到了同样的错误(在排序的同一应用行上)


格雷格

@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

您的描述听起来几乎像是编译错误,而不是运行时错误。您是否在代码模块的声明部分包含了
Option Explicit
,然后从VB编辑器的主菜单运行Debug->Compile?嗨,HansUp,我确实在模块顶部有Option Explicit。我尝试了你关于调试->编译的建议,它似乎可以编译(没有错误,菜单选项变灰),但我也遇到了同样的错误。如果不深入到你的代码中,也不进行测试,我建议对
范围对象
使用不同的排序方法,因此,在不应用
自动筛选
@GregLovern:Greg的情况下,你能展示完整的代码吗。包括常量声明和赋值。工作簿/工作表对象也是如此。您的代码不完整,因此很难告诉您可能出现了什么问题。。。
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
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