Jointure/Comparaison: Premier blocage d'une longue série
Agonyme
Messages postés
6
Date d'inscription
Statut
Membre
Dernière intervention
-
Agonyme Messages postés 6 Date d'inscription Statut Membre Dernière intervention -
Agonyme Messages postés 6 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous et à toutes:
Je suis en train de développer un outils en VBA et je suis confronté à une série de blocages divers étant donné que je ne suis pas très expérimenté.
Le premier d'entre eux est le suivant : je dispose de deux classeurs contenants une feuille chacun. Dans chacun des classeurs on retrouve une colonne "Numéro d'affaire" avec un identifiant unique commun aux deux ainsi que une colonne "D" contenant une date de début dans l'un et " D' " dans l'autre contenant la date de fin. Mon objectif est de récupérer dans un troisième classeur l'identifiant, la date de début et la date de fin. Pour ne pas simplifier la chose, dans le premier classeur on a environ 20 000 lignes et 5000 dans le second, il est donc impossible de se contenter de copier les colonnes tels quel car les clés ne correspondraient pas. Mon objectif premier dans ce cas serait de faire correspondre les lignes qui vont bien et de supprimer celles qui n'ont pas de date de fin.
J'ai tenté de coder un truc qui en plus d'être loin, très loin d'être optimal, ne fonctionne pas.
Merci de votre patience, votre aide me serait très précieuse.
Cordialement.
Edit : Les données sources manipulées sont confidentielles je présume donc je ne peux vous les fournir. Toutefois je peux essayer de vous créer un fichier équivalent si cela est necessaire
Je suis en train de développer un outils en VBA et je suis confronté à une série de blocages divers étant donné que je ne suis pas très expérimenté.
Le premier d'entre eux est le suivant : je dispose de deux classeurs contenants une feuille chacun. Dans chacun des classeurs on retrouve une colonne "Numéro d'affaire" avec un identifiant unique commun aux deux ainsi que une colonne "D" contenant une date de début dans l'un et " D' " dans l'autre contenant la date de fin. Mon objectif est de récupérer dans un troisième classeur l'identifiant, la date de début et la date de fin. Pour ne pas simplifier la chose, dans le premier classeur on a environ 20 000 lignes et 5000 dans le second, il est donc impossible de se contenter de copier les colonnes tels quel car les clés ne correspondraient pas. Mon objectif premier dans ce cas serait de faire correspondre les lignes qui vont bien et de supprimer celles qui n'ont pas de date de fin.
J'ai tenté de coder un truc qui en plus d'être loin, très loin d'être optimal, ne fonctionne pas.
Application.ScreenUpdating = FalseEn gros la dernière partie de code tente de comparer chaque cellule identifiante du fichier à comparer avec les cellules identifiantes qu'on à déjà collé.
ChDir "C:\Users\ACER\Appli\MOA"
ClasseurRegional = Dir("C:\Users\ACER\Appli\MOA\MOA.xls")
Workbooks.Open ClasseurRegional 'Ouverture du fichier
DerniereLigne = ActiveSheet.UsedRange.Rows.Count 'On prend la valeur du nombre de ligne
Range("B10:B" & DerniereLigne).Copy 'Copie de A2 à C(NbLignes)
Workbooks("Classeur1.xlsm").Sheets("Sheet2").Activate 'On met la feuille courante en active
DebutNomFichier = Sheets("Sheet2").UsedRange.Rows.Count + 1 'Debut nom fichier prend la valeur nombre de lignes utilisées +1
Range("B" & Sheets("Sheet2").UsedRange.Rows.Count + 1).Select ' On selectionne la colonne B de classseur jusqu'à la ligne utilisée max +1
Sheets("Sheet2").Paste 'On colle dans la zone selectionnée
Workbooks(ClasseurRegional).Close 'fermeture du fichier lu
Workbooks.Open ClasseurRegional
Range("J10:J" & DerniereLigne).Copy 'Copie de J10 à J(NbLignes)
Workbooks("Classeur1.xlsm").Sheets("Sheet2").Activate 'On met la feuille courante en active
DebutNomFichier = Sheets("Sheet2").UsedRange.Rows.Count + 1 'Debut nom fichier prend la valeur nombre de lignes utilisées +1
Range("C2").Select
Sheets("Sheet2").Paste
ChDir "C:\Users\ACER\Appli\IEP"
ClasseurRegional = Dir("C:\Users\ACER\Appli\IEP\*.*")
nblignes = Workbooks("Classeur1.xlsm").Sheets("Sheet2").UsedRange.Rows.Count' compte du nombre de lignes collées
Workbooks.Open ClasseurRegional 'Ouverture du fichier
nblignes2 = Workbooks("IEP").Sheets("Export IEP").UsedRange.Rows.Count' compte du nombre de ligne à comparer
For i = 11 To nblignes ' 11 est la première ligne de données intéressante
j = 0
While j < nblignes2
If Workbooks("Classeur1.xlsm").Sheets("Sheet2").Cells(i, 2).Value Like Workbooks("IEP.xlsx").Sheets("Export IEP").Cells(j, 1).Value Then
Workbooks("IEP.xlsx").Sheets("Export IEP").Cells(j, 1).EntireRow.Copy
Workbooks("Classeur1.xlsm").Sheets("Sheet2").Range("C" & i).Paste
j = nblignes2 + 1
Else
j = j + 1
End If
Wend
Next
Merci de votre patience, votre aide me serait très précieuse.
Cordialement.
Edit : Les données sources manipulées sont confidentielles je présume donc je ne peux vous les fournir. Toutefois je peux essayer de vous créer un fichier équivalent si cela est necessaire
A voir également:
- Jointure/Comparaison: Premier blocage d'une longue série
- Comparaison million milliard - Accueil - Technologies
- Logiciel comparaison photo gratuit - Télécharger - Photo & Graphisme
- Comparaison samsung a15 et a16 - Accueil - Téléphones
- Comparaison prix amazon - Accueil - Commerce
- Prix Amazon : comment suivre les évolutions de tarifs - Guide
2 réponses
Bonjour,
Toutefois je peux essayer de vous créer un fichier équivalent si cela est necessaire
Plutôt les TROIS classeurs
Toutefois je peux essayer de vous créer un fichier équivalent si cela est necessaire
Plutôt les TROIS classeurs
pour joindre une pièce
mettre le classeur sans données confidentielles en pièce jointe sur
http://cjoint.com/
puis copier l'adresse du lien et la coller dans le message de réponse
J'ai considéré que le tableau "fin" était plus petit que le tableau "début" (bin oui !)
la maquette de W
https://www.cjoint.com/?3DCsGZFoV81
Michel
Option Explicit
Option Base 1
Sub coupler_2tableaux()
Dim Derlig As Integer, T_f1, T_f2, Idx As Integer, Ref As String
Dim D_f1 As Object
Dim T_out, Cptr As Integer
Dim start As Single
Application.ScreenUpdating = False
start = Timer
With Sheets("données1")
Derlig = .Columns("A").Find("*", , , , , xlPrevious).Row
T_f1 = .Range("A8:B" & Derlig)
Set D_f1 = CreateObject("scripting.dictionary")
For Idx = 1 To UBound(T_f1)
Ref = T_f1(Idx, 1)
If Not D_f1.exists(Ref) Then D_f1.Add Ref, T_f1(Idx, 2)
Next
End With
With Sheets("données2")
Derlig = .Columns("A").Find("*", , , , , xlPrevious).Row
T_f2 = .Range("A2:B" & Derlig)
End With
'Nbre de données 2 inférieur à nombre de données 1
ReDim T_out(3, 1)
For Idx = 1 To UBound(T_f2)
If D_f1.exists(T_f2(Idx, 1)) Then
Cptr = Cptr + 1
ReDim Preserve T_out(3, Cptr)
T_out(1, Cptr) = T_f2(Cptr, 1)
T_out(2, Cptr) = D_f1.Item(T_f2(Cptr, 1))
T_out(3, Cptr) = T_f2(Cptr, 2)
End If
Next
With Sheets("tableau")
.Range("A2:C20000").Clear
With .Range("A2").Resize(UBound(T_f2), 3)
.Value = Application.Transpose(T_out)
.Borders.Weight = xlThin
End With
.Activate
End With
Application.ScreenUpdating = True
MsgBox "Couplage affaires-début / fin effectué en: " & Timer - start & ".sec"
End Sub
la maquette de W
https://www.cjoint.com/?3DCsGZFoV81
Michel
POURQUOI envoyer des exemples bidon qui sentent le "démerdes toi avec ça""???
Il faut bien te rendre compte que ce que tu demandes n'est pas forcément facile et que personne ne veut passer parfois plusieurs heures à essayer de résoudre un problème bénévolement pour se voir dire après coup « En fait, dans la réalité etc... il faut en plus que.... »
Il faut bien te rendre compte que ce que tu demandes n'est pas forcément facile et que personne ne veut passer parfois plusieurs heures à essayer de résoudre un problème bénévolement pour se voir dire après coup « En fait, dans la réalité etc... il faut en plus que.... »
Je regrette, il ne s'agissait pas d'un exemple bidon mais plutôt représentatif mais c'est un détail qui m'a échappé. Je suis conscient du travail bénévole fourni et vous en remercie grandement. Je ne demande rien de plus, juste ce détail m'avait pas paru important mais il se trouve que il l'est en fait. Enfin bon vous pouvez considérer avoir fait ce qu'il fallait pour m'aider, j'essaierai de me débrouiller moi même avec mes inexactitudes. Merci
Il faut toutefois noter que le volume réel de données est beaucoup plus conséquent (autour des 20000 lignes)
Merci d'avance