【问题标题】:Excel VBA Sort - Error when automated from Access 2007Excel VBA 排序 - 从 Access 2007 自动化时出错
【发布时间】:2020-07-13 17:23:54
【问题描述】:

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

当我进入 Apply 方法时,我得到了这个错误:

“排序参考无效。请确保它在您要排序的数据内,并且第一个排序依据框不是相同或空白”

但是这两个排序键在我要排序的数据中。 Add 方法的 Key 参数也是完全限定的。

这是我的代码。首先,这是在 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 语句,但得到了同样的错误:

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 语句:

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

但是在这样做之后我得到了同样的错误(在排序的同一应用行上)。

格雷格

【问题讨论】:

  • 您的描述听起来像是编译错误,而不是运行时错误。您是否在代码模块的声明部分中包含了Option Explicit,然后从 VB 编辑器的主菜单运行 Debug->Compile?
  • 嗨 HansUp,我在模块顶部确实有 Option Explicit。我尝试了您的 Debug->Compile 建议,它似乎可以编译(没有错误,菜单选项变灰),但我得到了同样的错误。
  • 如果不深入你的代码并且不对其进行测试,我建议对Range object使用不同的排序方法,所以,TRY THIS,而不应用Autofilter
  • @GregLovern:Greg,你能显示完整的代码吗?包括常量声明和赋值。工作簿/工作表对象也是如此。您的代码不完整,因此很难告诉您可能出了什么问题...

标签: excel vba ms-access ms-access-2007 office-automation


【解决方案1】:

@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

现在我必须去拍我的脑袋,因为我自己没有想到这一点! :-)

格雷格

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-15
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多