IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Utilisation de formules pour déterminer la valeur d'une variable


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2023
    Messages : 4
    Par défaut Utilisation de formules pour déterminer la valeur d'une variable
    Bonjour,

    Novice dans l'utilisation de VBA, je bloque sur une erreur2023 en voulant affecter la valeur d'une formule à une vaiable:
    Voici le code:

    "Sub test3()

    Worksheets("Data Brutes").Select

    startaddress = Evaluate("ADDRESS(4, 51, 2, 1)")
    endAddress = Evaluate("ADDRESS(INDIRECT(ADDRESS(2, 50, 2, 1)), 70, 3, 1)")

    Range(startaddress, endAddress).Select

    Selection.Copy
    Worksheets("Planning").Range("B" & Rows.Count).End(xlUp).Offset(2, 0).PasteSpecial xlPasteFormats

    Selection.Copy
    Worksheets("Planning").Range("B" & Rows.Count).End(xlUp).Offset(2, 0).PasteSpecial xlPasteValues

    End Sub"

    L'erreur se trouve sur le endAddress dans la fonction range où il me met "erreur2023".
    De manière plus précise, si je remplace dans la formule de la vaiable endAdress la partie "INDIRECT(ADDRESS(2, 50, 2, 1))" par sa valeur, cela fonctionne.
    Dans Excel, la formule complète fonctionne (avec les ";" plutôt que les ",").

    J'ai vraiment besoin d'utiliser l'indirect car celle-ci se réfère à une cellule dont le contenu varie régulièrement.

    Merci pour votre aide,

    Stéphane

    PS: la version excel utilisée est: Microsoft® Excel® for Microsoft 365 MSO (Version 2212 Build 16.0.15928.20196) 64-bit

  2. #2
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonjour,

    C'est curieux, vous vous prétendez novice en VBA et vous attaquez avec "EVALUATE".
    Commencez par le commencement, quel est le but, donnez des explications sur le problème posé, pas sur la solution qui ne marche pas.


    CDlt

  3. #3
    Membre émérite
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2022
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2022
    Messages : 685
    Par défaut
    Bonjour,

    si je décrypte bien tu veux faire deux copier/coller, et vu la façon dont tu t'y prends, je crois volontiers que tu es débutant

    Oublie dans ton code VBA les select et activate...

    Un copier/coller, de base ça peut se faire directement par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorbook.WorkSheets("MaFeuille").Range("A1:B50").copy
    Donc dans le cas du code copié, si j'ai bien décrypté derechef :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Thisworkbook.Worksheets("Data Brutes")
        .range(.cells(4,51),.cells(.range("AX2").value,70)).copy
    end with

  4. #4
    Membre Expert
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 297
    Par défaut
    Bonjour

    pour sélectionner votre plage, il faut utiliser Range et Cells plutôt que Evaluate et ADDRESS

    A la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    startaddress = Evaluate("ADDRESS(4, 51, 2, 1)")
    endAddress = Evaluate("ADDRESS(INDIRECT(ADDRESS(2, 50, 2, 1)),70, 3, 1)")
    
    Range(startaddress, endAddress).Select
    Je propose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(Cells(4, 51), Cells(Cells(2,50), 70)).Select
    Stéphane

  5. #5
    Membre Expert
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 297
    Par défaut
    Un complément à mon message précédent
    pour ma part, cela fait des années que je n'utilise plus VBA pour importer mes données brutes, Power Query est dédié à ce genre de tâches (dispo depuis Excel 2016 et avant en Add-In dans le menu données)
    c'est beaucoup plus simple, souple, rapide, ... que des avantages

    Stéphane

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2023
    Messages : 4
    Par défaut
    Citation Envoyé par ARTURO83 Voir le message
    Bonjour,

    C'est curieux, vous vous prétendez novice en VBA et vous attaquez avec "EVALUATE".
    Commencez par le commencement, quel est le but, donnez des explications sur le problème posé, pas sur la solution qui ne marche pas.


    CDlt
    Bonjour Arturo83,

    Merci pour votre réponse. Je maîtrise assez bien excel mais suis bien novice en VBA. J'ai fait beaucoup de recherches sur le net. C'est là que j'ai trouvé la fonction evaluate.

    En fait, pour répondre à votre question, mon objectif est de copier de manière itérative le format, dans un 1er temps, et les valeurs, dans un deuxième temps, de 15 plages de sélections de cellules d'une feuille "Data Brutes" dont les coordonnées sont dans le "tableau" ci-après vers une feuille "Planning" chaque fois en colonne B et 2 lignes en-dessous de la copie précédente.

    Je décris ci-après où se trouvent les cellules de départ et de fin (ce qui est traduit juste après dans la table où j'ai repris les formules d'Excel (qui marchent) des Sélections.

    Cellules de départ des sélections
    Lignes: les cellules de départ des sélections sont toutes situées sur la ligne 3
    Colonnes: Les colonnes des cellules de départ sont situées en position 51 pour la 1ère itération puis, pour chaque itération suivante, la colonne s'incrémente de 22

    Cellules de fin des sélections
    Colonnes: Les colonnes des cellules de fin sont situées en position 70 pour la 1ère itération puis, pour chaque itération, le numéro de colonne s'incrémente de 22
    Lignes: Le numéro de ligne de la cellule de fin est variable. Son résultat (c'est pour cela que j'utilise la fonction Indirect d'Excel) se trouve, pour chaque itération, dans une cellule dont la ligne est toujours 2 et dont la colonne est, pour la 1ère itération, dans la colonne 50 et, pour chaque itération suivante, le numéro de colonne s'incrémente de 22

    Itérations Cellule départ Cellule fin
    1 =ADDRESS(3;(51+22*0);2;1) =ADDRESS(INDIRECT(ADDRESS(2;50+22*0;2;1));(70+22*0);3;1)
    2 =ADDRESS(3;(51+22*1);2;1) =ADDRESS(INDIRECT(ADDRESS(2;(50+22*1);2;1));(70+22*1);3;1)
    3 =ADDRESS(3;(51+22*2);2;1) =ADDRESS(INDIRECT(ADDRESS(2;(50+22*2);2;1));(70+22*2);3;1)
    4 =ADDRESS(3;(51+22*3);2;1) =ADDRESS(INDIRECT(ADDRESS(2;(50+22*3);2;1));(70+22*3);3;1)
    5 =ADDRESS(3;(51+22*4);2;1) =ADDRESS(INDIRECT(ADDRESS(2;(50+22*4);2;1));(70+22*4);3;1)
    6 =ADDRESS(3;(51+22*5);2;1) =ADDRESS(INDIRECT(ADDRESS(2;(50+22*5);2;1));(70+22*5);3;1)
    7 =ADDRESS(3;(51+22*6);2;1) =ADDRESS(INDIRECT(ADDRESS(2;(50+22*6);2;1));(70+22*6);3;1)
    8 =ADDRESS(3;(51+22*7);2;1) =ADDRESS(INDIRECT(ADDRESS(2;(50+22*7);2;1));(70+22*7);3;1)
    9 =ADDRESS(3;(51+22*8);2;1) =ADDRESS(INDIRECT(ADDRESS(2;(50+22*8);2;1));(70+22*8);3;1)
    10 =ADDRESS(3;(51+22*9);2;1) =ADDRESS(INDIRECT(ADDRESS(2;(50+22*9);2;1));(70+22*9);3;1)
    11 =ADDRESS(3;(51+22*10);2;1) =ADDRESS(INDIRECT(ADDRESS(2;(50+22*10);2;1));(70+22*10);3;1)
    12 =ADDRESS(3;(51+22*11);2;1) =ADDRESS(INDIRECT(ADDRESS(2;(50+22*11);2;1));(70+22*11);3;1)
    13 =ADDRESS(3;(51+22*12);2;1) =ADDRESS(INDIRECT(ADDRESS(2;(50+22*12);2;1));(70+22*12);3;1)
    14 =ADDRESS(3;(51+22*13);2;1) =ADDRESS(INDIRECT(ADDRESS(2;(50+22*13);2;1));(70+22*13);3;1)
    15 =ADDRESS(3;(51+22*14);2;1) =ADDRESS(INDIRECT(ADDRESS(2;(50+22*14);2;1));(70+22*14);3;1)

    Bonjour Tête de Chat et Raccourcix, merci aussi pour votre aide. Comme l'as dit Arturo, j'aurais dû poser le problème dès le départ mais je crois que je suis vraiment trop novice. Est-ce que sur base du problème posé, vous auriez une solution à proposer ?

    Raccourcix, je ne connaissais pas Power Query, j'ai été regardé dans la bibliothèque des Add-Ins, mais ils en proposent bcp. Je regarderai volontiers plus tard mais pour le cas présent, je vais perséverer avec VBA :-).

    Merci en tout cas encore pour votre aide!

    Stéphane

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2023
    Messages : 4
    Par défaut
    J'ai essayé de suivre vos conseils (pas le copy paste parce que celui-là marche) et ai réécris le code comme suit mais il me met une erreur de compilation sur la ligne du range. Qu'ai-je oublié ?

    Nom : VBA_Selectcopy 20220131.JPG
Affichages : 69
Taille : 63,6 Ko

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2023
    Messages : 4
    Par défaut
    ah, ah, il me manquait une parenthèse

    ça marche ! Merci à tous pour votre aide !

Discussions similaires

  1. Nom du slot pour changer la valeur d'une variable
    Par UnConfiantEtudiant dans le forum Débuter
    Réponses: 9
    Dernier message: 12/09/2014, 22h58
  2. [XL-2003] Commande pour récupérer la valeur d'une variable
    Par lb.did dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 13/11/2011, 18h23
  3. Réponses: 2
    Dernier message: 10/04/2008, 11h48
  4. Réponses: 1
    Dernier message: 11/12/2007, 01h24
  5. Réponses: 2
    Dernier message: 21/09/2007, 17h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo