访问 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 仅在第一次运行时存储预期值的主要内容,如果未能解决你的问题,请参考以下文章