Excel VBA - récupérer des variables textes

Résolu/Fermé
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 - 26 avril 2010 à 11:59
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 - 26 avril 2010 à 14:17
Bonjour à tous,

J'ai une macro en Excel 2003 qui fonctionne bien mais que je désire simplifier.
Elle utilise des variables qui sont déclarées en tant que string qui récupèrent des adresses sous forme de texte.
Les premières lignes de codes sont les suivantes :

With Sheets("Collecte des données")
Tor1 = .Range("W78").Text
Tor2 = .Range("W79").Text
Tor3 = .................

Lie1 = .Range("W86").Text
Lie2 = .Range("W87").Text
Lie3 = ..................

End With

If Tor1 = "#N/A" Then
ActiveSheet.Range("R13").Value = "BlaBlaBla1"
Else
Sheets("Parc").Range(Tor1).Copy Destination:=Range("R13")
End If

If Lie1 = "#N/A" Then
ActiveSheet.Range("R15").Value = "BlaBlaBla2"
Else
Sheets("Parc").Range(Lie1).Copy Destination:=Range("R15")
End If

If Tor2 = "#N/A" Then
ActiveSheet.Range("R19").Value = "BlaBlaBla1"
Else
Sheets("Parc").Range(Tor2).Copy Destination:=Range("R19")
End If

If Lie2 = "#N/A" Then
ActiveSheet.Range("R21").Value = "BlaBlaBla2"
Else
Sheets("Parc").Range(Lie2).Copy Destination:=Range("R21")
End If

etc...

La macro finale est assez longue et les opérations étant les mêmes aux références de cellules près, je cherche à faire une boucle pour la simplifier, et c'est là que je coince car je ne sais pas comment récupérer proprement mes variables .... variables !
Voici mon code :

LigT = 13
LigL = 15

For Num = 1 To 5

If ("Tor" & Num) = "#N/A" Then
ActiveSheet.Range("R" & LigT).Value = "BlaBlaBla1"
Else
Sheets("Parc").Range("Tor" & Num).Copy Destination:=Range("R" & LigT)
End If

If ("Lie" & Num) = "#N/A" Then
ActiveSheet.Range("R" & LigL).Value = "BlaBlaBla2"
Else
Sheets("Parc").Range("Lie" & Num).Copy Destination:=Range("R" & LigL)
End If

LigT = LigT + 6
LigL = LigL + 6

Next Num

Je suis sûr que c'est un truc très simple, mais j'ai beau cherché et je ne trouve pas.

Merci d'avance pour votre aide.

7 réponses

Neliel Messages postés 6121 Date d'inscription jeudi 9 juillet 2009 Statut Contributeur Dernière intervention 20 mars 2017 1 674
26 avril 2010 à 12:02
Bonjour,

Je ne suis pas un pro en VBA mais c'est valable pour tout langage... Lorsqu'un programme répète souvent un traitement, on peut insérer ce traitement dans une fonction, cherche de ce côté là.

0
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 350
26 avril 2010 à 12:29
Merci pour ta réponse Neliel.

En fait, ce traitement n'est pas répétitif et je ne pense pas qu'une fonction soit la solution. Je cherche seulement à savoir comment je peux dans une boucle récupérer mes variables Tor 1 à 5 et Lie 1 à 5. Il y a surement une solution simple en VBA.

Je pense que l'erreur se situe dans les codes ("Tor" & Num) et ("Lie" & Num) qui ne me renvoient pas les Tor1, Tor2, .... Lie1, Lie2 que je souhaite. Sans doute un problème d'écriture.

Lorsqu'elles ne sont pas N/A, ces variables sont des adresses textes de cellules du type A1, A2 etc... qui me permettent ensuite d'aller copier le contenu des dites cellules dans ma feuille "Parc" et les coller dans ma feuille active.
0
Neliel Messages postés 6121 Date d'inscription jeudi 9 juillet 2009 Statut Contributeur Dernière intervention 20 mars 2017 1 674
Modifié par Neliel le 26/04/2010 à 12:45
Tu peux utilisé les tableaux au lieu de simples variables.

par exemple pour tes variables Tor1à Tor5 (5 variables) si tu utilise un tableau (une liste) à la place de taille 5 comme ceci:

Dim Tor(5) as String

Ensuite tu fais une boucle pour entrer chaque valeur dans chaque case du tableau comme ceci

For compteur = 1 To 5

...
Tor(compteur)=...
...

EndFor


Par contre, au niveau des cellule tu devras soit utiliser des if comme ça:

if compteur=1 then cellule="R13"

Soit utiliser, au lieu du nom de la cellule, leur position (ligne, colonne) et augmenter le numéro de ligne de 6 à chaque passage dans la boucle (entre R13 et R19, il y a 6 lignes).

