Double Comparaison colonne

Résolu/Fermé
TintinU2 - 20 oct. 2015 à 16:42
TintinU2 Messages postés 79 Date d'inscription lundi 26 octobre 2015 Statut Membre Dernière intervention 8 juillet 2016 - 26 oct. 2015 à 12:24
Bonjour à tous,

Je souhaiterai faire une comparaison de colonne:
Dans ma feuille 1("Extraction"), j'ai un numéro qui est unique dans ma colonne B et une date et heure dans ma colonne M

Extraction
Col B - Col M - ligne
"25789" - "18/10/2015 10:57:00" - "10"
"25790" - "19/10/2015 14:00:15" - "11"
"25791" - "19/10/2015 15:29:00" - "12"
"25793" - "20/10/2015 11:30:00" - "13"

Dans la feuille 2("Base de donnée"), j'ai la même chose, c'est à dire dans ma colonne B, j'ai toujours un numéro unique et dans ma colonne M, j'ai une date et une heure (mais pas toujours)

Base de donnée
Col B - Col M - ligne
"25789" - "18/10/2015 10:57:00" - "75"
"25790" - "19/10/2015 14:00:15" - "76"
"25791" - " (null) " - "77"
"25793" - "20/10/2015 11:29:00" - "78"

Au final :

Extraction
Col B - Col M

"25791" "19/10/2015 15:29:00"
"25793" "20/10/2015 11:30:00"


Base de donnée
Col B - Col M
"25789" - "18/10/2015 10:57:00"
"25790" - "19/10/2015 14:00:15"



Donc mon but étant de comparer dans la feuille 1 et 2, si il y a le même numéro (feuil1 avec le numéro "25789" et dans la feuil 2 numéro "25789") et si l'heure (feuil1 l'heure est "18/10/2015 10:57:00" et feuil2 l'heure est "18/10/2015 10:57:00") alors je la supprime dans la feuil1(Extraction)

Et si le numéro est le même dans la feuil1 et feuil2 et que l'heure est différent, alors je supprime dans le feuil2 (Base de donnée)

Merci d'avance
TintinU2
A voir également:

4 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
21 oct. 2015 à 07:22
Bonjour,

Peux tu nous passer, via cjoint, un extrait de ton classeur sans données confidentielles?
Au besoin, ne conserve que les données des colonnes B et M.
0
Bonjour pijaku

Merci pour ta réponse.

Voici un exemple de mon classeur avec les colonnes B et M
http://www.cjoint.com/c/EJvha0mDI7F
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743 > TintinU2
21 oct. 2015 à 09:38
Question subsidiaire :
Je penses que tu n'as pas des données qu'en colonne B et M. Ton tableau va de qu'elle colonne à qu'elle colonne?
0
TintinU2 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
Modifié par TintinU2 le 21/10/2015 à 09:47
Mes colonnes vont de A jusqu'à P
Dans ma feuille Extraction, les lignes vont de 1 jusqu'à une valeur variable
Et dans ma feuille Base de Donnée, les lignes vont de 1 jusqu'à une valeur variable
0
Voici ce que j'ai réussi à faire comme code pour le moment

Sub test()

Dim i As Integer
Dim Ext As Range
Dim BDD As Range
Dim Date_remise As Range



Set BDD = Worksheets("Base de donnée").Range("B2:B6000")
Set Date_remise = Worksheets("Base de donnée").Range("M2:M6000")
Set Ext = Worksheets("Extraction").Range("B2:B600")


With ThisWorkbook.Sheets("Extraction")
' i sera égal à 20000, 19999,...,2
For i = 20000 To 2 Step -1
If ((Application.CountIf(BDD, .Range("B" & i).Value) <> 0) And (Application.CountIf(Date_remise, .Range("M" & i).Value) <> 0)) Then
.Rows(i).Delete
End If
Next i
End With

With ThisWorkbook.Sheets("Base de donnée")
' i sera égal à 20000, 19999,...,2
For i = 20000 To 2 Step -1
If Application.CountIf(Ext, .Range("B" & i).Value) <> 0 Then
.Rows(i).Delete
End If
Next i
End With

MsgBox ("Fini")

End Sub
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743 > TintinU2
21 oct. 2015 à 11:05
Peut-on avoir une approximation du nombre de lignes à traiter, même si c'est variable...
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
21 oct. 2015 à 11:43
Bon.
Voici le premier jet.

Une petite explication préalable.
La macro ci-dessous créée 2 feuilles dans le classeur. Pourquoi? pour ne pas effacer tes données si le code ne fait pas exactement ce que tu souhaites. Ces 2 feuilles servent de feuilles de restitution des données après le traitement.

Dans le code ci-dessous, tu trouveras un "paragraphe" de constantes à adapter. Tu dois modifier (ou pas) les valeurs de ces constantes (entre guillemets).

Il y a également des lignes pour calculer le temps de traitement. Tu pourras les supprimer après tests. Peux tu nous dire le résultat en secondes?

Voici le fichier exemple

et le code :
Option Explicit

