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 SubApplication 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
LoopA 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 Untilcar 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.CopySe traduit par
Rows("7:7").CopyIl 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 Workbooknon. 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éeeric
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