"Trotti Trotta, Monsieur P, y'a des anges qui veulent un bisou..."
0
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 350
26 avril 2010 à 13:07
Merci Neliel,

J'ai entre temps résolu le pb et la solution rejoint exactement ton message ci-dessus. C'est effectivement un problème de variables qui doivent être déclarées en tableau.

Voici donc mon code corrigé:

'Déclaration des variables
Dim Tor(1 To 5) As String
Dim Lie(1 To 5) As String
Dim Num As Byte, LigT As Byte, LigL As Byte

'Collecte des références des cellules
With Sheets("Collecte des données")
Tor(1) = .Range("W78").Text
Tor(2) = .Range("W79").Text
Tor(3) = .Range("W80").Text
Tor(4) = .Range("W81").Text
Tor(5) = .Range("W82").Text
Lie(1) = .Range("W86").Text
Lie(2) = .Range("W87").Text
Lie(3) = .Range("W88").Text
Lie(4) = .Range("W89").Text
Lie(5) = .Range("W90").Text
End With

'Ecriture des détails

LigT = 13
LigL = 15

For Num = 1 To 5

If Tor(Num) = "#N/A" Then
ActiveSheet.Range("R" & LigT).Value = "BlaBlaBla1"
Else
Sheets("Parc").Range(Tor(Num)).Copy Destination:=Range("R" & LigT)
End If

If Lie(Num) = "#N/A" Then
ActiveSheet.Range("R" & LigL).Value = "BlaBlaBla2"
Else
Sheets("Parc").Range(Lie(Num)).Copy Destination:=Range("R" & LigL)
End If

LigT = LigT + 6
LigL = LigL + 6

Next Num

Et là ça marche nickel.

Merci encore pour ton aide.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Neliel Messages postés 6121 Date d'inscription jeudi 9 juillet 2009 Statut Contributeur Dernière intervention 20 mars 2017 1 674
26 avril 2010 à 13:15
Tu peux encore réduire le code à ce niveau:

Tor(1) = .Range("W78").Text
Tor(2) = .Range("W79").Text
Tor(3) = .Range("W80").Text
Tor(4) = .Range("W81").Text
Tor(5) = .Range("W82").Text
Lie(1) = .Range("W86").Text
Lie(2) = .Range("W87").Text
Lie(3) = .Range("W88").Text
Lie(4) = .Range("W89").Text
Lie(5) = .Range("W90").Text

A la place, tu met une autre boucle si c'est, bien sûr, possible dans un With...
0
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 350
26 avril 2010 à 13:28
Tu as sans doute raison sur le principe (plutôt dans un For à mon sens), mais je pense qu'on arriverait à plus d'instructions qu'il n'en faut pour récupérer 10 valeurs.
Je vais donc en rester là. Mais l'idée est bonne dans le cas d'un plus grand nombre de variables.

Merci encore.
0
Neliel Messages postés 6121 Date d'inscription jeudi 9 juillet 2009 Statut Contributeur Dernière intervention 20 mars 2017 1 674
26 avril 2010 à 13:32
Je voulais dire que ton code est déjà dans un With...

With Sheets("Collecte des données")

End With

Or je ne sais pas si on peut mettre une boucle For dans une boucle With... normalement oui mais je n'en suis pas sûr...
0
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 350
26 avril 2010 à 13:47
Ah OK. J'avais pas bien compris ton message.
Je ne suis pas bien sûr que ce soit possible un For dans un With.

Autre possibilité : Je peux aussi aller récupérer les variables pour chaque Num dans la boucle For, mais là je pense que ça ralentirait la macro qui devrait aller chercher à chaque fois dans la feuille "Collecte des données" pour chaque nouvelle valeur de Tor() et de Lie(), au lieu de n'y aller qu'une seule fois et de tout récupérer d'un coup.

Mais bon, la macro telle que construite me satisfait pour le moment. Si je progresse un peu plus en VBA, peut-être trouverai-je que c'est pas le top et qu'on peut mieux faire. C'est pas encore pour demain.......
0
Neliel Messages postés 6121 Date d'inscription jeudi 9 juillet 2009 Statut Contributeur Dernière intervention 20 mars 2017 1 674
26 avril 2010 à 13:50
Pour 100 ou plus de données, en effet cela ralentirait le programmes... mais là, tu n'as que 10 valeurs à récupéré donc ce sera négligeable.
0
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 350
26 avril 2010 à 14:17
J'ai fait un essai en récupérant les données dans la boucle et il y a, il me semble, une ralentissement sensible de la macro. J'en reste donc à mon code ci-dessus.
0