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

Excel Discussion :

Impossibilité de remplacer des valeurs fixes par des variables dans formule complexe [XL-2013]


Sujet :

Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2015
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2015
    Messages : 211
    Points : 87
    Points
    87
    Par défaut Impossibilité de remplacer des valeurs fixes par des variables dans formule complexe
    Bonjour à toutes et à tous,

    Voici une formule qui fonctionne très bien mais qui possède un GROS problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sub Macro2()
        Range("J20").Select
        ActiveCell.FormulaR1C1 = "=AVERAGE(R[-19]C[-9]:R[-10]C[-5])"
        Range("J20").Select
    End Sub


    Dans un premier temps je vous explique ( je pense que c'est nécessaire ) le fonctionnement de cette formule créée avec l'éditeur de macros
    Cette formule signifie que je me positionne en cellule J20
    Cette cellule calcule la moyenne d'un tableau défini comme suit : R[-19] ---> par rapport à J20 on se déplace vers la gauche de 19 lignes on arrive en J1
    C[[-9] ---> par rapport à J1 on monte de 9 lignes on arrive en A1
    Le tableau commence ( coin en haut à gauche ) en cellule A1
    Après les " : " , c'est le coin inférieur droit R[-10] --> par rapport à J20 on se déplace vers la gauche de 10 lignes on arrive en J10
    C[-5] --> par rapport à J10 on monte de 5 ligne on arrive en J5
    Le tableau est donc ("A1:J5")

    Voici mon problème : mon tableau étant variable, si je remplace au moins un chiffre par une variable par exemple :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    Sub Macro2()
        Range("J20").Select
        p=-5
        ActiveCell.FormulaR1C1 = "=AVERAGE(R[-19]C[-9]:R[-10]C[p])"
        Range("J20").Select
    End Sub
    plus rien ne fonctionne. Même si j'attribue p=5 et j'écris C[-p]


    Quelqu'un a-t-il une explication ?


    Merci d'avance.

    Novice72

  2. #2
    Membre éprouvé
    Homme Profil pro
    utilisateur
    Inscrit en
    Janvier 2017
    Messages
    669
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : utilisateur
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2017
    Messages : 669
    Points : 1 109
    Points
    1 109
    Par défaut Variables formule complexe
    Essayez avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ActiveCell.FormulaR1C1 = "=AVERAGE(R[-19]C[p]:R[-10]C[-9])"
    LibreOffice 7.5.9.2.M1 (x64) FR-YT 05/12/23
    OS : Windows 11.0

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Une formule est une CHAINE DE CARACTERES
    Ta question revient donc à te demander comment construire par concaténation une chaîne de caractères contenant la valeur d'une variable ! (le B.A.BA, quoi ...)
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nb = 5
    MsgBox "le petit frère de toto a " & nb & " ans"
    vraiment trop élémentaire ...
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  4. #4
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2015
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2015
    Messages : 211
    Points : 87
    Points
    87
    Par défaut
    Bonjour njhub,

    Pour répondre à ta proposition, j'ai déjà essayé.
    c'est exactement mon problème.
    Je souhaite remplacer ( dans un premier temps un chiffre par une variable ( préalablement définie ) ) et ça ne fonctionne pas.
    Quand j'aurai trouvé la solution, je le ferai pour les 4 chiffres......


    Encore merci pour ton aide.

    Novice72

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je pense avoir répondu à ta question dans ce fil

    A lire également ces deux billets
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2015
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2015
    Messages : 211
    Points : 87
    Points
    87
    Par défaut
    bonjour Unparia,

    Es-tu sûr que cela correspond à une chaîne de caractère ?

    En effet, étant donné qu'il y a un " = " pour moi, c'est une formule.

    Exemple
    cells(20,20)= " le petit frère de toto a " & nb & " ans " affichera le petit frère de toto a 8 ans dans la cellule T20 ( dans le cas où nb = 8 ) ça je "maîtrise"

    ici si je devais appliquer ce que tu me dis ( concatainer ),

    cells(20,20)= "=AVERAGE(R[" & a & "]C[" & b & "]:R[" & c & "]C[" & d & "])" ici, j'ai laissé des espaces pour plus de clarté a, b, c, et d sont bien sûr les variables.



    j'obtiendrais dans la cellule T20 l'affichage suivant: =AVERAGE(R[-19]C[-9]:R[-10]C[-5]) bien sûr dans le cas où a=-19, b=-9 , c=-10 et d=-5

    C'est bien ça le problème.... Je ne veux pas un message, mais le résultat d'un calcul.


    Merci pour ton aide.


    Novice72

  7. #7
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2015
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2015
    Messages : 211
    Points : 87
    Points
    87
    Par défaut
    Merci Philippe,

    Je regarde ça dès maintenant


    A bientôt.


    Novice72

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour Novice72,
    Es-tu sûr que cela correspond à une chaîne de caractère ?
    En effet, étant donné qu'il y a un " = " pour moi, c'est une formule
    Une fonction en règle générale a un ou plusieurs arguments qui peuvent être une constante numérique ou alphanumérique (chaîne de caractères donc), la référence à une cellule ou une autre fonction (on parle alors de fonction imbriquée dans une fonction)
    En VBA la valeur de la propriété Formula (que je préfère à la propriété FormulaR1C1 proposée par défaut par l'enregistreur de macros) lorsque le contenu de la cellule est une formule est une chaîne de caractères.
    Extrait de l'aide d'excel pour cette propriété
    Si la cellule contient une constante, la propriété la renvoie. Si la cellule est vide, cette propriété renvoie une chaîne vide. Si la cellule contient une formule, la propriété Formula renvoie la formule en tant que chaîne dans le même format que celui qui doit s'afficher dans la barre de formule (y compris le signe égal).
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  9. #9
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Bonjour,
    cells(20,20)= "=AVERAGE(R[" & a & "]C[" & b & "]:R[" & c & "]C[" & d & "])" ici, j'ai laissé des espaces pour plus de clarté a, b, c, et d sont bien sûr les variables.
    j'obtiendrais dans la cellule T20 l'affichage suivant: =AVERAGE(R[-19]C[-9]:R[-10]C[-5]) bien sûr dans le cas où a=-19, b=-9 , c=-10 et d=-5
    Oui, car il faut préciser que tu écris une formule, comme tu l'as fait avant d'introduire le problème des variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cells(20,20).FormulaR1C1= "=AVERAGE(R[" & a & "]C[" & b & "]:R[" & c & "]C[" & d & "])"

  10. #10
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2015
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2015
    Messages : 211
    Points : 87
    Points
    87
    Par défaut
    Merci beaucoup à toi Riaolle,

    J'ai résolu mes problèmes. Plage variable, cellule préparée à calculer une moyenne alors qu' elles sont vides au départ puisque tableau en création dans la même macro ( ce qui bloquait la macro ) BREF :


    ENCORE MERCI RIAOLLE
    Pour les personne qui aurait le même souci, je donne mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    ' Le tableau étant défini à partir du coin haut gauche et bas droite,
    ' hg permet de se déplacer suivant les lignes pour rejoindre le coin haut gauche  -   si négatif on monte      ( par rapport à la cellule qui calcule la moyenne )
    ' gh permet de se déplacer suivant les colonnes pour rejoindre le coin haut gauche   - si négatif on se déplace vers la gauche
    ' De même pour bd et db : le premier comme hg  et le second comme gh    ( définit le coin bas droite )
     
    subtest()
    Dim hg As Integer
    Dim gh As Integer
    Dim bd As Integer
    Dim db As Integer
    hg = i - t
    gh = -nombrevaluation
    bd = 0
    db = -1
    ActiveCell.FormulaR1C1 = "=AVERAGE(R[" & hg & "]C[" & gh & "]:R[" & bd & "]C[" & db & "])"
    end sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/04/2017, 09h01
  2. [PHP 5.4] Insérer des valeurs saisies par l'utilisateur dans une requête SQL
    Par B.Berthod dans le forum Langage
    Réponses: 1
    Dernier message: 22/01/2015, 09h28
  3. Réponses: 2
    Dernier message: 05/12/2011, 19h32
  4. Réponses: 2
    Dernier message: 28/10/2010, 14h38
  5. Somme des valeurs retournés par des fonctions
    Par Lost In Translation dans le forum Mathématiques
    Réponses: 22
    Dernier message: 01/09/2010, 22h28

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