如何将整个Excel列分配给Access中VBA中的variables?

目前,我有一个Access窗体筛选子窗体中的logging,并在单击button时用第一张表中的数据创build一个Excel文档。 我有一堆其他计算发生在后续工作表上,但我需要他们只发生的“名称”字段已经存在于第一张“名称”列中的条目。 其他计算是通过SQL语句完成的。

我的思考过程是做一些事情:

SELECT (various fields) FROM (query name) WHERE (first couple of where statements) AND NameField IN NameColumn 

其中NameField是名称元素,NameColumn是整个列。 我试图用多种方式创build这个variables没有成功。 例如,我试过的一件事是在正确的实例中循环添加“(”,“,”和“)”的logging,但string太长,Access不能运行它。 我也尝试只是定义variables,如:

 NameColumn = ExcelApplication.Range("A:A") 

 NameColumn = Worksheet.Range("A:A") 

 NameColumn = ExcelApplication.Columns("A:A").EntireColumn 

但所有这些似乎只是指列的第一个条目。 我试过研究解决scheme,但我没有find任何有用的。 有谁知道我会如何处理这样的事情?

编辑:我可能也应该提到,我以为我只是得到使用这些方法的第一个条目,因为NameColumn没有被定义为任何事情之前。 但我试过了:

 Dim NameColumn As Range 

但我会然后得到以下错误:

 Compile Error: User-defined type not defined 

这是奇怪的,因为经过一些研究,我注意到范围似乎是一个有效的数据types

编辑2:这是我如何定义我的Excel应用程序和工作表:

编辑3:编辑它使它有点更完整的情况下,它的帮助

编辑4:更新更多的代码

 Dim rst As DAO.Recordset Dim ApXL As Object Dim xlWBk As Object Dim xlWSh As Object Dim fld As DAO.Field Const xlCenter As Long = -4108 Const xlBottom As Long = -4107 On Error GoTo err_handler Set rst = frm.RecordsetClone Set ApXL = CreateObject("Excel.Application") Set xlWBk = ApXL.Workbooks.Add ApXL.Visible = True Set xlWSh = xlWBk.Worksheets("Sheet1") #THESE TWO BLOCKS COPY THE DATA FROM THE SUBFORM# For Each fld In rst.Fields ApXL.ActiveCell = fld.Name ApXL.ActiveCell.Offset(0, 1).Select Next rst.MoveFirst xlWSh.Range("A2").CopyFromRecordset rst . . . Dim FirstColumn As Object Set FirstColumn = xlWSh.Columns(1) . . . 

但我会然后得到以下错误:编译错误:用户定义types没有定义这是奇怪的,因为经过一些研究,我已经注意到范围似乎是一个有效的数据types

你正在得到这个错误,因为Excel Range不是一个访问对象,而是一个Excel对象。 你将不得不将其定义为

 Dim NameColumn As oXl.Range 

oXL是您在应用程序中定义的Excel应用程序。

而设置范围,你不能使用

 NameColumn = Worksheet.Range("A:A") 

你必须使用Set这个词。 所以上面的代码更改为

 Set NameColumn = Worksheet.Range("A:A") 

要么

 Set NameColumn = Worksheet.Columns(1) 

跟进

我试过这个,它的工作原理

 Dim ApXL As Object, xlWBk As Object, xlWSh As Object, NameColumn As Object Set ApXL = CreateObject("Excel.Application") ApXL.Visible = True Set xlWBk = ApXL.Workbooks.Add Set xlWSh = xlWBk.Worksheets("Sheet1") Set NameColumn = xlWSh.Columns(1) 

为什么不使用子查询?

 AND NameField IN (SELECT NameField FROM [Sheet1$a1:a10]) 

或者为一个命名的范围:

 AND NameField IN (SELECT NameField FROM NameColumn) 

重新评论

 DoCmd.TransferSpreadsheet acLink, acSpreadsheetTypeExcel8, _ "Atable", "z:\docs\test.xls", True, "A1:A15" 

最后:

 SELECT * FROM Table1 WHERE ADate NOT IN ( SELECT SomeDate FROM [Excel 8.0;HDR=YES;DATABASE=Z:\Docs\Test2.xls].[Sheet1$a1:a4])