2012-07-10 52 views
2

目前我在Access上有一个窗体过滤来自子窗体的记录,并在单击按钮时在第一个窗体上创建一个带有数据的Excel文档。我在后续工作表中发生了一系列其他计算,但是我只需要它们针对第一个工作表上“名称”列中已存在“名称”字段的条目。其他计算是通过SQL语句完成的。如何将整个Excel列分配给Access中VBA中的变量?

我的思维过程是做这样的事情:

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

如果名称字段将是name元素和名称列将整列。我试图用多种方式创建这个变量而没有成功。例如,我尝试过的一件事是在正确的实例中循环添加“(”,“,”和“)”的记录,但字符串太长,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 

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

编辑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

现在这个问题包含两个完全不同的两个问题完全不同的答案,所以它真的应该分裂。请确定您想要的问题的哪一部分,Excel自动化或Access SQL,然后答案可以与问题相关。 – Fionnuala 2012-07-11 13:11:31

回答

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]) 
+0

这实际上是我遇到麻烦的部分。我假设两个NameFields不同,因为第二个NameField特别对应于[Sheet1 $ a1:a10]/NameColumn,对吧?无论如何,我无法让这些工作。 对于第一个,第二个NameField应该是什么?我刚刚尝试过: AND NameField IN(Worksheet.Range(“A1:A10”)) 因为我想不出会是什么,但是这给了我一个“类型错误”的错误。 此外,在你的第二个例子中,NameColumn将是一个子表单,所以它给了我错误,因为我认为它期望一个表或查询。 – KryptKeeper 2012-07-10 14:24:58

+0

我从编辑中看到,您正在尝试使用Excel实例,但这不是查询的方式。您可以将范围或命名范围连接为表格,并像处理任何Access表格那样使用它,或多或少。您还可以编写一个在Excel中引用范围的查询。你的大纲查询是否使用Excel或Access? – Fionnuala 2012-07-10 16:03:11

+0

哇,我不知道甚至有可能将范围转换成表格。我现在正在研究这个问题,但是你有没有什么有用的链接可以很难找到这样的事情?对不起,“大纲查询”是什么意思?如果这就是你的意思,我在Access中完成大部分工作。 – KryptKeeper 2012-07-10 16:13:12

2

but I would then get the following error: Compile Error: User-defined type not defined which is weird since after some research I've noticed Range seems to be a valid datatype

你是得到该错误是因为Excel Range不是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) 
+0

嗨,谢谢你的回应!它没有工作,但我感觉比以前更接近。我定义的Excel应用程序是:“ApXL”。尝试做你说的话(Dim NameColumn As ApXL.Range)后,我仍然得到相同的错误。但是,如果我尝试注释掉该代码,但仍然保留[Set NameColumn = Worksheet.Columns(1)],我得到的错误是:“应用程序定义或对象定义的错误”,这让我觉得有一种不同的方式定义将使其工作的范围。有任何想法吗? – KryptKeeper 2012-07-10 15:30:40

+0

你能分享你定义包括'Worksheet'在内的Excel对象的代码吗?您可以编辑您的问题并将代码粘贴到那里。 – 2012-07-10 15:31:48

+0

当然,我刚添加它 – KryptKeeper 2012-07-10 15:43:20