VBA - Appeler une variable a partir d'un Array

Fermé
titeufdu89 Messages postés 374 Date d'inscription samedi 28 juillet 2012 Statut Membre Dernière intervention 1 avril 2023 - 22 juil. 2022 à 14:36
ozone_ Messages postés 1518 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 2 juin 2023 - 25 juil. 2022 à 21:21

Bonjour,

Je souhaite appeler des variables en recomposant leur nom à partir d'un Array pour limiter la longueur de mon code, est-ce possible? 

Je m'explique, je dois comparer les informations de deux fichiers pour MAJ les données de ma feuille "b" en fonction de "Ws" et mettre en évidence les données modifiées.  

Pour commencer j'analyse chaque nom de colonne pour les déterminer sous forme de variable afin qu'elle puisse être comparées par la suite. J'obtiens donc une série de données à contrôler et j'ai nommée les colonnes de chaque feuille par un nom identique mais avec un préfixe correspondant au nom de la feuille en question. 

Ex : 

bNom = WsNom

bPrenom = WsPrenom, ...etc

J'ai tenté le code ci-dessous pour recomposer le nom de mes variables mais Excel les considère comme des variables à part entière et ne renvoi pas la valeur de la variable initiale. 

'MAJ des informations textuelle
            For Each Var In Array("Nom", "Pre", "Sal", "Fin", "Tx", "Cont", "Mail", "Add1", "Add2", "CP", "Vil", "Pay", "IBAN", "Perm", "Cant")
            bVar = "b" & Var
            WsVar = "Ws" & Var
                If b.Cells(i, bVar.Value).Value <> Ws.Cells(lg, WsVar.Value).Value Then
                b.Cells(i, bVar).Value = Ws.Cells(lg, WsVar).Value
                Else 'suite du code
                End If
            Next Var

Est-ce que quelqu'un aurait une idée pour contourner ce problème, une sorte de fonction INDIRECT que je pourrais utiliser en VBA par exemple?  

Je vous remercie par avance pour votre aide et vous souhaite une belle journée. 

Jean-Christophe 


Windows / Edge 103.0.1264.62


5 réponses

ccm81 Messages postés 10905 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 27 décembre 2024 2 429
22 juil. 2022 à 16:08

Bonjour

Un exemple à adapter

https://www.cjoint.com/c/LGwohMFBCRB

Cdlmnt

0
titeufdu89 Messages postés 374 Date d'inscription samedi 28 juillet 2012 Statut Membre Dernière intervention 1 avril 2023 38
Modifié le 22 juil. 2022 à 20:24

Bonsoir, 

Merci beaucoup pour la proposition mais malheureusement ça ne conviendrait pas dans mon cas car mes tableaux ne sont pas identiques. Désolé j'aurais peut-être du le préciser initialement. C'est une partie d'un tableau que je cherche a actualiser à partir d'un second.

C'est la raison pour laquelle j'analyse les noms de même en-tête pour identifier les colonnes que j'ai besoin d'analyser et je sauve les numéros de colonnes qui m'intéressent sous des variables afin de pourvoir les appeler par la suite pour les comparer et actualiser les données. A noter que les noms des colonnes ne sont pas identiques non plus. 

Concrètement, je cherche a concaténer du texte mais que le résultat soit interprété par Excel comme étant une variable et non pas un texte et de ce fait renvoi la valeur de cette dernière. 

Encore merci pour votre aide

Cordialement 

Jean-Christophe 

0
ozone_ Messages postés 1518 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 2 juin 2023 478
22 juil. 2022 à 21:30

 Je n'arrive pas a comprendre le problème, pour moi les variables créés à partir de ton code sont bien nommées.

Peut être faut-il rajouter l'objet devant le nom de ta variable pour selectionner les bonnes feuilles avec Worksheets

For Each Var In Array("Nom", "Pre", "Sal", "Fin", "Tx", "Cont", "Mail", "Add1", "Add2", "CP", "Vil", "Pay", "IBAN", "Perm", "Cant")
    bVar = "b" & Var
    WsVar = "Ws" & Var
        If Worksheets(b).Cells(i, bVar.Value).Value <> Worksheets(Ws).Cells(lg, WsVar.Value).Value Then
            Worksheets(b).Cells(i, bVar).Value = Worksheets(Ws).Cells(lg, WsVar).Value
        Else 'suite du code
        End If
Next Var

0
ccm81 Messages postés 10905 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 27 décembre 2024 2 429
23 juil. 2022 à 10:18

Je ne comprends pas bien 2 choses ici

b.Cells(i, bVar.Value).Value

1. b est un nom de feuille comme le pense ozone

- alors il faut écrire Sheets(b).cells(...

- sinon ???

2. bVar.value doit être la référence à une colonne donc doit contenir soit un entier soit une/deux lettre/s "B", "C", ...,"AA",

Or, d'après ton code, j'interprète bVar comme un nom de plage( ici une (colonne)

- si oui il faut écrire Sheets(b).Range(bvar).Cells(i,1).Value   (Sheets(b) n'est pas obligatoire)

sinon ???

Sans le fichier, difficile d'aller plus loin

Cdlmnt

0

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

Posez votre question
titeufdu89 Messages postés 374 Date d'inscription samedi 28 juillet 2012 Statut Membre Dernière intervention 1 avril 2023 38
25 juil. 2022 à 21:03

Bonsoir; 

Merci beaucoup pour votre aide et désolé pour mon délai de réponse. 

Le printscreen d'Ozone illustre très bien mon problème en fait. La variable bVar a bien été créée et elle renvoi "bNom" comme string, or plus haut dans mon code, j'ai affecté une valeur chiffrée à la variable bNom et c'est sous forme de variable que je souhaiterait l'appeler plutôt que sous forme de valeur. 

En appelant bVar; j'aurais souhaité indirectement appeler la valeur stocker dans la variable bNom, pour pouvoir ensuite boucler tout ça avec un  Array pour fluidifier mon code et éviter les redondances. 

ccm81 : effectivement b. est une variable objet a laquelle j'ai affecté la feuille à actualiser et bVar est simplement un n° de colonne censé être appelé via

b.cells(i, bVar)

Merci beaucoup et bonne soirée. 

Jc

0
ozone_ Messages postés 1518 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 2 juin 2023 478
Modifié le 25 juil. 2022 à 21:22

Sans trop m'avancer sur ma réponse et à voir avec d'autres contributeurs mais je dirai qu'il existe une autre solution avec des boucles plutôt que d'essayer de reconstituer des noms de variable à partir de String qui je pense n'est pas supporté par le VBA. 

Il faudrait, si possible, avoir une partie plus importante de ton code pour essayer de tourner le problème différemment. 

0