Vba 如果';x';匹配项';y';然后与现有文件合并,然后创建新文件

Vba 如果';x';匹配项';y';然后与现有文件合并,然后创建新文件,vba,ms-access,Vba,Ms Access,我需要从几个外部来源将“联系人”导入我的数据库 某些“联系人”可能已经存在,因此我只需要“新”数据 我已经编写了一个更新记录代码,但是它会覆盖所有数据,因此会破坏表的完整性,因为旧数据可能包含一些有效值 我尝试使用update/append查询,但是如果旧值仅为NULL/FALSE,这只会重写原始字段的值,而不会更新。问题是,它将应用/删除导致通信和数据使用的配置文件标志(更新不正确=可能违反GDPR)。 我不会用SQL编程,我知道函数是如何工作的,它们是做什么的,但不知道如何编译/什么顺序(还

我需要从几个外部来源将“联系人”导入我的数据库

某些“联系人”可能已经存在,因此我只需要“新”数据

我已经编写了一个更新记录代码,但是它会覆盖所有数据,因此会破坏表的完整性,因为旧数据可能包含一些有效值

我尝试使用update/append查询,但是如果旧值仅为NULL/FALSE,这只会重写原始字段的值,而不会更新。问题是,它将应用/删除导致通信和数据使用的配置文件标志(更新不正确=可能违反GDPR)。

我不会用SQL编程,我知道函数是如何工作的,它们是做什么的,但不知道如何编译/什么顺序(还没有),因此现在使用VBA

Dim myR As Recordset
Dim myR2 As Recordset

Set myR = CurrentDb.OpenRecordset("Staging - Import", dbOpenDynaset)
Set myR2 = CurrentDb.OpenRecordset("Contacts", dbOpenDynaset)

Do Until myR.EOF = True
    myR2.FindFirst ("Email = '" & myR![Email] & "'")
    If myR2.NoMatch = True Then
        myR2.AddNew
        myR2![Email] = myR![Email]
        myR2![First Name] = myR![First Name]
        myR2![Last Name] = myR![Last Name]
        myR2![Position] = myR![Position]
        myR2![Company] = myR![Company]
        myR2![Industry] = myR![Industry]
        myR2![Size] = myR![Size]
        myR2![Website] = myR![Website]
        myR2![Location] = myR![Location]
        myR2![Office Number] = myR![Office Number]
        myR2![Mobile Number] = myR![Mobile Number]
        myR2![Source] = myR![Source]
        myR2![CFO-DEL] = myR![CFO-DEL]
        myR2![CFO-SPON] = myR![CFO-SPON]
        myR2![DP-DEL] = myR![DP-DEL]
        myR2![DP-SPON] = myR![DP-SPON]
        myR2![HR-DEL] = myR![HR-DEL]
        myR2![HR-SPON] = myR![HR-SPON]
        myR2![CIO-DEL] = myR![CIO-DEL]
        myR2![CIO-SPON] = myR![CIO-SPON]
        myR2![CMO-DEL] = myR![CMO-DEL]
        myR2![CMO-SPON] = myR![CMO-SPON]
        myR2![CISO-DEL] = myR![CISO-DEL]
        myR2![CISO-SPON] = myR![CISO-SPON]
        myR2![NIS] = myR![NIS]
        myR2![Supress] = myR![Surpress]
        myR2.Update
    Else
        myR2.Edit
        myR2![First Name] = myR![First Name]
        myR2![Last Name] = myR![Last Name]
        myR2![Position] = myR![Position]
        myR2![Company] = myR![Company]
        myR2![Industry] = myR![Industry]
        myR2![Size] = myR![Size]
        myR2![Website] = myR![Website]
        myR2![Location] = myR![Location]
        myR2![Office Number] = myR![Office Number]
        myR2![Mobile Number] = myR![Mobile Number]
        myR2![Source] = myR![Source]
        myR2![CFO-DEL] = myR![CFO-DEL]
        myR2![CFO-SPON] = myR![CFO-SPON]
        myR2![DP-DEL] = myR![DP-DEL]
        myR2![DP-SPON] = myR![DP-SPON]
        myR2![HR-DEL] = myR![HR-DEL]
        myR2![HR-SPON] = myR![HR-SPON]
        myR2![CIO-DEL] = myR![CIO-DEL]
        myR2![CIO-SPON] = myR![CIO-SPON]
        myR2![CMO-DEL] = myR![CMO-DEL]
        myR2![CMO-SPON] = myR![CMO-SPON]
        myR2![CISO-DEL] = myR![CISO-DEL]
        myR2![CISO-SPON] = myR![CISO-SPON]
        myR2![NIS] = myR![NIS]
        myR2![Supress] = myR![Surpress]
        myR2.Update
    End If
    myR.MoveNext

Loop

Set myR = Nothing

End Sub
有没有更简单的方法来编写此代码,或者我应该使用代码

    myR2.FindFirst ("Email = '" & myR![Email] & "'")
    If myR2.NoMatch = True Then
对于每个值,有效地创建15-20个sub和一个宏一起运行

我尝试了几种代码变体,试图包括elseIf、isNull()和isFalse(),但它们总是无法编译,或者没有完成更新/记录发生更改

我需要代码来执行以下操作:

  • 检查“联系人”表中是否存在联系人

  • 如果联系人不存在,请添加所有数据

  • 如果联系人确实存在,请添加新数据或将“是/否”字段从“否”更新为“是”

  • 注意:当前“联系人”表为空,因为在将数据导入“联系人”表之前,我们需要创建新的/合并重复项

    因此,联系人目前:

        Email   Name    Surname
        -       -       -
        -       -       -
        -       -       -
        -       -       -
    
        Email   Name    Surname
        b@b.c   Brad    
        t@b.c   Tony    Tiger
        b@b.c   B       Pitt
        r@b.c   Ryan    Reynolds
    
    暂存-导入当前为:

        Email   Name    Surname
        -       -       -
        -       -       -
        -       -       -
        -       -       -
    
        Email   Name    Surname
        b@b.c   Brad    
        t@b.c   Tony    Tiger
        b@b.c   B       Pitt
        r@b.c   Ryan    Reynolds
    
    完成后,联系人应如下所示:

        Email   Name    Surname
        t@b.c   Tony    Tiger
        b@b.c   Brad    Pitt
        r@b.c   Ryan    Reynolds
    

    在比较字符串数据时,确定要更新或添加的内容可能非常复杂,通常需要逐案审查。在节目决定从一张唱片中选“布拉德”,从另一张唱片中选“皮特”时,应该应用什么规则?如果同一封电子邮件的数据是:
    Brad Pitt
    Bradley Pitt
    ?哪个是正确的,应该保存?可能必须执行查询,在暂存中查找重复的电子邮件,并根据具体情况决定如何修复/删除这些重复邮件。然后插入到联系人。插入代码可以测试每个字段的内容是否为Null或False,并确定是否接受新值

    对于非是/否字段,使用Nz()函数(假定文本字段不会有空字符串)
    myR2![名字]=Nz(myR2![名字],myR![名字])

    或(处理可能的空字符串)
    如果是myR2![名字]&“=”然后是myR2![名字]=迈尔![名字]

    (建议不要在文本字段中使用空字符串,也不要在表格设计中使用数字字段的默认值为零)

    对于yes/no字段,测试False(不要在表设计中设置DefaultValue属性):
    myR2![suppress]=IIf(myR2![suppress]=False,myR![suppress],True)


    如果是myR2![suppress]=错误,那么我的R2![suppress]=myR![超级用户]

    导入过程的较短代码。用上面的修改

    Do Until myR.EOF = True
        myR2.FindFirst ("Email = '" & myR![Email] & "'")
        If myR2.NoMatch = True Then
            myR2.AddNew
            myR2![Email] = myR![Email]
        Else
            myR2.Edit
        End If
        myR2![First Name] = myR![First Name]
        myR2![Last Name] = myR![Last Name]
        myR2![Position] = myR![Position]
        myR2![Company] = myR![Company]
        myR2![Industry] = myR![Industry]
        myR2![Size] = myR![Size]
        myR2![WebSite] = myR![WebSite]
        myR2![Location] = myR![Location]
        myR2![Office Number] = myR![Office Number]
        myR2![Mobile Number] = myR![Mobile Number]
        myR2![Source] = myR![Source]
        myR2![CFO-DEL] = myR![CFO-DEL]
        myR2![CFO-SPON] = myR![CFO-SPON]
        myR2![DP-DEL] = myR![DP-DEL]
        myR2![DP-SPON] = myR![DP-SPON]
        myR2![HR-DEL] = myR![HR-DEL]
        myR2![HR-SPON] = myR![HR-SPON]
        myR2![CIO-DEL] = myR![CIO-DEL]
        myR2![CIO-SPON] = myR![CIO-SPON]
        myR2![CMO-DEL] = myR![CMO-DEL]
        myR2![CMO-SPON] = myR![CMO-SPON]
        myR2![CISO-DEL] = myR![CISO-DEL]
        myR2![CISO-SPON] = myR![CISO-SPON]
        myR2![NIS] = myR![NIS]
        myR2![Supress] = myR![Supress]
    
        myR2.Update
    
        myR.MoveNext
    Loop
    
    另外,假设记录集具有完全相同的字段

    Dim myR As DAO.Recordset
    Dim myR2 As DAO.Recordset
    Dim fld As DAO.Field
    Set myR = CurrentDb.OpenRecordset("Staging - Import", dbOpenDynaset)
    Set myR2 = CurrentDb.OpenRecordset("Contacts", dbOpenDynaset)
    Do Until myR.EOF = True
        myR2.FindFirst "Email = '" & myR![Email] & "'"
        If myR2.NoMatch = True Then
            myR2.AddNew
            myR2![Email] = myR![Email]
        Else
            myR2.Edit
        End If
        For Each fld In myR.Fields
            If fld.Name <> "Email" And _
                    (myR2.Fields(fld.Name) & "" = "" Or myR2.Fields(fld.Name) = False) Then
                myR2.Fields(fld.Name) = fld
            End If
        Next
        myR2.Update
        myR.MoveNext
    Loop
    
    Dim myR作为DAO.Recordset
    将myR2设置为DAO.Recordset
    模糊fld为刀场
    Set myR=CurrentDb.OpenRecordset(“Staging-Import”,dbOpenDynaset)
    Set myR2=CurrentDb.OpenRecordset(“联系人”,dbOpenDynaset)
    直到myR.EOF=真
    myR2.FindFirst“Email=”&myR![电邮]&“
    如果myR2.NoMatch=True,则
    myR2.AddNew
    我的R2![电邮]=myR![电邮]
    其他的
    myR2.编辑
    如果结束
    对于myR.字段中的每个fld
    如果航班名称为“电子邮件”,并且_
    (myR2.Fields(fld.Name)&“=”或myR2.Fields(fld.Name)=False),然后
    myR2.Fields(fld.Name)=fld
    如果结束
    下一个
    myR2.更新
    下一个迈尔
    环
    
    在比较字符串数据时,确定要更新或添加的内容可能非常复杂,通常需要逐案审查。在节目决定从一张唱片中选“布拉德”,从另一张唱片中选“皮特”时,应该应用什么规则?如果同一封电子邮件的数据是:
    Brad Pitt
    Bradley Pitt
    ?哪个是正确的,应该保存?可能必须执行查询,在暂存中查找重复的电子邮件,并根据具体情况决定如何修复/删除这些重复邮件。然后插入到联系人。插入代码可以测试每个字段的内容是否为Null或False,并确定是否接受新值

    对于非是/否字段,使用Nz()函数(假定文本字段不会有空字符串)
    myR2![名字]=Nz(myR2![名字],myR![名字])

    或(处理可能的空字符串)
    如果是myR2![名字]&“=”然后是myR2![名字]=迈尔![名字]

    (建议不要在文本字段中使用空字符串,也不要在表格设计中使用数字字段的默认值为零)

    对于yes/no字段,测试False(不要在表设计中设置DefaultValue属性):
    myR2![suppress]=IIf(myR2![suppress]=False,myR![suppress],True)


    如果是myR2![suppress]=错误,那么我的R2![suppress]=myR![超级用户]

    导入过程的较短代码。用上面的修改

    Do Until myR.EOF = True
        myR2.FindFirst ("Email = '" & myR![Email] & "'")
        If myR2.NoMatch = True Then
            myR2.AddNew
            myR2![Email] = myR![Email]
        Else
            myR2.Edit
        End If
        myR2![First Name] = myR![First Name]
        myR2![Last Name] = myR![Last Name]
        myR2![Position] = myR![Position]
        myR2![Company] = myR![Company]
        myR2![Industry] = myR![Industry]
        myR2![Size] = myR![Size]
        myR2![WebSite] = myR![WebSite]
        myR2![Location] = myR![Location]
        myR2![Office Number] = myR![Office Number]
        myR2![Mobile Number] = myR![Mobile Number]
        myR2![Source] = myR![Source]
        myR2![CFO-DEL] = myR![CFO-DEL]
        myR2![CFO-SPON] = myR![CFO-SPON]
        myR2![DP-DEL] = myR![DP-DEL]
        myR2![DP-SPON] = myR![DP-SPON]
        myR2![HR-DEL] = myR![HR-DEL]
        myR2![HR-SPON] = myR![HR-SPON]
        myR2![CIO-DEL] = myR![CIO-DEL]
        myR2![CIO-SPON] = myR![CIO-SPON]
        myR2![CMO-DEL] = myR![CMO-DEL]
        myR2![CMO-SPON] = myR![CMO-SPON]
        myR2![CISO-DEL] = myR![CISO-DEL]
        myR2![CISO-SPON] = myR![CISO-SPON]
        myR2![NIS] = myR![NIS]
        myR2![Supress] = myR![Supress]
    
        myR2.Update
    
        myR.MoveNext
    Loop
    
    另外,假设记录集具有完全相同的字段

    Dim myR As DAO.Recordset
    Dim myR2 As DAO.Recordset
    Dim fld As DAO.Field
    Set myR = CurrentDb.OpenRecordset("Staging - Import", dbOpenDynaset)
    Set myR2 = CurrentDb.OpenRecordset("Contacts", dbOpenDynaset)
    Do Until myR.EOF = True
        myR2.FindFirst "Email = '" & myR![Email] & "'"
        If myR2.NoMatch = True Then
            myR2.AddNew
            myR2![Email] = myR![Email]
        Else
            myR2.Edit
        End If
        For Each fld In myR.Fields
            If fld.Name <> "Email" And _
                    (myR2.Fields(fld.Name) & "" = "" Or myR2.Fields(fld.Name) = False) Then
                myR2.Fields(fld.Name) = fld
            End If
        Next
        myR2.Update
        myR.MoveNext
    Loop
    
    Dim myR作为DAO.Recordset
    将myR2设置为DAO.Recordset
    模糊fld为刀场
    Set myR=CurrentDb.OpenRecordset(“Staging-Import”,dbOpenDynaset)
    Set myR2=CurrentDb.OpenRecordset(“联系人”,dbOpenDynaset)
    直到myR.EOF=真
    myR2.FindFirst“Email=”&myR![电邮]&“
    如果myR2.NoMatch=True,则
    myR2.AddNew
    我的R2![电邮]=myR![电邮]
    其他的
    myR2.编辑
    如果结束
    对于myR.字段中的每个fld
    如果航班名称为“电子邮件”,并且_
    (myR2.Fields(fld.Name)&“=”或myR2.Fields(fld.Name)=False),然后
    myR2.Fields(fld.Name)=fld
    如果结束
    下一个
    myR2.更新
    下一个迈尔
    环
    
    见此:谢谢