O Código completo, sugestões serão bem vindas..
Caso possível alguem se habilite a transformarmos isto em função....
Private Sub btnImportar_Click()
On Error GoTo Trataerro
'Criado por Harysohn Pina em 10 de Dezembro de 2012
'Fórum Maximo Access
'*******************************************************************************
'Popula o recordset com os dados importados para posterior comparação
'*******************************************************************************
Dim dbImport As DAO.Database
Dim RsImport As DAO.Recordset, RsLocal As DAO.Recordset, RsTab As DAO.Recordset
Dim Msg As String
Dim StrSQLLocal As String, StrSQLImport As String
Dim X As Integer, LInha As Integer, NumCampos As Integer
Dim Y As Long
Dim NomeTabela As String
Dim N As Integer, Z As Integer, Count As Integer
Dim StrWhere1 As String, StrWhere2 As String, StrWhere3 As String
Dim NomeTabelaImp As String
Dim Coluna1 As String, Coluna2 As String, Coluna3 As String
'--------------------------------------------------------------
'Para aviso ao usuário
Me.RecebeFoco.SetFocus
Me.btnImportar.Enabled = False
Screen.MousePointer = 11
Me.lbAviso.Caption = "Aguarde, a operação está em andamento!"
Me.lbAviso.Visible = True
Pause (2) 'Funcão que provoca pausa na execução do código
'--------------------------------------------------------------
'Aqui faço um loop pela lista e a cada loop atualiza a tabela selecionada
For Count = 0 To Me.lstObjects.ListCount - 1
If Me.lstObjects.Selected(Count) Then
'Aplico o nome da tabela selecionada na lista à variável
NomeTabelaImp = Me.lstObjects.Column(0, Count)
Else
GoTo Continua
End If
'Carrega o a variável com a SQL da tabela (Tabela Local)
StrSQLLocal = "SELECT * From " & NomeTabelaImp & ""
'Seta a variável dbImport com o banco externo
Set dbImport = OpenDatabase(PastaBD & Arquivo, False, False, "MS Access;PWD=senha")
'Carrega o Recordset com os dados da tabela no bd local
Set RsLocal = CurrentDb.OpenRecordset(StrSQLLocal)
'Set RsTab = CurrentDb.OpenRecordset("Select * From TbNomeTabelas")
'==========================================================================================
'Checo a quantidade de Campos para o RsLocal, direcionando ao Case específico
Select Case RsLocal.Fields.Count
'==========================================================================================
'Nesta situação a tabela possui dois campos, e serão checados o primeiro (Campo Código)
'e o segundo campo que poderá ser do tipo: Numero,texto ou Data
Case Is = 2
'Faz um loop pela tabela local para colocar na variável StrWhere
'Os códigos dos registros da tabela
Do While Not RsLocal.EOF
'Ordem das colunas por tipo de dados
'Numero,Texto
If RsLocal(0).Type = 4 And RsLocal(1).Type = 10 Then
StrWhere1 = StrWhere1 & "," & "'" & Nz(RsLocal(0), "") & "'" 'Numero
StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(1), "") & "'" 'Texto
'Ordem das colunas por tipo de dados
'Numero,Numero
ElseIf RsLocal(0).Type = 4 And RsLocal(1).Type = 4 Then
StrWhere1 = StrWhere1 & "," & "'" & Nz(RsLocal(0), "") & "'" 'Numero
StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(1), "") & "'" 'Numero
'Ordem das colunas por tipo de dados
'Numero,Data
ElseIf RsLocal(0).Type = 4 And RsLocal(1).Type = 8 Then
StrWhere1 = StrWhere1 & "," & "'" & Nz(RsLocal(0), "") & "'" 'Numero
StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(1), "") & "'" 'Data
End If
RsLocal.MoveNext
Loop
'Adiciono o nome das colunas à variável
Coluna1 = RsLocal(0).Name
Coluna2 = RsLocal(1).Name
'Retiro a última virgula da variável
StrWhere1 = Mid(StrWhere1, 2)
StrWhere2 = Mid(StrWhere2, 2)
'o Recordset RsImport será carregado apenas com os registros dos campos 0 e 1
StrSQLImport = "SELECT * From " & NomeTabelaImp & " Where " & Coluna1 & " Not in (" & StrWhere1 & ") And " & Coluna2 & " Not in (" & StrWhere2 & ")"
Set RsImport = dbImport.OpenRecordset(StrSQLImport)
RsImport.MoveLast
RsImport.MoveLast
'==========================================================================================
'Nesta situação a tabela possui dois campos, e serão checados o primeiro (Campo Código)
'e o segundo campo que poderá ser do tipo: Numero,texto ou Data
Case Is = 3
'Faz um loop pela tabela local para colocar na variável StrWhere
'Os códigos dos registros da tabela
Do While Not RsLocal.EOF
'Ordem das colunas por tipo de dados
'Numero,Texto,Texto
If RsLocal(0).Type = 4 And RsLocal(1).Type = 10 And RsLocal(2).Type = 10 Then
StrWhere1 = StrWhere1 & "," & Nz(RsLocal(0), "") 'Numero
StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(1), "") & "'" 'Texto
StrWhere3 = StrWhere3 & "," & "'" & Nz(RsLocal(2), "") & "'" 'Texto
'Ordem das colunas por tipo de dados
'Numero,Numero,Texto
ElseIf RsLocal(0).Type = 4 And RsLocal(1).Type = 4 And RsLocal(2).Type = 10 Then
StrWhere1 = StrWhere1 & "," & Nz(RsLocal(0), "") 'Numero
StrWhere2 = StrWhere2 & "," & Nz(RsLocal(1), "") 'Numero
StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(2), "") & "'" 'Texto
'Ordem das colunas por tipo de dados
'Numero,Texto,Numero
ElseIf RsLocal(0).Type = 4 And RsLocal(1).Type = 10 And RsLocal(2).Type = 4 Then
StrWhere1 = StrWhere1 & "," & Nz(RsLocal(0), "") 'Numero
StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(1), "") & "'" 'Texto
StrWhere3 = StrWhere2 & "," & Nz(RsLocal(2), "") 'Numero
'Ordem das colunas por tipo de dados
'Numero,Texto,Data
ElseIf RsLocal(0).Type = 4 And RsLocal(1).Type = 10 And RsLocal(2).Type = 8 Then
StrWhere1 = StrWhere1 & "," & Nz(RsLocal(0), "") 'Numero
StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(1), "") & "'" 'Texto
StrWhere3 = StrWhere3 & "," & "#" & Format(Nz(RsLocal(2), ""), "mm/dd/yyyy") & "#" 'Data
'Ordem das colunas por tipo de dados
'Numero,Data,Texto
ElseIf RsLocal(0).Type = 4 And RsLocal(1).Type = 8 And RsLocal(2).Type = 10 Then
StrWhere1 = StrWhere1 & "," & Nz(RsLocal(0), "") 'Numero
StrWhere2 = StrWhere2 & "," & "#" & Format(Nz(RsLocal(1), ""), "mm/dd/yyyy") & "#" 'Data
StrWhere3 = StrWhere3 & "," & "'" & Nz(RsLocal(2), "") & "'" 'Texto
'Ordem das colunas por tipo de dados
'Numero,Data,Numero
ElseIf RsLocal(0).Type = 4 And RsLocal(1).Type = 8 And RsLocal(2).Type = 4 Then
StrWhere1 = StrWhere1 & "," & Nz(RsLocal(0), "") 'Numero
StrWhere2 = StrWhere2 & "," & "#" & Format(Nz(RsLocal(1), ""), "mm/dd/yyyy") & "#" 'Data
StrWhere3 = StrWhere3 & "," & Nz(RsLocal(2), "") 'Numero
'Ordem das colunas por tipo de dados
'Numero,Numero, Data
ElseIf RsLocal(0).Type = 4 And RsLocal(4).Type = 8 And RsLocal(2).Type = 8 Then
StrWhere1 = StrWhere1 & "," & Nz(RsLocal(0), "") 'Numero
StrWhere2 = StrWhere2 & "," & Nz(RsLocal(1), "") 'Numero
StrWhere3 = StrWhere3 & "," & "#" & Format(Nz(RsLocal(2), ""), "mm/dd/yyyy") & "#" 'Data
End If
RsLocal.MoveNext
Loop
'Adiciono o nome das colunas à variável
Coluna1 = RsLocal(1).Name
Coluna2 = RsLocal(2).Name
Coluna3 = RsLocal(3).Name
'Retiro a última virgula da variável
StrWhere1 = Mid(StrWhere1, 2)
StrWhere2 = Mid(StrWhere2, 2)
StrWhere3 = Mid(StrWhere3, 2)
'o Recordset RsImport será carregado apenas com os registros dos campos 0, 1 e 2
StrSQLImport = "SELECT * From " & NomeTabelaImp & " Where " & Coluna1 & " Not in (" & StrWhere1 & ") And " & Coluna2 & " Not in (" & StrWhere2 & ") And " & Coluna3 & " Not in (" & StrWhere3 & ")"
Set RsImport = dbImport.OpenRecordset(StrSQLImport)
RsImport.MoveLast
RsImport.MoveLast
'==========================================================================================
'Nesta situação a tabela possui dois campos, e serão checados o primeiro (Campo Código)
'e o segundo campo que poderá ser do tipo: Numero,texto ou Data
Case Else
'Faz um loop pela tabela local para colocar na variável StrWhere
'Os códigos dos registros da tabela
Do While Not RsLocal.EOF
'Ordem das colunas por tipo de dados
'Texto,Texto,Texto
If RsLocal(1).Type = 10 And RsLocal(2).Type = 10 And RsLocal(3).Type = 10 Then
StrWhere1 = StrWhere1 & "," & "'" & Nz(RsLocal(1), "") & "'" 'Texto
StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(2), "") & "'" 'Texto
StrWhere3 = StrWhere3 & "," & "'" & Nz(RsLocal(3), "") & "'" 'Texto
'Ordem das colunas por tipo de dados
'Texto,Texto,Data
ElseIf RsLocal(1).Type = 10 And RsLocal(2).Type = 10 And RsLocal(3).Type = 8 Then
StrWhere1 = StrWhere1 & "," & "'" & Nz(RsLocal(1), "") & "'" 'Texto
StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(2), "") & "'" 'Texto
StrWhere3 = StrWhere3 & "," & "#" & Format(Nz(RsLocal(3), ""), "mm/dd/yyyy") & "#" 'Data
'Ordem das colunas por tipo de dados
'Numero,Texto,Texto
ElseIf RsLocal(1).Type = 4 And RsLocal(2).Type = 10 And RsLocal(3).Type = 10 Then
StrWhere1 = StrWhere1 & "," & Nz(RsLocal(1), "") 'Numero
StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(2), "") & "'" 'Texto
StrWhere3 = StrWhere3 & "," & "'" & Nz(RsLocal(3), "") & "'" 'Texto
'Ordem das colunas por tipo de dados
'Numero,Numero,Texto
ElseIf RsLocal(1).Type = 4 And RsLocal(2).Type = 10 And RsLocal(3).Type = 10 Then
StrWhere1 = StrWhere1 & "," & Nz(RsLocal(1), "") 'Numero
StrWhere1 = StrWhere1 & "," & Nz(RsLocal(1), "") 'Numero
StrWhere3 = StrWhere3 & "," & "'" & Nz(RsLocal(3), "") & "'" 'Texto
'Ordem das colunas por tipo de dados
'Numero,Texto,Data
ElseIf RsLocal(1).Type = 4 And RsLocal(2).Type = 10 And RsLocal(3).Type = 10 Then
StrWhere1 = StrWhere1 & "," & Nz(RsLocal(1), "") 'Numero
StrWhere2 = StrWhere2 & "," & "'" & Nz(RsLocal(2), "") & "'" 'Texto
StrWhere3 = StrWhere3 & "," & "#" & Format(Nz(RsLocal(3), ""), "mm/dd/yyyy") & "#" 'Data
'Ordem das colunas por tipo de dados
'Data, Data,Numero
ElseIf RsLocal(1).Type = 4 And RsLocal(2).Type = 10 And RsLocal(3).Type = 10 Then
StrWhere1 = StrWhere1 & "," & "#" & Format(Nz(RsLocal(2), ""), "mm/dd/yyyy") & "#" 'Data
StrWhere2 = StrWhere2 & "," & "#" & Format(Nz(RsLocal(1), ""), "mm/dd/yyyy") & "#" 'Data
StrWhere3 = StrWhere3 & "," & Nz(RsLocal(3), "") 'Numero
'Ordem das colunas por tipo de dados
'Data, Numro,Numero
ElseIf RsLocal(1).Type = 4 And RsLocal(2).Type = 10 And RsLocal(3).Type = 10 Then
StrWhere1 = StrWhere1 & "," & "#" & Format(Nz(RsLocal(2), ""), "mm/dd/yyyy") & "#" 'Data
StrWhere2 = StrWhere2 & "," & Nz(RsLocal(2), "") 'Numero
StrWhere3 = StrWhere3 & "," & Nz(RsLocal(3), "") 'Numero
End If
RsLocal.MoveNext
Loop
'Adiciono o nome da coluna à variável
Coluna1 = RsLocal(1).Name
Coluna2 = RsLocal(2).Name
Coluna3 = RsLocal(3).Name
'Retiro a última virgula da variável
StrWhere1 = Mid(StrWhere1, 2)
StrWhere2 = Mid(StrWhere2, 2)
StrWhere3 = Mid(StrWhere3, 2)
'o Recordset RsImport será carregado apenas com os registros dos campos 1, 2 e 3
StrSQLImport = "SELECT * From " & NomeTabelaImp & " Where " & Coluna1 & " Not in (" & StrWhere1 & ") And " & Coluna2 & " Not in (" & StrWhere2 & ") And " & Coluna3 & " Not in (" & StrWhere3 & ")"
Set RsImport = dbImport.OpenRecordset(StrSQLImport)
RsImport.MoveLast
RsImport.MoveLast
End Select
'========================================================================================================================================================================================================
'Se a contagem do RsImport for 0 é porque as tabelas tem o mesmo numero de registros
'e não precisa ser atualizada
If RsImport.RecordCount = 0 Then
MsgBox "Não há registros a serem importados" _
& "na tabela " & NomeTabelaImp & "", vbInformation, "ATENÇÃO"
GoTo Continua
Else
RsImport.MoveLast
RsImport.MoveFirst
'continua o código
NumCampos = RsImport.Fields.Count
Do While Not RsImport.EOF
RsLocal.AddNew
For Z = 0 To (NumCampos - 1)
RsLocal.Fields(Z) = RsImport.Fields(Z)
Next Z
RsLocal.Update
RsImport.MoveNext
Loop
MsgBox "Registros da tabela: " & NomeTabelaImp & " importados com sucesso", vbInformation, "PRONTO"
RsLocal.Close
RsImport.Close
End If
Continua:
'Limpa a variável para receber os códigos da outra tabela
StrWhere1 = ""
StrWhere2 = ""
StrWhere3 = ""
'Aqui vai para a próxima tabela
Next
'--------------------------------------------------------------
'Para aviso ao usuário
Me.lbAviso.Caption = "Operação Concluida!"
Pause (3)
Screen.MousePointer = 0
Me.lbAviso.Visible = False
Me.btnImportar.Enabled = True
'--------------------------------------------------------------
'Tratamento de Erros
Exit Sub
Exit_TrataErro:
DoCmd.Hourglass False
DoCmd.Echo True
Exit Sub
Trataerro:
If Err.Number = 3024 Then
MsgBox "Não foi encontrado o Banco de Dados no Caminho Indicado!", vbCritical, "ERRO"
Exit Sub
ElseIf Err.Number = 3021 Then
Resume Next
ElseIf Err.Number = 3131 Then
MsgBox "Não fora selecionado nenhuma tabela", vbCritical, "ATENÇÃO"
Else
DoCmd.Hourglass False
DoCmd.Echo True
Msg = "Erro # " & Str(Err.Number) & " gerado na " & Err.Source _
& vbNewLine & vbNewLine & "Descrição: " & Err.Description _
& vbNewLine & vbNewLine & "Por favor contate o Administrador de Sistema."
MsgBox Msg, vbMsgBoxHelpButton vbCritical, "Erro", Err.HelpFile, Err.HelpContext
Resume Exit_TrataErro
End If
End Sub
Cumprimentos.