Changer de classeur en VB dans Excel

drouault Messages postés 73 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 14 août 2007 - 18 juil. 2005 à 13:53
cs_69chris Messages postés 318 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 30 décembre 2005 - 18 juil. 2005 à 16:48
Bonjour, j'ai besoin de me déplacer dans deux classeurs pour réaliser des opérations.
J'ai déclaré ces deux classeurss par :

Private WitEvents Class_Export as Excel.Workbook
Private WitEvents Class_Bord as Excel.Workbook

Ensuite quand je veux rendre actif l'un ou l'autre des deux classeurs pour les balayer, j'utilise:

Set Class_bord = ActiveWorkBook

Je lance ma boucle pour balayer une colonne dans le premier fichier, puis je lance une deuxiéme boucle à l'intérieur de la premiere boucle pour balayer le deuxième fichier afind e tester des correspondances et faire un comptage du nombre de correspondances.
Or je n'arrive pas à rendre actif le classeur que je souhaite, le premier ouvert reste toujours actif. Comment faire??
Et si quelqu'un à d'autres idées c'est le bienvenue car cette méthode est assez lourde pour l'ordinateur en temps d'éxécution.
Merci d'avance

Pierre

3 réponses

cs_69chris Messages postés 318 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 30 décembre 2005 1
18 juil. 2005 à 14:17
Bonjour Pierre,



Pourquoi rendre le classeur actif? Je ne pense pas que ce soit nécessaire.

Les deux variables Class_Export et Class_Bord permettent d'accéder
directement aux cellules qui les composents comme on le fait avec
ActiveWorkbook.



D'autre part, l'affectation :

Set Class_Bord = ActiveWorkbook me parrait inversé.

Pour rendre actif Class_Bord, j'utiliserais :



Class_Bord.Activate()
0
drouault Messages postés 73 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 14 août 2007
18 juil. 2005 à 16:32
Merci d'avoir jeter un oeil 69chris. Je ne vois pas comment me passer de l'activation car je vois pas où lui préciser que je change de classeur dans la boucle. Je t'ai mis mon bout de code si t'as un peu de temps pour regarder.
Et j'ai essayé de passer par une formule sur la fin mais ça ne marche pas mieux.

Dsl suis débutant en VB avec Excel.
Merci d'avance

18/07/2005 Code par balayage des cellules



Dim i As Long
Dim j As Long
Dim Code_art_bord As String
Dim Code_art_export As String
Dim compteur As Long
compteur = 0
'On rend le classeur et feuille actif sur lequel on souhaite balayer les enregistrements (fichier bordereau)
Set Class_bord = ActiveWorkbook
'Set Detail_art = ActiveWorkSheet
'On boucle dans cette plage pour balayer les codes articles
For i = 7 To 15
Code_art_bord = Cells(i, 6)

Set Class_Export = ActiveWorkbook
For j = 6 To 15
Code_art_export = Cells(j, 6)
Next j

Set Class_bord = ActiveWorkbook

If Code_art_bord = Code_art_export Then
compteur = compteur + 1
End If
MsgBox (compteur)

Next i


18/07/2005
Code avec l'utilisation d'une formule


Dim Col_calc_bord As Range
Set Col_calc_bord = Range(Cells(7, 11), Cells(250, 11))


Col_calc_bord.FormulaLocal = "=SUMIF([EXPORT.XLS]RAPPORT!R6C6:R15C6,RC[-10],[EXPORT.XLS]RAPPORT!R6C4:R15C4)"
Col_calc_bord.Calculate
0
cs_69chris Messages postés 318 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 30 décembre 2005 1
18 juil. 2005 à 16:48
Pour moi, ça doit donner quelque chose comme ça. (j'ai modifier l'emplacement de comptage).

J'ai pas trop le temps de tester...

L'iddée , c'est d'utiliser l'accès aux cellule depuis le classeur
"wrkbook.Cells()". Comme ça, pas besoin d'activer. au passage, Set
Class_Export = ActiveWorkbook définit Class_Export au classeur
actif.... Pas trop ce que tu veux non? La méthode Activate est plus
adapté. N'ésite pas à consulter l'aide même si elle est pas sur sympa,
ça donne déjà une idée des méthodes/propriétés utilisables.



Workbooks(1) et (2) permet d'affecter le bon classeur à la bonne variable. A moins que ça soit déjà fait.



Pour "voire" un peu mieux, utilise le débuggeur. Point d'arret en
cliquant sur le côté gauche de l'éditeur et ensuite clicque droit sur
une variable et "ajouter un espion". La valeur s'affiche dans un
bandeau en dessous.







Dim iCptBord As Long

Dim iCptArt As Long

Dim Code_art_bord As String

Dim Code_art_export As String

Dim compteur As Long

Set Class_Export = Workbooks(1)

Set Class_bord = Workbooks(2)



compteur = 0

'On boucle dans cette plage pour balayer les codes articles

For iCptBord= 7 To 15

Code_art_bord = Class_bord.Cells(iCptBord, 6)



For iCptArt = 6 To 15

Code_art_export = Class_Export.Cells(iCptArt, 6)



If Code_art_bord = Code_art_export Then

compteur = compteur + 1

End If



Next iCptArt



MsgBox (compteur)



Next iCptBord
0