2016-02-26 57 views
0

我试图创建一个新的表格,其中源文件中的字段名称是一个变量。例如,在源数据ID领域可能是“ID”或“HB_REF_NO”,出生日期可能是DoBDate of BirthDate_of_birth在Access VBA中,找到字段名称,在列表中插入列

我做了搜索各种字段名称和返回列码他们在,但我挣扎着从这些列中的数据转移到一个表

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

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

此查询是否显示要插入'OriginalComp'的数据? - >'SELECT HB_REF_NO AS ID,姓,NC_DATE_OF_BIRTH AS DoB,POSTCODE FROM OriginalData' – HansUp

+0

我不知道如何检查。我之所以这样做的原因是因为这些文件通常会有不同的字段名称,所以一旦我得到这个排序,我将需要改变它,以便它搜索“出生日期”和“DoB “,例如 –

+0

在Access查询设计器中创建一个新的查询。切换到SQL视图。粘贴在'SELECT'语句中并运行查询。 – HansUp

回答

1

的问题是在这里:

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

感谢您的回答。我一直在向HansUp描述我的确切需求,他对我非常有帮助,所以我认为我已经整理好了,但我很感激你的时间。 –

2

这将是简单的检查源表的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场。

+1

谢谢你。我粘贴并检查了它,看起来很棒。它返回运行时错误3192,无法找到输出表原始压缩。我从我的代码中添加了创建表部分,并解决了它。非常感谢您的帮助! –

+0

对不起,我没有提到,但我认为你不需要每次都执行'CREATE TABLE OriginalComp',而你可以''删除OriginalComp'。但是,如果需要,您可以创建表格,或者使用“SELECT HB_REF_NO AS ID,Surname,NC_DATE_OF_BIRTH AS DoB,POSTCODE INTO OriginalComp FROM OriginalData”这样的“make table”查询。 .. INTO'语句只需要一步就可以创建所需数据的表格。 – HansUp