【问题标题】:How can you assign an entire Excel column to a variable inside VBA on Access?如何在 Access 上将整个 Excel 列分配给 VBA 内的变量?
【发布时间】:2023-03-29 09:05:01
【问题描述】:

目前,我在 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)
. 
.
.

【问题讨论】:

  • 这个问题现在包含两个完全不同的问题和两个完全不同的答案,所以它真的应该被拆分。请在此处确定您想要问题的哪一部分,Excel 自动化或 Access SQL,然后答案可能与问题相关。

标签: sql forms excel ms-access vba


【解决方案1】:

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

您收到该错误是因为 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)

【讨论】:

  • 您好,感谢您的回复!它并没有完全起作用,但我感觉比以前更接近了。我定义的 Excel 应用程序是:“ApXL”。在尝试按照您所说的进行操作后(Dim NameColumn As ApXL.Range),我仍然遇到同样的错误。但是,如果我尝试注释掉该代码但仍然保持 [Set NameColumn = Worksheet.Columns(1)] 不变,我得到的错误是:“应用程序定义的或对象定义的错误”,这让我认为有一种不同的方法定义可以使这项工作的范围。有什么想法吗?
  • 您能否分享定义 Excel 对象的代码,包括Worksheet。您可以编辑您的问题并将代码粘贴到那里。
  • 在使用 LateBinding 时将 Set NameColumn = Worksheet.Columns(1) 更改为 Set NameColumn = xlWSh.Columns(1) 并将 Dim NameColumn As oXl.Range 更改为 Dim NameColumn As Object
  • 谢谢,哈哈,但我的代码实际上并没有使用 Worksheet.Columns(1),它使用 xlWSh.Columns(1),我只是这样做了,这样会更清楚。我将 NameColumn 的定义更改为一个对象,但它只是给了我“应用程序定义的或对象定义的错误”。另外,我只想提一下,我非常感谢您的帮助:)
  • 我现在正在尝试一种完全不同的方法,只是想看看我是否可以通过将工作表函数应用于该列来选择整个列。例如,我正在尝试将变量设置为: [WorksheetFunction.Match(xlWSh.Range("A3"), xlWSh.Columns(1), 0)] 以查看是否可以得到正确的答案,但我是收到“需要对象”错误。任何想法为什么会这样?
【解决方案2】:

为什么不使用子查询?

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

【讨论】:

  • 这实际上是我遇到问题的部分。我假设这两个 NameField 不一样,因为第二个专门对应于 [Sheet1$a1:a10]/NameColumn,对吗?无论如何,我无法让其中任何一个工作。对于第一个,第二个 NameField 应该是什么?我刚试过: AND NameField IN (Worksheet.Range("A1:A10")) 因为我想不出它会是什么,但这给了我一个“类型不匹配”错误。另外,在您的第二个示例中, NameColumn 将是一个子表单,因此它给了我错误,因为我认为它需要一个表或查询。
  • 我从您的编辑中看到您正在尝试使用 Excel 实例,这不是查询的方式。您可以将范围或命名范围连接为表,并或多或少地像使用任何 Access 表一样使用它。您还可以编写引用 Excel 中的范围的查询。您的大纲查询使用 Excel 还是 Access?
  • 哇,我不知道甚至可以将范围转换为表格。我现在要研究一下,但是你有什么有用的链接很难找到关于做这样的事情吗?抱歉,“大纲查询”是什么意思?如果这就是你的意思,我的大部分工作都是在 Access 中完成的。
  • 您可以通过菜单上的 Get External data 或 TransferSpreadsheet 链接。
  • 我唯一担心的是,在我编写代码时该文档还不存在。我的表单有一个按钮,可以创建一个 Excel 电子表格,然后用户可以根据需要保存它,但它不会立即保存,所以我不确定我可以指向 .xls 文件位置的位置。
猜你喜欢
  • 1970-01-01
  • 2019-08-11
  • 2017-10-20
  • 1970-01-01
  • 2015-12-06
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多