微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

VBA 使用索引 对于这篇冗长的帖子,我深表歉意,但简而言之,我的问题是这个 (tldr):

如何解决VBA 使用索引 对于这篇冗长的帖子,我深表歉意,但简而言之,我的问题是这个 (tldr):

对于这篇冗长的帖子,我深表歉意,但简而言之,我的问题是这个 (tldr):

如何通过索引而不是名称循环访问访问字段名称

上下文: 我正在尝试从一堆来自各种不同来源的 Excel 工作表中为大量制造的塑料零件构建一个检查数据的 Access 数据库。我使用两个 Access 文件执行此操作:一个作为前端/UI(表单和宏),另一个作为后端(包含所需数据的表)。我的流程结构如下:

  1. 使用前端访问表单打开 msoFileDialogFilePicker 并选择一个 Excel 数据表以读取到我的后端访问表中。后端文件中存储数据的表取决于前端文件表单中的单选按钮选择。
  2. 宏从 Excel 工作表中读取数据,转置数据,并将其存储在原始数据文件末尾的新 dumpSheet 中。此 dumpSheet 中的每一行实际上都是其在相应后端 Access 表中的记录。数据实际上是使用 DAO.DatabaseDAO.Recordset 读入后端访问表的。
  3. 使用每两周从公司获得的新检查数据重复此过程。

检验数据来自不同的来源,但可以针对同一个塑料部件,也可以针对不同部件。公司 + 部分的这种组合决定了哪些字段需要读入记录集中。例如,所有这些组合都会有不同的字段(每个组合都有自己的表),但是每个组合每两周都会有新的检查数据(因此需要一个 db):

  • X 公司 + A 部分
  • X 公司 + B 部分
  • Y 公司 + A 部分
  • Y 公司 + B 部分

以下是我目前如何在 Access 前端表单宏中进行设置的一般情况(do while 循环中列出的字段用于一个特定的公司 + 部件组合:

Set excelTemp = New Excel.Application
excelTemp.Visible = True
excelTemp.displayAlerts = True
Set trExcelWB = excelTemp.Workbooks.Open("myExcelData.xlsx")  'Picked from msoDialogFilePicker

Dim ws As Worksheet
Set ws = trExcelWB.Sheets(Sheets.Count)

Dim dbDump As DAO.Database
Set dbDump = DBEngine.Workspaces(0).OpenDatabase("backend-database.accdb")

Dim dumpTable as String
dumpTable = "myTableForDataInBackEndDB"

Dim tdf As DAO.TableDef
Set tdf = dbDump.TableDefs(dumpTable)

Dim rst As DAO.Recordset
Set rst = dbDump.OpenRecordset(Name:=dumpTable)

With rst
    .AddNew
    Dim n as Integer
    n = 2
    
    do while Len(ws.Cells(n,5).Value) > 0  '5th column of dumpSheet stores unique part IDs and governs end of my dataset on the dumpSheet
        .AddNew
                
        ![Date of inspection] = ws.Cells(n,2).Value
        ![Date of Production] = ws.Cells(n,3).Value
        ![LOT] = ws.Cells(n,4).Value
        ![Serial] = ws.Cells(n,5).Value
        ![Part] = ws.Cells(n,6).Value
               
        ![Depth] = ws.Cells(n,7).Value
        ![Wall thickness] = ws.Cells(n,8).Value

        .Update

        n = n + 1

    Loop

我有的情况下,这很好用:

检验日期
生产日期
很多
系列
部分
深度
壁厚

作为我的字段名称。这些只是我的标题中的一种。

问题:如果我能在我的 do while 循环中做这样的事情,我会很高兴:

do while Len(ws.Cells(n,5).Value) > 0

    Dim col as Integer
    For col = 2 To ws.UsedRange.Columns.Count
        .AddNew
        ![dbDump.TableDefs(dumpTable).Fields(col - 1).Name] = ws.Cells(n,col).Value
    Next col

    .Update

    n = n + 1

Loop

如果我在 VBA 中尝试此操作,我会收到一个错误消息,提示“未在集合中找到项目”,所以我知道此代码不起作用,但这是我在自己脑海中看到的工作方式。我特别困惑,因为我知道 dbDump.TableDefs(dumpTable).Fields(col - 1).Name 本身给了我想要的字段名称作为字符串,但我不知道如何在 {{ 1}} 来自此代码

所以,再一次,正如我一开始(有点讨厌)用大字体写的那样:我该怎么做?我看了高低,不知道如何通过索引而不是名称循环遍历字段名称

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。