【问题标题】:In Access VBA, Find field name, insert column into table在 Access VBA 中,查找字段名称,将列插入表中
【发布时间】:2016-02-26 16:14:28
【问题描述】:

我正在尝试创建一个新表,其中源文件中的字段名称是一个变量。例如,源数据中的ID字段可以是“ID”或“HB_REF_NO”,出生日期可以是DoBDate of BirthDate_of_birth

我编写了一个代码来搜索各种字段名称并返回它们所在的列,但我正在努力将这些列中的数据传输到表中

这里是代码,请原谅它无疑是野蛮的方法......

Private Sub cmdCompare_Click()

Set db = CurrentDb()
Set RecordSet1 = db.OpenRecordset("OriginalData")
Dim Fld As DAO.Field
Dim FldArray() As String
Dim i As Integer
Dim j As Integer
Dim SQLCreate As String
Dim SQLInsert As String
Dim s As Integer
Dim d As Integer
Dim b As Integer
Dim p As Integer

j = RecordSet1.Fields.Count - 1
ReDim FldArray(j)

'Assigns field names to the array
For Each Fld In RecordSet1.Fields
    FldArray(i) = Fld.Name
    i = i + 1
Next

For i = 0 To j
    If FldArray(i) = "Surname" Then
        s = i
    Else
    End If
Next

For i = 0 To j
    If FldArray(i) = "HB_REF_NO" Then
        d = i
    Else
    End If
Next

For i = 0 To j
    If FldArray(i) = "NC_DATE_OF_BIRTH" Then
        b = i
    Else
    End If
Next

For i = 0 To j
    If FldArray(i) = "POSTCODE" Then
        p = i
    End If
Next


SQLCreate = "CREATE TABLE OriginalComp" & _
        "(ID varchar(255), Surname varchar(255), DoB varchar(255), Postcode varchar(255))"

DoCmd.RunSQL SQLCreate

SQLInsert = "INSERT INTO OriginalComp (ID, Surname, DoB, Postcode) " & _
      "VALUES ('" & FldArray(d) & "','" & FldArray(s) & "','" & FldArray(b) & "','" & FldArray(p) & "');"

DoCmd.RunSQL SQLInsert

End Sub

【问题讨论】:

  • 此查询是否显示您要插入到OriginalComp 的数据? -> SELECT HB_REF_NO AS ID, Surname, NC_DATE_OF_BIRTH AS DoB, POSTCODE FROM OriginalData
  • 不知道怎么查。我这样做的原因是因为文件通常有不同的字段名称,所以一旦我对这个进行了排序,我需要更改它,以便它同时搜索“出生日期”和“出生日期” ",例如
  • 在 Access 查询设计器中创建一个新查询。将其切换到 SQL 视图。粘贴SELECT 语句并运行查询。
  • HansUp,效果很好
  • 在这种情况下,将其转换为“追加查询”:INSERT INTO OriginalComp (ID, Surname, DoB, Postcode) SELECT HB_REF_NO, Surname, NC_DATE_OF_BIRTH, POSTCODE FROM OriginalData

标签: sql ms-access vba


【解决方案1】:

检查源表的TableDef.Fields 集合并找到每个变量字段名称的当前名称会更简单。您不需要以Recordset 的形式打开表格,也不需要使用数组。

本示例将查找并使用名称与*Dob**Date*Birth* 匹配的出生日期字段。 (如果表格中有多个字段可以匹配这些模式,则需要替换更具选择性的模式。)

Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Dim strDateOfBirth As String
Dim strInsert As String

Set db = CurrentDb
Set tdf = db.TableDefs("OriginalData")
For Each fld In tdf.Fields
    With fld
        If .Name Like "*DoB*" Or .Name Like "*Date*birth*" Then
            strDateOfBirth = .Name
        End If
    End With
Next

If Len(strDateOfBirth) > 0 Then
    strInsert = "INSERT INTO OriginalComp (ID, Surname, DoB, Postcode) " & _
        "SELECT HB_REF_NO, Surname, [" & strDateOfBirth & "], POSTCODE " & _
        "FROM OriginalData;"
    Debug.Print strInsert '<- inspect this in Immediate window; Ctrl+g will take you there
    db.Execute strInsert, dbFailOnError
Else
    MsgBox "Birth date field not found!"
End If

扩展该示例以处理 HB_REF_NOID 字段。

【讨论】:

  • 谢谢。我把它粘贴进去并检查它,看起来很棒。它返回运行时错误 3192,找不到输出表原始补偿。我从我的代码中添加了 Create Table 部分并解决了它。非常感谢您的帮助!
  • 抱歉,我没有提到这一点,但我认为您不需要每次都执行CREATE TABLE OriginalComp,而您可以只执行DELETE FROM OriginalComp。但是,如果需要,您可以像原始版本一样创建表……或者使用像SELECT HB_REF_NO AS ID, Surname, NC_DATE_OF_BIRTH AS DoB, POSTCODE INTO OriginalComp FROM OriginalData 这样的“制作表”查询……SELECT ... INTO 语句将在一步中创建包含所需数据的表。
【解决方案2】:

问题出在这里:

SQLInsert = "INSERT INTO OriginalComp (ID, Surname, DoB, Postcode) " & _
      "VALUES ('" & FldArray(d) & "','" & FldArray(s) & "','" & FldArray(b) & "','" & FldArray(p) & "');"

FldArray 变量是所有列名的列表,因此 dth 条目将是 dth 列名,这就是您插入列名而不是值的原因!

如果您想将这些值插入到 OriginalComp 中,为什么不这样做:

Private Sub cmdCompare_Click()

Set db = CurrentDb()

SQLCreate = "CREATE TABLE OriginalComp" & _
            "(ID varchar(255), Surname varchar(255), DoB varchar(255), Postcode varchar(255))"

DoCmd.RunSQL SQLCreate

SQLInsert = "INSERT INTO OriginalComp (ID, Surname, DoB, Postcode) " & _
            "SELECT HB_REF_NO, Surname, NC_DATE_OF_BIRTH, POSTCODE " & _
            "FROM OriginalData"

DoCmd.RunSQL SQLInsert

End Sub

【讨论】:

  • 感谢您的回答。我一直在向 HansUp 描述我的确切需求,他非常乐于助人,所以我想我已经整理好了,但我很感谢你的时间。
猜你喜欢
  • 2011-02-21
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 2018-01-24
  • 2023-04-03
  • 2011-03-19
  • 1970-01-01
相关资源
最近更新 更多