首页 > 解决方案 > 如何将一个名称标签连接到 Access VBA 中的多行

问题描述

我正在将 Excel 文件读取到 Access 表中,但我坚持通过以下方式对表进行规范化:

ALPHA
3110 JOT01E000004506 okt.
3110 JOT01E000004506 nov.
3110 JOT01E000004506 dec.
---empty row --
BETA
3112 JOT01E000004506 okt.
3112 JOT01E000004506 nov.
3112 JOT01E000004506 dec.

对此:

ALPHA 3110 JOT01E000004506 okt.
ALPHA 3110 JOT01E000004506 nov.
ALPHA 3110 JOT01E000004506 dec.
BETA  3112 JOT01E000004506 okt.
BETA  3112 JOT01E000004506 nov.
BETA  3112 JOT01E000004506 dec.

标签: excelvbams-access

解决方案


主要问题是 MS Access 将数据视为无序集,除非order by在查询中使用子句另行指定。

因此,当将数据从外部文件导入 MS Access 表时,您不能依赖结果表中的记录顺序与源文件中的记录顺序相匹配。

因此,与您的情况一样,如果您的数据完全取决于在数据集中遇到某些标识符行的顺序,我建议使用 VBA 依次遍历 Excel 电子表格中的每一行,测试是否存在'identifier' 行并将其值分配给变量,然后将每个单独的记录添加到目标表中。

以下是此类计划的大纲草案:

Function ImportData(strXLS As String)

    Dim dbsCdb As DAO.Database
    Dim rstRs1 As DAO.Recordset

    Dim xlsApp As Excel.Application
    Dim lngRow As Long
    Dim strTag As String
    Dim strTmp As String

    Set xlsApp = New Excel.Application
    Set dbsCdb = CurrentDb
    Set rstRs1 = dbsCdb.OpenRecordset("Table1")

    With xlsApp
        With .Workbooks.Open(strXLS)
            With .Worksheets("Sheet1")
                strTag = .Cells(1, 1)
                lngRow = 2
                Do Until strTag = vbNullString
                    strTmp = .Cells(lngRow, 1)
                    If strTmp = vbNullString Then
                        lngRow = lngRow + 1
                        strTag = .Cells(lngRow, 1)
                    Else
                        rstRs1.AddNew
                        rstRs1("Tag") = strTag
                        rstRs1("Field1") = .Cells(lngRow, 2)
                        rstRs1("Field2") = .Cells(lngRow, 3)
                        rstRs1("Field3") = .Cells(lngRow, 4)
                        rstRs1.Update
                    End If
                    lngRow = lngRow + 1
                Loop
            End With
            .Close
        End With
        .Quit
    End With

    rstRs1.Close
    Set rstRs1 = Nothing
    Set dbsCdb = Nothing
    Set xlsApp = Nothing
End Function

一些先决条件:

  • 添加对的引用Microsoft Excel ##.0 Object Library
  • Excel 数据保存在名为Sheet1
  • 第一个“标签”出现在单元格中A1
  • 目标访问表被调用Table1
  • MS AccessTable1包含 4 个字段:TagField1Field2Field3

提供 Excel 工作簿的路径,例如:

ImportData "C:\YourExcelFile.xlsx"

推荐阅读