目前,我在Access上有一个表单,用于过滤子表单中的记录,并在单击按钮时创建包含第一张表单上数据的Excel文档。我在后续工作表上进行了一系列其他计算,但我只需要在第一张工作表的“名称”列中已存在“名称”字段的条目中进行这些计算。其他计算是通过SQL语句完成的。
我的思维过程是做类似的事情:
SELECT (various fields) FROM (query name) WHERE (first couple of where statements) AND NameField IN NameColumn
其中NameField是name元素,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)
.
.
.
答案 0 :(得分:2)
但我会收到以下错误: 编译错误: 用户定义的类型未定义 这是奇怪的,因为经过一些研究后我发现Range似乎是一个有效的数据类型
您收到该错误是因为Excel Range
不是Access对象而是Excel对象。您必须将其定义为
Dim NameColumn As oXl.Range
oXL是您在App中定义的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)
答案 1 :(得分: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])