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