【发布时间】: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