Sub Compare2colonnes()
Dim SheetRestiBdd As Worksheet, SheetRestiExtr As Worksheet
Dim T_In_Extract(), T_In_Bdd(), T_Out_Extract(), T_Out_Bdd()
Dim Entete_Cols_Extr(), Entete_Cols_Bdd()
Dim Dico_Extract As Object, Dico_Bdd As Object
Dim DLig As Long, DLigTemp As Long, i As Long, Ligne As Long, Cpt_Out_Ectract As Long, Cpt_Out_Bdd As Long
Dim Nb_Col As Integer, j As Integer

   '---------------------------------
   'A ADAPTER :
   Const NOM_FEUIL_EXTRACT As String = "Extraction"
   Const NOM_FEUIL_BDD As String = "Base de donnée"
   Const AJOUT_FEUIL_EXTRACT As String = "Extraction apres macro"
   Const AJOUT_FEUIL_BDD As String = "Bdd apres macro"
   Const NUM_LIGN_DEBUT As Integer = 2
   Const LETTRE_DERNIERE_COLONNE As String = "P"
   '---------------------------------
   
   '---------------------------------
   'Lignes à supprimer après tests
   Dim t As Single
   t = Timer
   '---------------------------------
   
   'création des 2 feuilles de restitution des données
   If Not Feuil_Exist(ThisWorkbook.Name, AJOUT_FEUIL_BDD) Then
      Sheets.Add After:=Worksheets(Worksheets.Count)
      ActiveSheet.Name = AJOUT_FEUIL_BDD
   End If
   If Not Feuil_Exist(ThisWorkbook.Name, AJOUT_FEUIL_EXTRACT) Then
      Sheets.Add After:=Worksheets(Worksheets.Count)
      ActiveSheet.Name = AJOUT_FEUIL_EXTRACT
   End If
   
   'Initialisation des variables
   Nb_Col = Asc(LETTRE_DERNIERE_COLONNE) - Asc("A") + 1
   Set Dico_Bdd = CreateObject("Scripting.Dictionary")
   Set Dico_Extract = CreateObject("Scripting.Dictionary")
   Set SheetRestiExtr = Sheets(AJOUT_FEUIL_EXTRACT)
   Set SheetRestiBdd = Sheets(AJOUT_FEUIL_BDD)
   
   'Enregistrement, en mémoire, des données des deux feuilles
   With Sheets(NOM_FEUIL_EXTRACT)
      DLig = .Columns(2).Find("*", , , , xlByColumns, xlPrevious).Row
      DLigTemp = .Columns(13).Find("*", , , , xlByColumns, xlPrevious).Row
      If DLigTemp > DLig Then DLig = DLigTemp
      T_In_Extract = .Range("A" & NUM_LIGN_DEBUT & ":" & LETTRE_DERNIERE_COLONNE & DLig).Value
      Entete_Cols_Extr = .Range("A1:" & LETTRE_DERNIERE_COLONNE & "1").Value
   End With
   With Sheets(NOM_FEUIL_BDD)
      DLig = .Columns(2).Find("*", , , , xlByColumns, xlPrevious).Row
      DLigTemp = .Columns(13).Find("*", , , , xlByColumns, xlPrevious).Row
      If DLigTemp > DLig Then DLig = DLigTemp
      T_In_Bdd = .Range("A" & NUM_LIGN_DEBUT & ":" & LETTRE_DERNIERE_COLONNE & DLig).Value
      Entete_Cols_Bdd = .Range("A1:" & LETTRE_DERNIERE_COLONNE & "1").Value
   End With
   
   'stockage des éléments des colonnes B(2) et M(13) + début traitement
   For i = LBound(T_In_Extract) To UBound(T_In_Extract)
      T_In_Extract(i, 13) = "'" & T_In_Extract(i, 13)
      Dico_Extract(T_In_Extract(i, 2)) = T_In_Extract(i, 13)
   Next i
   For i = LBound(T_In_Bdd) To UBound(T_In_Bdd)
      T_In_Bdd(i, 13) = "'" & T_In_Bdd(i, 13)
      Dico_Bdd(T_In_Bdd(i, 2)) = T_In_Bdd(i, 13)
      'début traitement
      If Dico_Extract.exists(T_In_Bdd(i, 2)) And Dico_Extract(T_In_Bdd(i, 2)) <> T_In_Bdd(i, 13) Then
      Else
         Cpt_Out_Bdd = Cpt_Out_Bdd + 1
         ReDim Preserve T_Out_Bdd(1 To Nb_Col, 1 To i)
         For j = 1 To Nb_Col
            T_Out_Bdd(j, Cpt_Out_Bdd) = T_In_Bdd(i, j)
         Next j
      End If
   Next i
   
   'fin traitement
   For i = LBound(T_In_Extract) To UBound(T_In_Extract)
      If Dico_Bdd.exists(T_In_Extract(i, 2)) And Dico_Bdd(T_In_Extract(i, 2)) = T_In_Extract(i, 13) Then
      Else
         Cpt_Out_Ectract = Cpt_Out_Ectract + 1
         ReDim Preserve T_Out_Extract(1 To Nb_Col, 1 To i)
         For j = 1 To Nb_Col
            T_Out_Extract(j, Cpt_Out_Ectract) = T_In_Extract(i, j)
         Next j
      End If
   Next i
   
   'restitution des données en feuilles "extract apres macro" et "bdd apres macro"
   With SheetRestiBdd
      .Cells.ClearContents
      .Range("A1").Resize(, UBound(Entete_Cols_Bdd, 2)) = Entete_Cols_Bdd
      .Range("A2").Resize(UBound(T_Out_Bdd, 2), UBound(T_Out_Bdd, 1)) = Application.Transpose(T_Out_Bdd)
   End With
   With SheetRestiExtr
      .Cells.ClearContents
      .Range("A1").Resize(, UBound(Entete_Cols_Extr, 2)) = Entete_Cols_Extr
      .Range("A2").Resize(UBound(T_Out_Extract, 2), UBound(T_Out_Extract, 1)) = Application.Transpose(T_Out_Extract)
   End With
   
   'Ligne à supprimer après tests
   MsgBox Timer - t & " secondes"
