Créer des "Variables qui varient"
Bonjour à tous,
En tant que debutant, je suis à la recherche d'une methode pour avoir une variable variable.
Je m'explique :
je desire intégrer dans une boucle while (ou Until) un : IF A=B then
Le probleme, c'est que j'aimerais que A corresponde à la cellule active dans le Workbook("CGR") ; et que B corresponde à la cellule active dans le Workbook("Global").
Sachant que dans les instructions de mon IF, ces cellules actives bougent (pour pouvoir continuer la boucle).
j'ai tenté plusieurs trucs, mais sans succes. Je pense que la réponse se trouve dans la manière de formuler les variables, mais ca ne fonctionne pas. Pour l'instant, voici mon code :
Workbooks("CGR").Activate
Worksheets("Try").Range("E10").Activate
Dim A As Workbook
Set wb1 = Workbooks("CGR")
Dim ws1 As Worksheet
Set ws1 = Worksheets("Try")
Dim A As Object
Set A = wb1.ws1.ActiveCell
Workbooks("Global").Activate
Worksheets("PTE").Range("S332").Activate
Dim wb2 As Workbook
Set wb2 = Workbooks("Global")
Dim ws2 As Worksheet
Set ws2 = Worksheets("PTE")
Dim B As Object
Set B = wb2.ws2.ActiveCell
Do Until B = ""
If A Like B Then
Workbooks("CGR").Activate
ActiveCell.Offset(1, 0).Select
Workbooks("Global").Activate
ActiveCell.Offset(0, 1).Select
Else: Workbooks("CGR").Activate
Selection.Interior.Color = RGB(0, 255, 0)
ActiveCell.Offset(1, 0).Select
Workbooks("Global").Activate
ActiveCell.Offset(0, 1).Select
End If
Loop
Je peux probablement regrouper les wb et ws, mais ca me permet d'y voir plus clair....
Désolé de ne pas mettre de fichier exemple, je ne peux pas divulguer les données, et changer les données mettrait bien du temps.
J'espère toutefois que c'est assez clair....
Merci d'avance !
Salut BeauPère,
quelques remarques sur ton code qui pourraient, j'espère, t'aider car je n'ai encore jamais chipoté avec ce genre de manip'.
Dim B As Object
Set B = wb2.ws2.ActiveCell
Do Until B = ""
If A Like B Then
1. Workbooks("CGR").Activate
2. ActiveCell.Offset(1, 0).Select
3. Workbooks("Global").Activate
4. ActiveCell.Offset(0, 1).Select- Tu ne déclares pas A ?
- les lignes 1 à 4 devraient, à mon sens, être mises juste après "Do Until B "" pour que IF A LIKE B puisse les évaluer.
- Est-il nécessaire d'activer à chaque fois les classeurs si ils sont déjà ouverts? Chercher les infos sans les activer n'est-il pas suffisant? (Je pose la question, n'ayant jamais, comme dit plus haut, essayer ce genre de manip'!
Sans prétention.
A lire de bonnes nouvelles!
Bien à toi.
Bonsoir,
J'ai pas tout lu ! C'est pas très lisible !!!
1) Première règle de rédaction d'une procédure : toutes les déclarations en tête de la procédure.
Et inutile de déclarer une variable par ligne, tu peux en mettre plusieurs par ligne, voir toutes sur la même ligne (juste une question de visibilité), sachant que le type doit être indiqué pour chacune (quand pas indiqué, le type est Variant).
2) Déclarer une variable As Object est à éviter lorsque l'objet est parfaitement identifié. Une cellule, c'est une objet Range.
3) ActiveCell est une propriété de l'objet Application (ou de l'objet Window), qui renvoie la cellule active de la fenêtre active, soit la cellule active de la feuille active du classeur actif. Ce n'est une propriété de l'objet Worksheet (ni de l'objet Workbook).
Après un tel début, sans avoir lu la suite, tu vas au devant de difficultés... Une variable est variable par définition. Elle varie lorsque une instruction modifie sa valeur.
Cordialement.
Re,
Je me suis un peu forcé à lire jusqu'au bout...
Après élimination du code inutile et corrections, il reste :
Dim A As Range, B As Range
Set A = Workbooks("CGR").Worksheets("Try").Range("E10")
Set B = Workbooks("Global").Worksheets("PTE").Range("S332")
Do Until B.Value = ""
If Not A.Value Like B.Value Then A.Interior.Color = RGB(0, 255, 0)
Set A = A.Offset(1, 0)
Set B = B.Offset(0, 1)
Loopqui devrait fonctionner si les objets auxquels ça s'applique le permettent.
Cordialement.
Bonsoir MFerrand,
je mets ton code de côté pour mon info et apprentissage personnels mais avec du temps et plus de pratique d'Excel, c'est effectivement ce que j'aurais écrit!
Respect.
A+
Bonjour MFerrand,
Comme l'a déjà dit Curulis57, Respect !
J'ai mis plusieurs jours à arriver à mon résultat. Le tien a beaucoup plus d'avenir :p
Merci beaucoup !
Pas trop !
Je n'aurais pas écrit spontanément il y a 20 ans ce que je peux écrire aujourd'hui... et je n'ai pas la prétention d'être un "pro" du codage, je croise assez souvent encore du code qui m'interroge... Il est sûr que les échanges permettent de progresser et qu'on a toujours quelque chose à apprendre... sur ce qu'on sait déjà !
Au vu de beaucoup de code qui circule, le message qui me paraît prioritaire à faire passer est de s'éloigner du type d'instructions issues de l'enregistreur. Ce dernier en effet enregistre ce qu'on l'on fait, c'est à dire reproduit une action telle qu'on peut la réaliser manuellement. En sortir pour la réaliser autrement est indispensable pour progresser. En s'affranchissant des procédures manuelles tout va ensuite beaucoup plus vite, cela ouvre en tout cas des horizons.
Pour autant, l'enregistreur n'est pas à jeter aux oubliettes. Il permet d'élucider des points de syntaxe sur lesquels on bute parfois, et que l'on peut alors réécrire autrement.
Bonne journée à vous.