Macro pour comparer des feuille excel identiques
Rayy87
Messages postés
31
Date d'inscription
Statut
Membre
Dernière intervention
-
Rayy87 Messages postés 31 Date d'inscription Statut Membre Dernière intervention -
Rayy87 Messages postés 31 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous,
Je suis nouveau dans ce forum et débutant en VBA.
J'ai des fichiers excel ( même feuille qui est dupliquée 200 fois) et qui contiennent tous des données différentes (des renseignements de prix).
J'aimerais trouver uine macro qui pourra analyser les feuilles une par une et me classer les prix du moins cher au plus cher.
Sachant que je vais séléctionner les cellules à comparer.
J'ai quelques idées, donc pour commencer j' utilise une application.dialog qui me permet de selectionner les fichiers excel à comparer.
Ensuite avec un Do while fichier >0
Workbook.open
for each feuille in workbook.worksheets
et là je bloque ...
Pourriez vous m'aider svp?
------------
Je suis nouveau dans ce forum et débutant en VBA.
J'ai des fichiers excel ( même feuille qui est dupliquée 200 fois) et qui contiennent tous des données différentes (des renseignements de prix).
J'aimerais trouver uine macro qui pourra analyser les feuilles une par une et me classer les prix du moins cher au plus cher.
Sachant que je vais séléctionner les cellules à comparer.
J'ai quelques idées, donc pour commencer j' utilise une application.dialog qui me permet de selectionner les fichiers excel à comparer.
Ensuite avec un Do while fichier >0
Workbook.open
for each feuille in workbook.worksheets
et là je bloque ...
Pourriez vous m'aider svp?
------------
Sub Compare() Dim cell1, cell2, cell3, cell4 As Integer (mes cellules à comparer que je vais nommer) Dim lockcode As String Dim Repeat As String Dim Dialog As Office.FileDialog Dim fPath As String, fName As String, OldDir As String Dim ws As Worksheet Dim Ans As String If MsgBox("LANCEMENT DE L'APPLICATION D'ANALYSE", vbOK, "ACCES ADMINISTRATEUR") Then lockcode = InputBox("Veuillez saisir votre mot de passe administrateur", "FENÊTRE DE CONTRÔLE", vbOKCancel) If lockcode = ("Admin") Then Set Dialog = Application.FileDialog(msoFileDialogFilePicker) With Dialog .AllowMultiSelect = True .ButtonName = "Valider" .Filters.Clear .Filters.Add "Excel Files", "*.xls;*.xlw, 1" .Filters.Add "Excel Files", "*.xlsx*, 1" .Filters.Add "Excel Files", "*.xlsm*, 1" .Title = "Veuillez selectionner les fichiers à analyser" .InitialFileName = "C:\InitialPath\" .InitialView = msoFileDialogViewList (là j'arrive pas à faire fonctionner la macro uniquement sur les fichiers sélectionnés) If .Show Then If .SelectedItems.Count > 0 Then fPath = .SelectedItems(1) & "\" Ans = Application.InputBox("Voulez-vous lancer l'analyse des classeurs?" & vbLf & vbLf & _ "Saisissez OUI - pour démarrer" & vbLf & "ou NON - pour quitter l'application", "Choix de l'action à effectuer", Type:=1) If Ans = "OUI" Then MsgBox "l'analyse est en cours, veuillez patienter" Application.ScreenUpdating = True Application.DisplayAlerts = True Application.EnableEvents = True 'OldDir = CurDir ' ChDir fPath fName = Dir("*.xls") Do While Len(fName) > 0 Workbooks.Open fName For Each ws In ActiveWorkbook.Worksheets Range("Cell1").select // là je sais plus :( Next ws ActiveWorkbook.Close True fName = Dir Cnt = Cnt + 1 Loop Application.ScreenUpdating = True Application.DisplayAlerts = True Application.EnableEvents = True MsgBox Cnt & " fichiers ont été traités." Exit Sub Else: MsgBox "Le mot de passe saisi est incorrect" End If End With End If End If End Sub End Sub
A voir également:
- Macro pour comparer des feuille excel identiques
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Liste déroulante excel - Guide
- Feuille de pointage excel - Télécharger - Tableur
- Word et excel gratuit - Guide
- Verrouiller cellule excel sans verrouiller la feuille - Guide
6 réponses
Bonjour,
Regarde cette astuce : https://www.commentcamarche.net/faq/32961-vba-excel-lire-dans-un-classeur-ferme
et notamment l'exemple d'utilisation...
Regarde cette astuce : https://www.commentcamarche.net/faq/32961-vba-excel-lire-dans-un-classeur-ferme
et notamment l'exemple d'utilisation...
Merci, c'est tout à fait ce qu'il me faut.
Je vais essayer d'adapter le code et je te dirais :)
Merci encore!
Je vais essayer d'adapter le code et je te dirais :)
Merci encore!
Bonjour :)
En fait il me manques un truc.. Je veux définir une variable dans laquelle je mets une zone qui contient le n° d'un article. Et en gros ma macro doit vérifier que c'est le même numéro d'article déjà puis copier les différents prix et les coller dans une nouvelle feuille/nouveau classeur classés par n° de produit.
Donc je pense faire For each Feuille in activeWorkbook.worksheets (j'ai fait une macro qui ouvre tout les classeurs contenus dans le fichier) puis with Active.workbook.sheets(i)
If sheets.range("C3") c'est la cellule qui contient le n° du produit...
Comment est ce que je peux dire si le N° produit est le même dans toutes les feuilles?
Sachant que j'ai 200 produits donc je peux pas faire une boucle si nom produit= x, il me faut une boucle.
Je ne sais pas si je suis clair...
En fait il me manques un truc.. Je veux définir une variable dans laquelle je mets une zone qui contient le n° d'un article. Et en gros ma macro doit vérifier que c'est le même numéro d'article déjà puis copier les différents prix et les coller dans une nouvelle feuille/nouveau classeur classés par n° de produit.
Donc je pense faire For each Feuille in activeWorkbook.worksheets (j'ai fait une macro qui ouvre tout les classeurs contenus dans le fichier) puis with Active.workbook.sheets(i)
If sheets.range("C3") c'est la cellule qui contient le n° du produit...
Comment est ce que je peux dire si le N° produit est le même dans toutes les feuilles?
Sachant que j'ai 200 produits donc je peux pas faire une boucle si nom produit= x, il me faut une boucle.
Je ne sais pas si je suis clair...
Il faut passer par un site de pièce jointe tel que https://www.cjoint.com/
Va sur ce site,
Clic sur parcourir
Cherche ton fichier
clic sur ouvrir
Clic sur "Créer le lien cjoint"
Copier le lien
Revenir ici le coller dans une réponse...
Va sur ce site,
Clic sur parcourir
Cherche ton fichier
clic sur ouvrir
Clic sur "Créer le lien cjoint"
Copier le lien
Revenir ici le coller dans une réponse...
teste déjà ceci :
'déclaration des variables Dim ws As Worksheet Dim i As Integer Dim Tbl() 'blablabla 'ton début de code ici 'la boucle sur toutes les feuilles du classeur ouvert For Each ws In ActiveWorkbook.Worksheets With ws If .Range("T6").Value <> 0 Then i = i + 1 ReDim Preserve Tbl(1 To 3, 1 To i) Tbl(2, i) = .Range("C3") 'n° lot Tbl(1, i) = .Range("D6") 'Nom entreprise Tbl(3, i) = .Range("T6") 'montant global End If End With Next 'blabla 'classeur suivant 'etc 'restitution des données récoltées dans la Feuil1 du classeur analyse '!!!!Attention analyse.xslx devient analyse.xlsm puisque tu y enregistres cette macro MsgBox Cnt & " fichiers ont été traités." Workbooks("analyse_des_offres.xlsm").Sheets("Feuil1").Range("A2").Resize(UBound(Tbl, 2), 3) = Application.Transpose(Tbl)
J'arrive pas à compiler :(
Les .range ne marchent du coup j'ai mis ws.range vu que ws c'est la variable qui contient le classeur ouvert nn?
https://www.cjoint.com/?3FmpM03hiSU
Les .range ne marchent du coup j'ai mis ws.range vu que ws c'est la variable qui contient le classeur ouvert nn?
https://www.cjoint.com/?3FmpM03hiSU
J'ai tester, j'ai plus d'erreur par contre ça ne fait rien :(
Une fenêtre s'ouvre bien et je séléctionne les fichiers à traiter, puis rien ...
Tu peux jetter un coup d'oeil stp?
https://www.cjoint.com/?3Fmp37yxkNu
Une fenêtre s'ouvre bien et je séléctionne les fichiers à traiter, puis rien ...
Tu peux jetter un coup d'oeil stp?
https://www.cjoint.com/?3Fmp37yxkNu
avec les fichiers que tu m'as transmis, j'ai essayé le code donné plus haut, il fonctionne.
Je te le remets ici, avec tes propres codes intégrés...
Je l'ai pas mal modifié, mais teste pour voir
Je te le remets ici, avec tes propres codes intégrés...
Option Explicit Sub Test() Dim lockcode As String Dim Dialog As Office.FileDialog Dim Repeat As String Dim fPath As String, fName As String, OldDir As String Dim Cnt As Long Dim cell1, cell2, cell3, cell4 As Boolean Dim ligne As Integer Dim colonne As Integer Dim Chemin As String, Fichier As String Dim i As Integer Dim ws As Worksheet Dim Tbl() Chemin = "D:\8710839D\Desktop\Analyse" Fichier = "Analyse_des_offres.xlsm" If MsgBox("LANCEMENT DE L'APPLICATION D'ANALYSE", vbOK, "ACCES ADMINISTRATEUR") Then lockcode = InputBox("Veuillez saisir votre mot de passe administrateur", "FENÊTRE DE CONTRÔLE", vbOKCancel) If lockcode = ("AdminXXXX") Then Set Dialog = Application.FileDialog(msoFileDialogFilePicker) With Dialog .AllowMultiSelect = True .ButtonName = "Valider" .Filters.Clear .Filters.Add "Excel Files", "*.xls;*.xlw, 1" .Filters.Add "Excel Files", "*.xlsx*, 1" .Filters.Add "Excel Files", "*.xlsm*, 1" .Title = "Veuillez selectionner les fichiers à traiter" .InitialFileName = "C:\InitialPath\" .InitialView = msoFileDialogViewList If .Show Then If .SelectedItems.Count > 0 Then fPath = .SelectedItems(1) & "\" Do While Len(fName) > 0 Workbooks.Open fName For Each ws In ActiveWorkbook.Worksheets If ws.Name <> ("Lisez moi") Then If ws.Name <> ("Paramètres") Then With ws If .Range("T6").Value <> 0 Then i = i + 1 ReDim Preserve Tbl(1 To 3, 1 To i) Tbl(2, i) = .Range("C3") 'n° lot Tbl(1, i) = .Range("D6") 'Nom entreprise Tbl(3, i) = .Range("T6") 'montant global End If End With End If End If Next ws ActiveWorkbook.Close True fName = Dir Cnt = Cnt + 1 Loop End If MsgBox Cnt & " fichiers ont été traités." Workbooks("analyse_des_offres.xlsm").Sheets("Feuil1").Range("A2").Resize(UBound(Tbl, 2), 3) = Application.Transpose(Tbl) End With End If End If End Sub
Je l'ai pas mal modifié, mais teste pour voir
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Essaye comme ceci :
Cordialement,
Franck
Sub Compare() Dim lockcode As String 'Mot de passe Dim Dialog As Office.FileDialog 'Boite de dialogue sélection de fichiers Dim Cptr As Integer 'Nombre de fichiers traités Dim ws As Worksheet 'Feuilles Dim Tbl() 'Variable tableau de recueil des données Dim i As Long 'indentation de la variable tableau Tbl() If MsgBox("LANCEMENT DE L'APPLICATION D'ANALYSE", vbOK, "ACCES ADMINISTRATEUR") Then lockcode = InputBox("Veuillez saisir votre mot de passe administrateur", "FENÊTRE DE CONTRÔLE", vbOKCancel) If lockcode = ("Admin") Then Set Dialog = Application.FileDialog(msoFileDialogFilePicker) With Dialog .AllowMultiSelect = True .ButtonName = "Valider" .Filters.Clear .Filters.Add "Excel Files", "*.xls;*.xlw, 1" .Filters.Add "Excel Files", "*.xlsx*, 1" .Filters.Add "Excel Files", "*.xlsm*, 1" .Title = "Veuillez selectionner les fichiers à analyser" .InitialFileName = "C:\InitialPath" .InitialView = msoFileDialogViewList .Show For Cptr = 1 To Application.FileDialog(msoFileDialogFilePicker).SelectedItems.Count Workbooks.Open Application.FileDialog(msoFileDialogFilePicker).SelectedItems(Cptr) For Each ws In ActiveWorkbook.Worksheets If ws.Name <> ("Lisez moi") Then If ws.Name <> ("Paramètres") Then With ws If .Range("T6").Value <> 0 Then i = i + 1 ReDim Preserve Tbl(1 To 3, 1 To i) Tbl(2, i) = .Range("C3") 'n° lot Tbl(1, i) = .Range("D6") 'Nom entreprise Tbl(3, i) = .Range("T6") 'montant global End If End With End If End If Next ws ActiveWorkbook.Close True Next MsgBox Cptr & " fichiers ont été traités." Workbooks("analyse_des_offres.xlsm").Sheets("Feuil1").Range("A2").Resize(UBound(Tbl, 2), 3) = Application.Transpose(Tbl) End With End If End If End Sub
Cordialement,
Franck
C'est bon j'ai utilisé
Sheets(str_Onglet).Range("H39:P" & long_DerniereLigne).Select
Sheets(str_Onglet).Rows(str_RowsPaste).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Et ça marche du coup :)))
Par contre une autre question.... J'arrive pas à faire marcher cette imbrication
=SI(I36>0;SI(ESTVIDE(H36));SI(estvide(h37));si(estvide(h38));si(estvide(h39));si(estvide(h40));si(estvide(h41));"Veuillez renseigner les champs-> ";"")
Je ne veux pas utiliser de vba dans ce fichier... Tu as une autre solution?
Sheets(str_Onglet).Range("H39:P" & long_DerniereLigne).Select
Sheets(str_Onglet).Rows(str_RowsPaste).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Et ça marche du coup :)))
Par contre une autre question.... J'arrive pas à faire marcher cette imbrication
=SI(I36>0;SI(ESTVIDE(H36));SI(estvide(h37));si(estvide(h38));si(estvide(h39));si(estvide(h40));si(estvide(h41));"Veuillez renseigner les champs-> ";"")
Je ne veux pas utiliser de vba dans ce fichier... Tu as une autre solution?
deux choix comme je ne sais pas ce que tu veux faire :
=SI(I36>0;SI(OU(ESTVIDE(H36);ESTVIDE(H37);ESTVIDE(H38);ESTVIDE(H39);ESTVIDE(H40);ESTVIDE(H41));"Veuillez renseigner les champs-> ";"");"valeur si I36<0")
ou
=SI(I36>0;"valeur si I36>0";SI(OU(ESTVIDE(H36);ESTVIDE(H37);ESTVIDE(H38);ESTVIDE(H39);ESTVIDE(H40);ESTVIDE(H41));"Veuillez renseigner les champs-> ";""))
=SI(I36>0;SI(OU(ESTVIDE(H36);ESTVIDE(H37);ESTVIDE(H38);ESTVIDE(H39);ESTVIDE(H40);ESTVIDE(H41));"Veuillez renseigner les champs-> ";"");"valeur si I36<0")
ou
=SI(I36>0;"valeur si I36>0";SI(OU(ESTVIDE(H36);ESTVIDE(H37);ESTVIDE(H38);ESTVIDE(H39);ESTVIDE(H40);ESTVIDE(H41));"Veuillez renseigner les champs-> ";""))
Génial, ça a marché.
En fait je veux que tant que une de ces cellules sont vides que ça affiche un message a côte.
Encore une question... (j'abuse? :$)
Sheets(i).Name = "Lot n° " & Sheets(i).Range("C3").Value & Sheets(i).Range("D3").Value
je peux utiliser & ""& pour mettre un esapce entre Sheets(i).Range("C3").Value et Sheets(i).Range("D3").Value ?
En fait je veux que tant que une de ces cellules sont vides que ça affiche un message a côte.
Encore une question... (j'abuse? :$)
Sheets(i).Name = "Lot n° " & Sheets(i).Range("C3").Value & Sheets(i).Range("D3").Value
je peux utiliser & ""& pour mettre un esapce entre Sheets(i).Range("C3").Value et Sheets(i).Range("D3").Value ?
:D
J'ai commencé cette procédure pour dupliquer une feuille et la renommer.
Ca bloque je pense sur une questoin de nom incorrect.
Sub dupliquer_feuilles()
Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
With fDialog
'Allow user to make multiple selections in dialog box.
.AllowMultiSelect = True
.ButtonName = "Valider"
'Set the title of the dialog box.
.Title = "Veuillez selectionner les fichiers à traiter"
'Clear out the current filters, and add our own.
.Filters.Clear
.Filters.Add "Excel Files", "*.xls;*.xlw, 1"
.Filters.Add "Excel Files", "*.xlsx, 1"
.Filters.Add "Excel Files", "*.xlsm, 1"
.Filters.Add "All Files", "*.*"
.InitialFileName = "C:\InitialPath\"
.InitialView = msoFileDialogViewList
'Show the dialog box. If the .Show method returns True, the
'user picked at least one file. If the .Show method returns
'False, the user clicked Cancel.
If .Show = True Then
If .SelectedItems.Count > 0 Then
fPath = .SelectedItems(1) & "\"
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False
'Loop through each file selected and add it to the list box.
For Each varFile In .SelectedItems
Workbooks.Open varFile
'Procédure duplication de la feuille Lot n° x
nomb = InputBox("Nombre de fois que vous souhaitez dupliquer la feuille", "Nombre")
nomb = nomb - 1
With varFile
For i = 1 To Sheets.Count
If Sheets(i).Name <> ("Lisez moi") Then
If Sheets(i).Name <> ("Paramètres") Then
For j = 1 To nomb
Sheets(ongl & " " & i).Select
Sheets(ongl & " " & i).Copy After:=Sheets(i + 2)
ActiveSheet.Name = ongl & " " & i + 1
Next j
End If
End If
Next
End With
Next
End If
End If
End With
End Sub
J'ai commencé cette procédure pour dupliquer une feuille et la renommer.
Ca bloque je pense sur une questoin de nom incorrect.
Sub dupliquer_feuilles()
Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
With fDialog
'Allow user to make multiple selections in dialog box.
.AllowMultiSelect = True
.ButtonName = "Valider"
'Set the title of the dialog box.
.Title = "Veuillez selectionner les fichiers à traiter"
'Clear out the current filters, and add our own.
.Filters.Clear
.Filters.Add "Excel Files", "*.xls;*.xlw, 1"
.Filters.Add "Excel Files", "*.xlsx, 1"
.Filters.Add "Excel Files", "*.xlsm, 1"
.Filters.Add "All Files", "*.*"
.InitialFileName = "C:\InitialPath\"
.InitialView = msoFileDialogViewList
'Show the dialog box. If the .Show method returns True, the
'user picked at least one file. If the .Show method returns
'False, the user clicked Cancel.
If .Show = True Then
If .SelectedItems.Count > 0 Then
fPath = .SelectedItems(1) & "\"
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False
'Loop through each file selected and add it to the list box.
For Each varFile In .SelectedItems
Workbooks.Open varFile
'Procédure duplication de la feuille Lot n° x
nomb = InputBox("Nombre de fois que vous souhaitez dupliquer la feuille", "Nombre")
nomb = nomb - 1
With varFile
For i = 1 To Sheets.Count
If Sheets(i).Name <> ("Lisez moi") Then
If Sheets(i).Name <> ("Paramètres") Then
For j = 1 To nomb
Sheets(ongl & " " & i).Select
Sheets(ongl & " " & i).Copy After:=Sheets(i + 2)
ActiveSheet.Name = ongl & " " & i + 1
Next j
End If
End If
Next
End With
Next
End If
End If
End With
End Sub