2

目前,我在 Access 上有一个表单,该表单从子表单中过滤记录,并在单击按钮时在第一张表上创建包含数据的 Excel 文档。我有一堆其他计算发生在后续工作表上,但我需要它们只发生在第一张工作表的“名称”列中已经存在“名称”字段的条目中。其他计算通过 SQL 语句完成。

我的思考过程是做类似的事情:

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

其中 NameField 将是名称元素,而 NameColumn 将是整个列。我尝试以多种方式创建此变量,但均未成功。例如,我尝试的一件事是循环遍历记录,在正确的实例中添加“(”、“、”和“)”,但字符串太长,Access 不会运行它。我也尝试只定义变量,如:

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

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

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

等等,但所有这些似乎只指该列的第一个条目。我已经尝试过研究解决方案,但我也没有发现任何有用的东西。有人知道我会如何处理这样的事情吗?

编辑:我可能还应该提到,我认为我只是使用这些方法获得第一个条目,因为 NameColumn 没有事先定义为任何东西。但我试着做:

Dim NameColumn As Range

但我会收到以下错误:

Compile Error:
User-defined type not defined

这很奇怪,因为经过一些研究我注意到 Range 似乎是一个有效的数据类型

编辑 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)
. 
.
.
4

2 回答 2

2

但我会收到以下错误:编译错误:未定义用户定义的类型,这很奇怪,因为经过一些研究,我注意到 Range 似乎是一个有效的数据类型

您收到该错误是因为 ExcelRange不是 Access 对象,而是 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)
于 2012-07-10T14:43:54.447 回答
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])
于 2012-07-10T14:08:05.210 回答