Xl 2016 Comparaison entre deux cellule de deux document différent

Salut à tous

Après pas mal de temps sans pratiqué je me remet au VBA.

Je viens vers vous car j'aimerai Comparer une cellule d'un document nommé Matching avec une cellule d'un autre document nommé Liste des compteurs_Lyon

J'ai commencé ce code : mais ça ne fonctionne pas bien. J'ai un problème au niveau du workbook il me dit subscript out of range "If Workbooks("Matching").Worksheets("SAISI").Cells(iLigne, 5) = Workbooks("Liste des compteurs_Lyon").Worksheets("Liste des compteurs").Cells(iLigne, 4) Then"

Merci pour votre aide à très vite

Edit :

Ok j'ai trouvé pk il fallait mettre le .xlsm dans le nom

Mais maintenant j'ai une autre erreur

Option Explicit
Dim ThisWorkBook As Workbook

Sub CopieLigneCompteur()

Application.ScreenUpdating = False 'On desactive les changements d'écrans pour plus de rapidité et de fluidité
Application.DisplayAlerts = False 'On desactive les POP - UP
Dim iLigne As Integer
Dim iLigneCopy
Dim stFichierCompteur As String
Dim stFichierMatching As String
iLigne = 5 'Ligne lue
iLigneCopy = 2
stFichierCompteur = "Liste des compteurs_Lyon"

Sheets.Add After:=Worksheets(Worksheets.Count) 'ajoute une feuille dans le classeur actif en fin de classeur
ActiveSheet.Name = "Feuille Matching Compteur" 'Nomme la feuille créée Feuille Matching Compteur
Worksheets("SAISI").Activate 'Rend la feuille SAISI active

Do While Cells(iLigne, 5) <> "" 'balaye toute la colonne num?ro 5 (ici E) tant qu'il n'y a pas de caract?re nul

''''''''''''''''''''''''''''''''''''''''''''''Ici nous allons comparé la cellule (i, 5) du fichier Matching avec les cellule de la colonne 4 de Liste des compteurs_Lyon
    Do While Workbooks("Matching.xlsm").Worksheets("SAISI").Cells(iLigne, 5) = Workbooks("Liste des compteurs_Lyon.xlsm").Worksheets("Liste des compteurs").Cells(iLigne, 4)
        If Workbooks("Matching.xlsm").Worksheets("SAISI").Cells(iLigne, 5) = Workbooks("Liste des compteurs_Lyon.xlsm").Worksheets("Liste des compteurs").Cells(iLigne, 4) Then
            Workbooks("Liste des compteurs_Lyon.xlsm").Worksheets("Liste des compteurs").Cells(iLigne, 4).Activate
            ActiveCell.EntireRow.Copy Workbooks("Matching.xlsm").Worksheets("Feuille Matching Compteur").Cells(iLigneCopy, 1) 'ici on copie colle dans la feuille créée précedement la ligne selectionnée
            Range("A1").Select
            iLigneCopy = iLigneCopy + 1
            iLigne = 0
        End If
    Loop
    iLigne = iLigne + 1
Loop

Columns("A:AD").EntireColumn.AutoFit 'ici on auto dimensionne les cellules de la feuille active
Range("A1").Select
Workbooks("Matching.xlsm").Worksheets("Feuille Matching Compteur").Activate 'Rend la feuille Page d'acceuil active
Application.DisplayAlerts = True
Application.ScreenUpdating = True 'On active les changements d'écrans

End Sub

Application defined or object defined error

Je crois que ça viens du fait que je change trop de page et que du coup sur mon deuxieme do while il plante auriez-vous une solution plus élégante que les .activate ?

Merci beaucoup

Personne pour m'aider ?

Salut,

Bon du coup pas mal de point, je vais essayer d’être clair mais sans fichier ce n'est que supposition tout ça

Do While Workbooks("Matching.xlsm").Worksheets("SAISI").Cells(iLigne, 5) = Workbooks("Liste des compteurs_Lyon.xlsm").Worksheets("Liste des compteurs").Cells(iLigne, 4)
        If Workbooks("Matching.xlsm").Worksheets("SAISI").Cells(iLigne, 5) = Workbooks("Liste des compteurs_Lyon.xlsm").Worksheets("Liste des compteurs").Cells(iLigne, 4) Then
            Workbooks("Liste des compteurs_Lyon.xlsm").Worksheets("Liste des compteurs").Cells(iLigne, 4).Activate
            ActiveCell.EntireRow.Copy Workbooks("Matching.xlsm").Worksheets("Feuille Matching Compteur").Cells(iLigneCopy, 1) 'ici on copie colle dans la feuille créée précedement la ligne selectionnée
            Range("A1").Select
            iLigneCopy = iLigneCopy + 1
            iLigne = 0
        End If
    Loop

   

1. Déjà ton if ne sert à rien puisque c’est la même condition que ton Do While si je vois bien

2. A quoi sert le Range("A1").Select au milieu?

3. Pourquoi revenir en iLigne = 0 alors dès le début tu commences en iLigne = 5 ?

Cela compare la cell (0,5) de "SAISI" et celle (0,4) de "liste des compteurs" si je comprens bien, si tu as donc les mêmes titres de colonnes ou tout seulement des cases vides au dessus de ton tableau qui doit commencer à la ligne 5 et j’imagine les titres à la ligne 4, on va entrer dans la boucle à nouveau, copier/coller, incrémenter ton "iLigneCopy" … et reset à 0 ton "iligne"… qui va refaire le même check avec ton Do While, et boucler .....et partir en boucle infinie qui sera stoppé par ton iLigneCopy incrémenté qui va sortir du max de ligne dans un fichier excel et te faire une erreur de range je pense, ça concorde avec ce que tu déclares

Déjà en modifiant par

Do While Cells(iLigne, 5) <> "" 'balaye toute la colonne num?ro 5 (ici E) tant qu'il n'y a pas de caract?re nul 

''''''''''''''''''''''''''''''''''''''''''''''Ici nous allons comparé la cellule (i, 5) du fichier Matching avec les cellule de la colonne 4 de Liste des compteurs_Lyon

    Do While Workbooks("Matching.xlsm").Worksheets("SAISI").Cells(iLigne, 5) = Workbooks("Liste des compteurs_Lyon.xlsm").Worksheets("Liste des compteurs").Cells(iLigne, 4)

     Workbooks("Liste des compteurs_Lyon.xlsm").Worksheets("Liste des compteurs").Cells(iLigne, 4).Activate

            ActiveCell.EntireRow.Copy Workbooks("Matching.xlsm").Worksheets("Feuille Matching Compteur").Cells(iLigneCopy, 1) 'ici on copie colle dans la feuille créée précedement la ligne selectionnée

            Range("A1").Select

            iLigneCopy = iLigneCopy + 1

                 iLigne = iLigne + 1

    Loop

