Excel VBA - récupérer des variables textes
Résolu
mic13710
Messages postés
1165
Statut
Membre
-
mic13710 Messages postés 1165 Statut Membre -
mic13710 Messages postés 1165 Statut Membre -
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.
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.
A voir également:
- Récupérer le texte d'une cellule excel vba
- Excel cellule couleur si condition texte - Guide
- Liste déroulante excel - Guide
- Excel compter cellule couleur sans vba - Guide
- Proteger cellule excel - Guide
- Recuperer message whatsapp supprimé - Guide
7 réponses
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à.
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à.
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.
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.
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..."
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..."
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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...
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...
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.
Je vais donc en rester là. Mais l'idée est bonne dans le cas d'un plus grand nombre de variables.
Merci encore.
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.......
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.......