Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

VBA Application Match - pb avec matrice

3 réponses
Avatar
danielos
Bonjour,

J'ai une macro susceptible de comparer 2 colonnes qui fonctionne sauf=20
lorsque les cl=E9s dans Feuil2 n'existent pas dans Feuil3 ; J'ai une=20
erreur code 1004 qui bloque la macro.
Comment serait-il possible de ne pas tenir compte de ces lignes.

Dans ce classeur, je r=E9cup=E8re (copier/coller) des donn=E9es d'une bas=
e =E0=20
sur la Feuil1.
Avec la macro :
Je cr=E9e des cl=E9s uniques qui me serviront =E0 comparer ces 2 feuilles=
=2E
Je copie les donn=E9es de Feil1 dans Feuil3 (pour garder l'original des=20
donn=E9es).
Je compare les cl=E9s existantes de Feuil2 par rapport aux cl=E9s de Feui=
l3=20
et lorsqu'elles existent, je supprime la ligne dans Feuil3 (je ne=20
conserve ainsi que les 'nouvelles' lignes - qui sont en fait des=20
inscriptions).

Pour expliquer qu'en Feuil2 on peut avoir des lignes qui ne sont pas=20
dans Feuil 3 (Feuil 1 en fait), c'est simplement des inscriptions qui=20
ont =E9t=E9 annul=E9es sur la base depuis la derni=E8re visite.

Merci d'avance de toute aide sur la question.
Daniel


Voici mon code

Sub Feuil1_Vs_Feuil2()
'
'D=E9finition des variables
Dim i As Long
Dim j As Long
Dim k As Long
Dim derlin As Long
Dim derling As Long

derlin =3D Sheets("Feuil3").Range("A" & Rows.Count).End(xlUp).Row
derling =3D Sheets("Feuil2").Range("A" & Rows.Count).End(xlUp).Row

' Vide la feuille "Feuil3"

Sheets("Feuil3").Range("A:BH" & Rows.Count).ClearContents

' Cr=E9ation des Cl=E9s de contr=F4le qui serviront =E0 comparer

'Call Creation_Cle_controle (NDRL cette macro fonctionne parfaitement=20
pour concat=E9ner le contenu de 2 lignes et ainsi cr=E9er une cl=E9 uniqu=
e en=20
colonne BJ)

' Copie de la liste issue de la base de donn=E9e et coll=E9e en "Feuil1" =

ainsi que les cl=E9s de contr=F4le vers la feuille "Feuil3" pour conserve=
r=20
le contenu sur "Feuil1"

Sheets("Feuil1").Select
Range("A1:BJ1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("Feuil3").Select
Range("B1").Select
ActiveSheet.Paste
Range("A2").Select

'Ecrit 'Statut' en A1 dans la feuille "Feuil3"

Sheets("Feuil3").Select
Range("A1").Select
ActiveCell.FormulaR1C1 =3D "Statut"


'D=E9selectionne les cellules dans la feuille "Feuil1"

Sheets("Feuil1").Select
Range("A1").Select
Application.CutCopyMode =3D False

' Recherche des nouvelles inscriptions

Sheets("Feuil3").Select
Range("A1").Select

j =3D 2
While Worksheets("Feuil2").Cells(j, 62) <> "" 'la colonne BJ =

est la 62=E8me.

i =3D WorksheetFunction.Match(Worksheets("Feuil2").Cells(j,=20
62).Value, Worksheets("Feuil3").Columns(63), 0) 'Comparaison de la=20
valeur des cl=E9s des feuilles "Feuil2" avec "Feuil3"
If Err Then i =3D 0

If i <> 0 Then
Worksheets("Feuil3").Rows(i).EntireRow.Delete Shift:=3DxlUp=20
'Supprime la ligne qui existe dans Feuil2

End If
j =3D j + 1 'On passe au traitement de la ligne suivante dans la=20
feuille "Feuil2"
Wend

' Mettre le statut 'Nouvelle inscription' dans la 1=E8re colonne

k =3D 2
While Not IsEmpty(Cells(k, 2))
If Cells(k, 2) <> "" Then Cells(k, 1) =3D "Nouvelle inscription"
k =3D k + 1
Wend


End Sub

3 réponses

Avatar
h2so4
bonjour,

j'ai fait des corrections dans ton code, pour ajouter le traitement
d'erreur. Mais je n'ai pas testé.



danielos submitted this idea :
Bonjour,

J'ai une macro susceptible de comparer 2 colonnes qui fonctionne sauf lorsque
les clés dans Feuil2 n'existent pas dans Feuil3 ; J'ai une erreur code 1004
qui bloque la macro.
Comment serait-il possible de ne pas tenir compte de ces lignes.

Dans ce classeur, je récupère (copier/coller) des données d'une base à sur la
Feuil1.
Avec la macro :
Je crée des clés uniques qui me serviront à comparer ces 2 feuilles.
Je copie les données de Feil1 dans Feuil3 (pour garder l'original des
données).
Je compare les clés existantes de Feuil2 par rapport aux clés de Feuil3 et
lorsqu'elles existent, je supprime la ligne dans Feuil3 (je ne conserve ainsi
que les 'nouvelles' lignes - qui sont en fait des inscriptions).

