访问 VBA Dimension 仅在第一次运行时存储预期值

Posted

技术标签:

【中文标题】访问 VBA Dimension 仅在第一次运行时存储预期值【英文标题】:Access VBA Dimension only storing expected value the first time it is run 【发布时间】:2013-04-11 01:59:26 【问题描述】:

我从其他地方改编了这段代码。单击表单上的按钮意味着告诉我 Excel 电子表格中给定单元格范围 (C1:C500) 中非空行的数量...

Sub ImportDataFromRange()

Dim excelapp As Excel.Application
Set excelapp = CreateObject("excel.application")
excelapp.Workbooks.Open (Application.CurrentProject.Path & "\MattExcelFile.xls")

Dim myrange As Range
Set myrange = excelapp.Sheets("Sheet1").Range("C1:C500")

Dim numberofrows As Integer
numberofrows = Excel.Application.WorksheetFunction.CountA(myrange)

MsgBox numberofrows
Debug.Print excelapp

excelapp.Quit
Set excelapp = Nothing

End Sub

Private Sub Command0_Click()

ImportDataFromRange

End Sub

在打开 MS-Access 并通过我创建的按钮运行此代码时,它第一次可以正常工作,但之后就不行了。关闭并重新打开 MS-Access 会重置行为,因此它会在打开后第一次运行时再次正常工作,但以后再也不会。

在第一次运行时,这是存储在维度中的(正确的)数据:

excelapp = "C:\Users\Matt\Desktop\MattExcelFile.xls" numberofrows = 4

在随后的运行中,这是存储在维度中的(不正确的)数据:

excelapp = "Microsoft Excel" numberofrows = 500

有人可以帮我看看这里的代码,这样我就可以在同一个 MS-Access 会话中多次运行代码,并且每次都能获得正确的维度数据吗?非常感谢。

【问题讨论】:

Link explains 和西蒙的一样。但西蒙更好:) +1 为“无疑令人讨厌”的问题,许多程序员可能会遇到并且将来可能会面临。 【参考方案1】:

刚刚对您的代码进行了一些更改 - 我已为您记录了它们 - 对我有用。

至于 excelapp 维度,我认为它说“Microsoft Excel”是正确的,如果您要打印 wb.Name 维度,您将获得工作簿名称。不确定为什么它会在后续运行中为您提供不同的维度,可能是因为您没有明确关闭工作簿,但这是一个猜测。

Sub ImportDataFromRange()
Dim excelapp As Object
Set excelapp = CreateObject("excel.application")

' assign the workbook
Dim wb As Object
Set wb = excelapp.Workbooks.Open(Application.CurrentProject.Path & "\tbl_Order_Status.xls")


Dim numberofrows As Integer
' Call function slightly differently
numberofrows = excelapp.Application.counta(wb.worksheets("Sheet1").Range("C1:C500"))

' Close and release wb
wb.Close
Set wb = Nothing

MsgBox numberofrows
Debug.Print excelapp

excelapp.Quit
Set excelapp = Nothing

End Sub

【讨论】:

【参考方案2】:

我相信您的问题源于您创建了 excelapp 对象变量但随后在获得 numberofrows 的行上使用了不同的引用(Excel.Application.WorksheetFunction 而不是 excelapp.WorksheetFunction)。

以下(更正的)代码对我有用:

Sub ImportDataFromRange()
Dim excelapp As Excel.Application
Set excelapp = New Excel.Application

excelapp.Workbooks.Open (Application.CurrentProject.Path & "\MattExcelFile.xls")

Dim myrange As Range
Set myrange = excelapp.Sheets("Sheet1").Range("C1:C500")

Dim numberofrows As Integer
numberofrows = excelapp.WorksheetFunction.CountA(myrange)

MsgBox numberofrows
Debug.Print excelapp

Set myrange = Nothing
excelapp.Quit
Set excelapp = Nothing

End Sub

Private Sub Command0_Click()

ImportDataFromRange

End Sub

【讨论】:

效果很好。非常感谢。对于遇到此问题的任何其他人,我已在您的答案中添加了一条注释,他们需要确保他们的 MS-Access 引用包括 Microsoft Excel [版本] 对象库,否则这种做法它不会工作。

以上是关于访问 VBA Dimension 仅在第一次运行时存储预期值的主要内容,如果未能解决你的问题,请参考以下文章

尝试保存时 VBA 宏抛出错误(但仅在一台计算机上)

excel vba 运行时错误

Excel VBA数据验证交换仅在调试模式下工作

访问 VBA 如何将新工作表添加到 Excel?

如何仅在应用程序第一次运行时在我的 iOS 应用程序中打开页面视图控制器?

运行时错误“3264”访问 2010 VBA