End Sub

Function Feuil_Exist(strWbk As String, strWsh As String) As Boolean
'Gestionnaire d'erreur
On Error Resume Next
    '"Test"
    Feuil_Exist = (Workbooks(strWbk).Sheets(strWsh).Name = strWsh)
End Function

0
Merci pour tes réponses rapides pijaku.

Ton programme à mis 0.15625 sec pour s'exécuter
Et ton programme fonctionne bien dans le fichier que je t'ai transmis.

Cependant un fois dans mon fichier avec toutes mes valeurs, le fichier conserve toute les lignes dans Bdd apres macro et Extraction apres macro.
Ne trouves-tu pas ça étrange?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743 > TintinU2
21 oct. 2015 à 12:39
Ne trouves-tu pas ça étrange?
Non, ça m'arrive tous les jours de me planter ;-)

Problème de formats...
Ach ces dictionary !!!
Ach les formats de date!!!
Grrrr

Ce que l'on va faire.
1- créée une copie de ton classeur,
2- Supprime le contenu des colonnes A, C-L, N-P mais ne touche pas aux colonnes B et M!
3- transmet moi ce fichier.
0
TintinU2 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
21 oct. 2015 à 13:28
Je te fais ça pour demain

Merci encore pour ton aide
0
Voici un exemple de mon fichier

Voici le lien http://www.cjoint.com/c/EJvpKsqmnjF
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
22 oct. 2015 à 10:45
Bonjour,

Cependant un fois dans mon fichier avec toutes mes valeurs, le fichier conserve toute les lignes dans Bdd apres macro et Extraction apres macro.

Avec le fichier que tu m'as joint, le résultat après passage de macro donne :

Extraction : avant = 518 lignes / après = 49 lignes
Base de données : avant = 518 lignes / après = 512

Donc, je penses que les conditions énoncées dans le sujet de ce thread ne sont pas suffisante.

Comme le prouve ce Classeur
0
Bonjour pijaku,
Merci pour ta réponse.

Je n'arrive pas à ouvrir le classeur en pièce jointe.

Les conditions sont bien respectée avec le premier tableau que j'ai transmis.
Cependant dans mon tableau final, avec ton programme, je retrouve:

Extraction : avant = 518 lignes / après = 518 lignes
Base de données : avant = 518 lignes / après = 518 lignes
J'ai l'impression qu'il fait juste un copier/coller.

Est-ce que le faite d'avoir des données dans les colonnes A, C-L, N-P, a une conséquence sur le programme?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743 > TintinU2
22 oct. 2015 à 12:08
Est-ce que le faite d'avoir des données dans les colonnes A, C-L, N-P, a une conséquence sur le programme?
Normalement non... Je ne traite que des colonnes B et M...

Bon, plus le choix, il me faut pour continuer le fichier original...
0
TintinU2 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
22 oct. 2015 à 12:33
Peux-tu remettre ton fichier accessible avant, car je ne peux pas le télécharger
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743 > TintinU2
22 oct. 2015 à 13:37
Je ne comprends pas ta question. Tous les fichiers que j'ai placé dans cette discussion sont téléchargeables.
Non?
0
TintinU2 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
22 oct. 2015 à 13:58
Je n'arrive pas à télécharger sur les deux liens:

-le n°1 : http://www.cjoint.com/c/EJvjQrLEowE

-le n°2 : http://www.cjoint.com/c/EJwiS7IysmE
0
TintinU2 Messages postés 79 Date d'inscription lundi 26 octobre 2015 Statut Membre Dernière intervention 8 juillet 2016 5
26 oct. 2015 à 12:24
Bonjour à tous,
Bonjour pijaku,

j'ai une dernière question.
Dans ma colonne M (avec les dates), je n'arrive pas a avoir un format correct après la macro.
Est-il possible d'avoir un format jj/mm/aaaa hh:mm sur toutes les lignes avec la macro

Merci d'avance
0