Pour expliquer qu'en Feuil2 on peut avoir des lignes qui ne sont pas dans
Feuil 3 (Feuil 1 en fait), c'est simplement des inscriptions qui ont été
annulées sur la base depuis la dernière visite.

Merci d'avance de toute aide sur la question.
Daniel


Voici mon code

Sub Feuil1_Vs_Feuil2()
'
'Définition des variables
Dim i As Long
Dim j As Long
Dim k As Long
Dim derlin As Long
Dim derling As Long

derlin = Sheets("Feuil3").Range("A" & Rows.Count).End(xlUp).Row
derling = Sheets("Feuil2").Range("A" & Rows.Count).End(xlUp).Row

' Vide la feuille "Feuil3"

Sheets("Feuil3").Range("A:BH" & Rows.Count).ClearContents

' Création des Clés de contrôle qui serviront à comparer

'Call Creation_Cle_controle (NDRL cette macro fonctionne parfaitement pour
concaténer le contenu de 2 lignes et ainsi créer une clé unique en colonne
BJ)

' Copie de la liste issue de la base de donnée et collée en "Feuil1" ainsi
que les clés de contrôle vers la feuille "Feuil3" pour conserver le contenu
sur "Feuil1"

Sheets("Feuil1").Select
Range("A1:BJ1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("Feuil3").Select
Range("B1").Select
ActiveSheet.Paste
Range("A2").Select

'Ecrit 'Statut' en A1 dans la feuille "Feuil3"

Sheets("Feuil3").Select
Range("A1").Select
ActiveCell.FormulaR1C1 = "Statut"


'Déselectionne les cellules dans la feuille "Feuil1"

Sheets("Feuil1").Select
Range("A1").Select
Application.CutCopyMode = False

' Recherche des nouvelles inscriptions

Sheets("Feuil3").Select
Range("A1").Select

j = 2
While Worksheets("Feuil2").Cells(j, 62) <> "" 'la colonne BJ est
la 62ème.


on error goto pastrouvé
i = WorksheetFunction.Match(Worksheets("Feuil2").Cells(j, 62).Value,
Worksheets("Feuil3").Columns(63), 0) 'Comparaison de la valeur des clés des
feuilles "Feuil2" avec "Feuil3"


on error goto 0

If i <> 0 Then
Worksheets("Feuil3").Rows(i).EntireRow.Delete Shift:=xlUp 'Supprime la
ligne qui existe dans Feuil2

End If
j = j + 1 'On passe au traitement de la ligne suivante dans la feuille
"Feuil2"
Wend

' Mettre le statut 'Nouvelle inscription' dans la 1ère colonne

k = 2
While Not IsEmpty(Cells(k, 2))
If Cells(k, 2) <> "" Then Cells(k, 1) = "Nouvelle inscription"
k = k + 1
Wend


exit sub
pasatrouvé:
i=0
resume next
End Sub
Avatar
h2so4
h2so4 presented the following explanation :
erreur de frappe corrigée.

j = 2
While Worksheets("Feuil2").Cells(j, 62) <> "" 'la colonne BJ
est la 62ème.




on error goto pastrouvé
i = WorksheetFunction.Match(Worksheets("Feuil2").Cells(j, 62).Value,
Worksheets("Feuil3").Columns(63), 0) 'Comparaison de la valeur des clés des
feuilles "Feuil2" avec "Feuil3"




on error goto 0

If i <> 0 Then
Worksheets("Feuil3").Rows(i).EntireRow.Delete Shift:=xlUp 'Supprime
la ligne qui existe dans Feuil2

End If
j = j + 1 'On passe au traitement de la ligne suivante dans la
feuille "Feuil2"
Wend

' Mettre le statut 'Nouvelle inscription' dans la 1ère colonne

k = 2
While Not IsEmpty(Cells(k, 2))
If Cells(k, 2) <> "" Then Cells(k, 1) = "Nouvelle inscription"
k = k + 1
Wend




exit sub
pastrouvé:
i=0
resume next
End Sub
Avatar
danielos
ça fonctionne,
Merci beaucoup de l'aide.
Daniel

h2so4 a écrit :
h2so4 presented the following explanation :
erreur de frappe corrigée.

j = 2
While Worksheets("Feuil2").Cells(j, 62) <> "" 'la colonne
BJ est la 62ème.




on error goto pastrouvé
i = WorksheetFunction.Match(Worksheets("Feuil2").Cells(j,
62).Value, Worksheets("Feuil3").Columns(63), 0) 'Comparaison de la
valeur des clés des feuilles "Feuil2" avec "Feuil3"




on error goto 0

If i <> 0 Then
Worksheets("Feuil3").Rows(i).EntireRow.Delete Shift:=xlUp
'Supprime la ligne qui existe dans Feuil2

End If
j = j + 1 'On passe au traitement de la ligne suivante dans la
feuille "Feuil2"
Wend

' Mettre le statut 'Nouvelle inscription' dans la 1ère colonne

k = 2
While Not IsEmpty(Cells(k, 2))
If Cells(k, 2) <> "" Then Cells(k, 1) = "Nouvelle inscription"
k = k + 1
Wend




exit sub
pastrouvé:
i=0
resume next
End Sub