Loop

A voir si cela fait vraiment ce dont tu as besoin mais ça sera mieux je pense

Le fait de comparer avec la même variable iligne ton saisi et ta liste de compteur me parait suspect aussi, Il ne faudrait pas plutôt pour chaque ligne dans saisi, boucler sur toute ta liste de compteur lyon et recopier les valeurs identiques ? après s'ils sont unique dès qu'on a rencontré une valeur identique on pourra sortir directement de la loop mais c'est de l'optimisation

Surtout qu'à la première itération incorrect ton do while s’arrête donc ne parcours qu'une seule itération, à voir si c’est bien ce que tu cherche, ça serait plutôt un

Do Until

car tu es sur qu'il y a forcément dans la "liste des compteurs" une correspondance? Sinon ça serait une boucle sur toute la liste des compteurs tant que la cellule n'est pas vide

Par exemple rapidement tu peux nous faire un avant/après que tu désires, ici un exemple rapidos ou l'on compare 4 valeurs SAISI avec une liste de 6 compteurs (désolé la flemme d'aller sur excel et de faire un tableau je fais ici rapidos pour l'exemple):

SAISI    LISTE COMPTEUR  MATCHING
2             1             4
5             2
6             9
4             4
              8
              3
               

Sans erreur de range, ici ta macro devrait renvoyer un maching qu’avec 4 car tu compares la même iligne : 2 avec 1 puis 5 avec 2 etc alors qu’on a bien 2 numéros identiques pourtant, le compteur 2 est passé à la trap, j'imagine que pourtant tu veux le remonter nan?

Après si je comprends bien le mécanisme de ta macro et ton besoin, on peut le faire aussi via de simple formule car cela ressemble juste à une recherche V de ton numéro de saisi dans la matrice qui représente la colonne avec ton numéro de compteur de ton autre fichier. Suffit de faire un tri sur cette colonne et enlever les résultats vides pour obtenir la liste matching

La macro est au final facilement faisable je pense et cela te sortira des informations rangées et triées comme tu le sens mais à noter qu’une solution rapide et simple à mettre en place avec très peu d’erreur potentielle est possible

J’aime les macros mais il faut faire un choix entre être efficace ou efficient, cela dépends aussi du temps que tu peux accorder à développer des macros et faire de la maintenance quand tes inputs vont évoluer.

Sinon oui déjà tu peux copier une ligne sans avoir à l’activer, je n’ai pas la syntaxe exact mais

    Rows("7:7").Select
    Selection.Copy

