Comparaison de 2 classeurs: ouverture de ces classeurs
Bonjour tout le monde,
je cherche a comparer les valeurs de cellules de 2 fichiers differents, mais je pense que je ne sais toujours pas les ouvrir malgre les differents cas trouves sur differents forums: j'ai une erreur d'execution 424 "objet requis" lors de l'affectation du fichier de depart (wk1) d'ou je lance le code:
Sub Step2()
' Partie declaration de variables
Dim ws1 As Worksheet, ws2 As Worksheet
Dim wk1 As Workbook, wk2 As Workbook
Dim Cel1 As Range, Cel1s As Range
Dim Cel2 As Range, Cel2s As Range
Dim i1 As Long, i2 As Long, nl1 As Long, nl2 As Long
Dim i As Long, al As Long
Dim text As String
' Declaration du classeur d'entree
Set wk1 = Workbook.Open("C:\Users\katia\Desktop" & "Tableau suivi obso Test.xlsm")
' Declaration de la feuille qui contient les donnees: ws1
Set ws1 = Worksheets("Substance")
' Declaration du classeur de destination
Set wk2 = Workbook.Open("C:\Users\katia\Desktop" & "Arborescence.xlsx")
' Declaration de la feuille de destination
Set ws = wb.Sheets("Arbo")
' Determination du nombre de lignes du fichier de depart
wk1.ws1.Activate
nl1 = Range("K" & Rows.Count).End(xlUp).Row
MsgBox ("Nombre de ligne fichier depart:" & nl1)
' Determination du nombre de lignes dans le fichier d'arrivee
wk2.ws2.Activate
nl2 = Range("C" & Rows.Count).End(xlUp).Row
MsgBox ("Nombre de ligne fichier arrivee:" & nl2)
' Determination du nombre de lignes
Set Cel1s = ws1.Range("K5" & ":K" & nl1)
i = 1
For Each Cel1 In Cel1s
If Not IsEmpty(Cel1) Then
text = Cel1.Offset(0, -2)
MsgBox (i & " --> " & Cel1 & " texte= " & text)
End If
i = i + 1
Next Cel1
End SubJ'ajoute ne pas etre du tout familier avec Windows en general et VBA en particulier... c'est pourquoi la structure du programme peut vous paraitre stupide...
Merci de votre aide, Philippe.
- Messages
- 3'678
- Excel
- 365, 2019
- Inscrit
- 11/04/2020
- Emploi
- Formateur bureautique, dvpt de fichiers
Hello,
Déjà,
' Declaration du classeur d'entree
Set wk1 = Workbook.Open("C:\Users\katia\Desktop" & "Tableau suivi obso Test.xlsm")
Set ws1 = Worksheets("Substance")
' Declaration du classeur de destination
Set wk2 = Workbook.Open("C:\Users\katia\Desktop" & "Arborescence.xlsx")Tu n'as pas d'antislash entre desktop et le nom de ton fichier, je ne vois pas comment il peut aller plus loin.
En plus, si le nom du fichier n'est pas dans une variable, aucune raison de partager ton code en 2 parties.
Essaie :
' Declaration du classeur d'entree
Set wk1 = Workbook.Open("C:\Users\katia\Desktop\Tableau suivi obso Test.xlsm")
Set ws1 = Worksheets("Substance")
' Declaration du classeur de destination
Set wk2 = Workbook.Open("C:\Users\katia\Desktop\Arborescence.xlsx")Merci de ta reponse JoyeuxNoel, mais cela ne fonctionne pas, meme en "concatenant" les 2 chaines avec le "\"... j'ai toujours le meme type d'erreur...
Vu le message d'erreur, je me demandais si les wk, declares en workbook, n'avaient pas une autre nature?
Je ne suis pas assez familier avec VBA pour bien comprendre la nature des differentes variables...
Si vous avez d'autrs idees je suis preneur ^^'
- Messages
- 3'678
- Excel
- 365, 2019
- Inscrit
- 11/04/2020
- Emploi
- Formateur bureautique, dvpt de fichiers
Oh, je me suis focalisé sur le chemin et je n'ai pas fait attention à ça :
c'est Workbooks.open, avec un s à la fin.
Ah oui, c'est beaucoup mieux, merci infiniment :)
Comment savoir s'il ouvre effectivement ces 2 fichiers (dont le courant ici, j'espere qu'ouvrir un fichier deja ouvert ne pose pas de probleme)? Car je veux faire imprimer le nombre de lignes du fichier de depart et de celui de destination, mais rien ne se produit?
Je redonne le code car je me suis apercu qu'il y avait des erreurs dans certains noms de variables de la partie declaration (toutes ces variables ne servent pas encore!).
Merci encore!
Sub Step2()
' Partie declaration de variables
Dim ws1 As Worksheet, ws2 As Worksheet
Dim wk1 As Workbook, wk2 As Workbook
Dim Cel1 As Range, Cel1s As Range
Dim Cel2 As Range, Cel2s As Range
Dim i1 As Long, i2 As Long, nl1 As Long, nl2 As Long, nl As Long
Dim i As Long, al As Long
Dim text As String
' Declaration du classeur d'entree
Set wk1 = Workbooks.Open("C:\Users\katia\Desktop\Tableau suivi obso Test.xlsm")
' Declaration de la feuille qui contient les donnees: ws1
Set ws1 = Worksheets("Substance")
' Declaration du classeur de destination
Set wk2 = Workbooks.Open("C:\Users\katia\Desktop\" & "Arborescence.xlsx")
' Declaration de la feuille de destination
Set ws2 = wk2.Workdheets("Arbo")
' Determination du nombre de lignes du fichier de depart
wk1.ws1.Activate
nl1 = Range("K" & Rows.Count).End(xlUp).Row
MsgBox ("Nombre de ligne fichier depart:" & nl1)
' Determination du nombre de lignes dans le fichier d'arrivee
wk2.ws2.Activate
nl2 = Range("C" & Rows.Count).End(xlUp).Row
MsgBox ("Nombre de ligne fichier arrivee:" & nl2)
' Parcourt de la colonne K
wk1.ws1.Activate
Set Cel1s = ws1.Range("K5" & ":K" & nl1)
i = 1
For Each Cel1 In Cel1s
If Not IsEmpty(Cel1) Then
text = Cel1.Offset(0, -2)
MsgBox (i & " --> " & Cel1 & " texte= " & text)
End If
i = i + 1
Next Cel1
End Sub- Messages
- 3'678
- Excel
- 365, 2019
- Inscrit
- 11/04/2020
- Emploi
- Formateur bureautique, dvpt de fichiers
Alors non, si un des fichiers est le fichier actif, il faudra que tu mettes
Set wk1 = activeworkbookCa peut etre wk2, bien entendu.
À aucun moment tu ne lui demandes d'imprimer.
T'as l'air de faire une usine à gaz pour pas grand chose, non?
J'ai d'enormes lacunes: je pensais que
wk1.ws1.Activatepermettait d'avoir le bon classeur & la bonne feuille actifs (et de meme pour wk2.ws2 pour le classeur de destination), mais je ne comprends pas pourquoi cela ne fonctionne pas? Quelle difference (a part la syntaxe differente) avec
Set wk1 = activeworkbookPar deformation d'autres langages, je pensais que la syntaxe wk1.ws1.Activate ouvrait et rendait "actif" le fichiers avec la feuille qui nous interesse, mais cela ne semble pas etre le cas...
Cela est une usine a gaz car le programme doit parcourir 2 colonnes du fichier 1 cellule par cellule, et comparer chacune de ces cellules aux valeurs des cellules d'une colonne du fichier 2, si c'est egal alors il faut inscrire un commentaire du fichier 1 dans le fichier 2.... Quand ca marchera il sera temps de voir comment le simplifier ;)
Pour l'instant, le code explorait les colonnes du fichier 1 et donnait le nombre de lignes a explorer ainsi que le contenu des cellules de la colonne K. J'ai commence a ecrire le programme sans variable de worknook ou worksheet et ce que je voulais fonctionne correctement, c'est le passage d'un classeur a l'autre qui semble est le noeud du probleme...
- Messages
- 3'678
- Excel
- 365, 2019
- Inscrit
- 11/04/2020
- Emploi
- Formateur bureautique, dvpt de fichiers
Sinon, tu peux essayer de t'inspirer de ça, qui marche :
Sub test()
Dim ws1, ws2 As Worksheet
Set ws1 = ThisWorkbook.Worksheets("Substance")
ws1.Activate
Set ws2 = Workbooks.Open("C:\Users\katia\Desktop\Arborescence.xlsx").Worksheets("Arbo")
Ws2.activate
End SubMais effectivement, si un spécialiste peut expliquer pourquoi Wk1.ws1.activate ne fonctionne pas, je suis preneur !
Et attention, tu as écrit Workdheets
Set ws2 = wk2.Workdheets("Arbo")Ce que tu propose fonctionne en effet tres bien:
' Declaration du classeur d'entree
' Set wk1 = Workbooks.Open("C:\Users\katia\Desktop\Tableau suivi obso Test.xlsm")
' Declaration de la feuille qui contient les donnees: ws1
Set ws1 = Worksheets("Substance")
nl1 = Range("K" & Rows.Count).End(xlUp).Row
MsgBox ("Nombre de ligne fichier depart: " & nl1)
' Declaration du classeur de destination
Set wk2 = Workbooks.Open("C:\Users\katia\Desktop\" & "Arborescence.xlsx")
' Declaration de la feuille de destination
Set ws = wk2.Worksheets("Arbo")
nl2 = Range("C" & Rows.Count).End(xlUp).Row
MsgBox ("Nombre de ligne fichier arrivee: " & nl2)Mais cela risque de ne pas repondre a mon probleme, puisqu'il me faut naviguer entre les 2 classeurs pour chaque colonne. C'est pour cela qu'il y a une boucle qui me permet d'explorer les cellules de la colonne K du fichier 1, mais pour chaque cellule je dois pouvoir lire les cellules du fichier 2 afin de les comparer: il faut donc que je passe a chaque increment d'un fichier a l'autre, et pour l'instant je ne vois pas comment... je pensais mettre dans la boucle le "activate", que je trouvais deja lourd, mais si en plus il faut redefinir a chaque fois les wk et ws cela me parait encore plus lourd...
Je vais tacher de regarder cela de plus pres, s'il y a des idees je suis preneur!
Et en tous les cas merci JoyeuxNoel, je suis redevenu optimiste!