XL 2010 Mise à jour de données et suppression des doublons

Horusbk

XLDnaute Junior
Bonjour,
Je cherche à tenir à jour un fichier qui récapitule un certains nombre de données concernant des réservations de cars. Nous avons un fichier composé de deux feuilles de calcul : TEMP et RECAP.
  • RECAP : c'est la feuille de synthèse de toutes les données, les nouvelles données proviennent de la feuille TEMP.
Chaque jour, nous avons une extraction du système de vente des cars qui indique notamment la date de la commande, le numéro du cars et le nombre de passagers (qui ont réservé). L'idée est de copier toutes les données de ce classeur et de le mettre dans TEMP. Sur le fichier de test, vous aurez une idée de la tête du tableau. Les croix "x" signifient que la donnée n'est pas importante pour ma demande.
  • TEMP : c'est une feuille où l'on importe l'export journalier. Sur cette feuille il faut faire deux choses :
La première c'est de mettre au format date (jj/mm/aaaa) les colonnes DATE 2 et DATE.
La deuxième est de supprimer l'en-tête des colonnes (ligne 1).

Le rôle du VBA que je souhaite mettre en place est le suivant :
Il doit pouvoir comparer les données des feuilles TEMP et RECAP (pour RECAP à partir de la ligne 3 = début des données à comparer, après l'en-tête) en se basant sur les colonnes DATE / NUMERO / NBR PASSAGERS des deux feuilles. Pour les lignes de TEMP qui ne n'y en doublon dans TEMP et ni en doublon dans RECAP, le code doit pouvoir me les importer à la suite de la feuille RECAP.
Une fois l'opération effectuée, il réinitialise la feuille TEMP.

Merci de votre aide, je reste à disposition au besoin.
Baptiste.
 

Pièces jointes

  • test_TRI+SUPPR-Doublons.xlsx
    15.5 KB · Affichages: 53

Horusbk

XLDnaute Junior
Bonjour,

Doublon signifie-t-il même date et même numéro et même nombre de passager ou, même date et même numéro ?
Même date + Même numéro + Même nombre de passagers

Pour les lignes de TEMP qui ne n'y en doublon dans TEMP et ni en doublon dans RECAP,
En fait j'aimerais éviter les erreurs de doublons en vérifiant, dans un premier temps, s'il en existe pas dans la feuille TEMP avant de comparer entre les nouvelles données mises dans TEMP et celles existantes dans RECAP.

A ta dispo pour toutes questions et merci !
Horusbk
 

Robert

XLDnaute Barbatruc
Repose en paix
Re,

P... de galère avec les dates !... Essaie comme ça :

VB:
Private T As Worksheet 'déclare la variable T (onglet Temp)
Private R As Worksheet 'déclare la variable R (onglet Recap)
Private TT As Variant 'déclare la variable TT (Tableau Temp)
Private TR As Variant 'déclare la variable TR (Tableau Recap)
Private NLT As Long 'déclare la variable NLT (Nombre de Lignes Temp)
Private NCT As Byte 'déclare la variable NCT (Nombre de Colonnes Temp)
Private NLR As Long 'déclare la variable NLR (Nombre de Lignes Recap)

Sub Init()
Set T = Worksheets("TEMP") 'définit l'onglet T
Set R = Worksheets("RECAP") 'définit l'onglet R
TT = T.Range("A1").CurrentRegion 'définit le tableau  TT
NLT = UBound(TT, 1) 'définit le nombre de lignes NLT du tableau TT
NCT = UBound(TT, 2) 'définit le nombre de colonnes NCT du tableau TT
Call DoublTemp 'appelle la procédure DoublTemp
End Sub

Private Sub DoublTemp()
Dim I As Long 'déclare la variable I (incrément)

T.Columns(1).NumberFormat = "General" 'met la colonne A de l'onglet T au format 'Général"
R.Columns(1).NumberFormat = "General" 'met la colonne A de l'onglet R au format 'Général"
For I = NLT - 1 To 2 Step -1 'boucle inversée sur toutes les lignes I du tableau TT (de l'avant dernière à la ligne 2)
    'si la ligne I est identique à la ligne I+1 (doublon sur colonnes A, B et M), supprime la ligne I+1
    If TT(I, 1) = TT(I + 1, 1) And TT(I, 2) = TT(I + 1, 2) And TT(I, 13) = TT(I + 1, 13) Then T.Rows(I + 1).Delete
Next I 'prochaine ligne de la boucle
TT = T.Range("A1").CurrentRegion 'redéfinit le tableau TT
NLT = UBound(TT, 1) 'redéfinit le nombre de lignes NLT du tableau TT
Call DoublRec 'lance la procédure DoublRec
End Sub

Private Sub DoublRec()
Dim I As Long 'déclare la variable I (incrément)
Dim J As Long 'déclare la variable J (incrément)
Dim K As Long 'déclare la variable K (incrément)
Dim L As Byte 'déclare la variable L (incrément)
Dim D1 As String 'déclare la variable D1 (Donnée 1)
Dim D2 As String 'déclare la variable D2 (Donnée 2)
Dim TEST As Boolean 'déclare la varaible TEST
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

TR = R.Range("A2").CurrentRegion 'définit le tableau TR
NLR = UBound(TR, 1) 'définit le nombre de ligne NLR du tableau TR
K = 1 'initialise lavariable K
For I = 2 To NLT 'boucle 1 : sur toutes les lignes I du tableau TT (en partant de la seconde)
    For J = 2 To NLR 'boucle 2 : sur toutes les lignes J du tableau TR (en partant de la seconde)
        D1 = CStr(TT(I, 1)) & CStr(TT(I, 2)) & CStr(TT(I, 13)) 'définit la variable D1 (concaténation des colonnes 1, 2 et 13) de l'onglet T
        D2 = CStr(TR(J, 1)) & CStr(TR(J, 2)) & CStr(TR(J, 13)) 'définit la variable D2 (concaténation des colonnes 1, 2 et 13) de l'onglet R
        If CStr(D1) = CStr(D2) Then TEST = True: Exit For 'si D1 est égale à D2,redéfinit la variable TEST, sort de la boucle 2
    Next J 'prochaine ligne de la boucle 2
    If TEST = False Then 'condition : si TEST est [faux]
        ReDim Preserve TL(1 To NCT, 1 To K) 'redimensionne le tableau des lignes TL (autant de lignes que TT a de colonnes, K colonnes)
        For L = 1 To NCT 'boucle 3 : sur toutes les lignes L du tableau des lignes TL
            TL(L, K) = TT(I, L) 'récupère dans la ligne L de TL la donnée en colonne L de TT (= Transposition)
        Next L 'prochaine ligne de la boucle 3
        K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL)
    End If 'fin de la condition
    TEST = False 'réinitialise la variable TEST
Next I 'prochaine ligne de la boucle 1
Set DEST = R.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST (la première cellule vide la la colonne A de l'onglet R)
If K > 1 Then DEST.Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL) 'si K est supérieure à 1, renvoie dans dest le tableau TL transposé
T.Columns(1).NumberFormat = "dd/mm/yyyy" 'met la colonne A de l'onglet T au format "jj/mm/aaaa"
R.Columns(1).NumberFormat = "dd/mm/yyyy" 'met la colonne A de l'onglet T au format "jj/mm/aaaa"
End Sub
 

Discussions similaires

Réponses
2
Affichages
113

Membres actuellement en ligne

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16