Se traduit par

Rows("7:7").Copy

Il y a surement moyen que tu bidouilles un truc de la même façon pour ton code, après ça ne fait pas planter une macro ce genre de chose, c’est juste que cela va mettre beaucoup plus de temps si tu as énormément de ligne à traiter

En espérant être clair

ECG

Bonjour,

Merci de joindre 2 fichiers représentatifs de tes données.

Cdlt.

Bonjour,

en attendant les fichiers quelques bizarreries relevées :

Dim ThisWorkBook As Workbook

non. ThisWorkbook est un objet prédéfini et connu de vba.

1) c'est inutile

2) dans tous les cas on ne ré-utilise pas de noms connus de vba comme nom de variable, c'est source d'ennui tôt ou tard

.Cells(iLigne, 4).Activate

.Activate sur une cellule c'est douteux.

On le fait sur classeur ou feuille en cas de besoin uniquement.

Et un .Select est inutile dans 99% dans des cas.

Un exemple plus facile à lire, sans select ni activate :

    Dim shS As Workbook, shD As Workbook
    ' ...
    Set shS = Workbooks("Liste des compteurs_Lyon.xlsm").Worksheets("Liste des compteurs")    ' objet feuille source
    Set shD = Workbooks("Matching.xlsm").Worksheets("Feuille Matching Compteur")    ' objet feuille destination
    shS.Rows(iLigne).EntireRow.Copy shD.Rows(iLigneCopy)      'ici on copie colle dans la feuille créée précedement la ligne selectionnée

eric

merci à vous je regarde ça très vite en tous cas

j'avais bidouillé cela qui fonctionne mais qui n'est pas très joli je pense. je vais regarder vos différentes solutions et je reviens vers vous.

Concernant les fichier :

Sub CopieLigneCompteur()

'Application.ScreenUpdating = False 'On desactive les changements d'écrans pour plus de rapidité et de fluidité
'Application.DisplayAlerts = False 'On desactive les POP - UP

Dim iLigne      As Integer
Dim iLigneVérifié   As Integer
Dim iLigneCopy  As Integer
Dim stFichierCompteur   As String
Dim stFichierMatching   As String

iLigne = 5 'Ligne lue
iLigneVérifié = 5
iLigneCopy = 2
stFichierCompteur = "Liste des compteurs_Lyon"

Sheets.Add After:=Worksheets(Worksheets.Count) 'ajoute une feuille dans le classeur actif en fin de classeur
ActiveSheet.Name = "Feuille Matching Compteur" 'Nomme la feuille créée Feuille Matching Compteur
Worksheets("SAISI").Activate 'Rend la feuille SAISI active

Do While Workbooks("Matching.xlsm").Worksheets("SAISI").Cells(iLigne, 5) <> "" 'balaye toute la colonne num?ro 5 (ici E) tant qu'il n'y a pas de caract?re nul

''''''''''''''''''''''''''''''''''''''''''''''Ici nous allons comparé la cellule (i, 5) du fichier Matching avec les cellule de la colonne 4 de Liste des compteurs_Lyon

    Do While Workbooks("Matching.xlsm").Worksheets("SAISI").Cells(iLigne, 5) = Workbooks("Liste des compteurs_Lyon.xlsm").Worksheets("Liste des compteurs").Cells(iLigneVérifié, 4)
            Workbooks("Liste des compteurs_Lyon.xlsm").Worksheets("Liste des compteurs").Activate
            Cells(iLigneVérifié, 4).Activate
            ActiveCell.EntireRow.Copy Workbooks("Matching.xlsm").Worksheets("Feuille Matching Compteur").Cells(iLigneCopy, 1) 'ici on copie colle dans la feuille créée précedement la ligne selectionnée        
            iLigneCopy = iLigneCopy + 1
            iLigneVérifié = 0
            iLigneVérifié = 2
            iLigne = iLigne + 1
    Loop
    iLigneVérifié = iLigneVérifié + 1
    If iLigneVérifié = 32765 Then
        Workbooks("Matching.xlsm").Worksheets("SAISI").Cells(iLigne, 9) = "N'existe pas dans NView"
        iLigneVérifié = 0
        iLigneVérifié = 2
        iLigne = iLigne + 1
    End If

Loop

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Workbooks("Matching.xlsm").Worksheets("Feuille Matching Compteur").Activate
Columns("A:AD").EntireColumn.AutoFit 'ici on auto dimensionne les cellules de la feuille active
'Application.DisplayAlerts = True
'Application.ScreenUpdating = True 'On active les changements d'écrans

End Sub
52matching.xlsm (67.16 Ko)
Rechercher des sujets similaires à "2016 comparaison entre deux document different"