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 :

Tentative d'addition en VBA avec activecell


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2017
    Messages : 8
    Par défaut Tentative d'addition en VBA avec activecell
    Bonjour j'ai créé un programme permettant de générer un tableau avec un nombre de colonnes variables.
    Tout se passe bien mis à part que je dois dans une cellule du tableau générer intégrer une addtion de plusieurs cellules qui sont sur la même ligne et de colonnes côte à côte.

    Le nombre de colonnes est déterminé par l'utilisateur grâce à un formulaire. Ainsi le nombre de celles à additionner est égal au nombre de colonnes (donc variable et indéfini à l'avance)

    Voici mon code actuel pour générer cette addition (qui ne marche pas bien sûr) , cela dépasse mes compétences pouvez- vous m'aider svp ?
    ici le nombre de colonnes est égal à "ActiveCell(1, 2).Value"
    la cellules o'u implanter l'addition est : " ActiveCell(4, 8) "
    la la première cellule de la plage à selectionner pour l'addition est connue : "ActiveCell(8, 8)"

    Nom : Capture.PNG
Affichages : 1531
Taille : 3,2 Ko

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Pour utiliser une fonction d'Excel dans une cellule à partir de VBA, tu dois utiliser Formula ou Formulalocal.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2017
    Messages : 8
    Par défaut
    Merci du conseil clément pourrais-tu me donner un exemple de ta solution avec le code que j'ai fourni stp ?

    Mais je pense qu'ici le problème est que je ne sais pas comment utiliser une fonction somme ou alors mettre en forme une addition avec ActiveCell et un ombre de colonnes variables pour pouvoir générer le calcul que je souhaite faire.

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

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

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Bonjour,
    Il y a plusieurs problèmes dans ton code.
    1. ActiveCell n'est pas Cells !
    ActiveCell désigne la cellule active.
    La syntaxe suivante :
    désigne la cellule de la ligne i et de la colonne j.
    Lorsque tu écris ActiveCell(8,8), en fait tu veux dire Cells(8,8)?
    Tu peux aussi utiliser Range pour désigner une plage de cellules. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("H8:H10")     'désigne la plage H8:H10
    Range("H8:H" & Range("B2").Value)      'désigne les cellules en colonne H de la ligne 8 à la ligne n° le nbe écrit en B2.
    2. Pour utiliser une fonction de feuille de calcul, 2 cas de figures. Tu veux écrire 1 fois le résultat et il ne doit pas forcément s'adapter à des changements. Tu peux utiliser Application.laFonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(4,8).Value = Application.Sum(Range("H8:H" & Range("B2").Value))
    Si tu veux écrire la formule comme si tu l'écrivais dans Excel (donc elle s'adaptera à d'éventuels changements), tu dois utiliser Formula en écrivant les fonction en ANGLAIS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(4,8).Formula = "=SUM(H8:H" & Range("B2").Value & ")"

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2017
    Messages : 8
    Par défaut
    Bonjour riaolle,

    Merci de ta réponse je vais la tester dès maintenant et je reviens vers toi.
    Quand je dis ActiveCell(8,8) je désigne donc la cellule sur la 8ème ligne et dans la 8ème colonne avec la cellule ActiveCell(1,1) (qui est la cellule active) comme référence.

    Par exemple si ActiveCell = A1 alors ActiveCell(8,8) = H8
    ou si ActiveCell = F15 alors ActiveCell(8,8) = M22

    et 0 moins de me tromper Cell(8,8) = H8 tout le temps et peu importe quelle est la cellule active, non ?

    Et comme j'utilise la référence ActiveCell dans tout mon programme, je n'utilise jamais le format "A1" pour désigner une cellule.

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

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

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Ok, néanmoins la syntaxe ActiveCell(i,j) n'est tout de même pas correcte
    Dans ton cas de figure, il faut utiliser Offset :
    Indique qu'on se déplace de 8 colonnes et 8 lignes à partir de la la cellule active. Attention : on se déplace de 8 colonnes et 8 lignes, donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1").Offset(8,8) <=> Range("I9")
    Est-ce que tu vois comment adapter à ton code ?
    Essaie, puis montre-nous ce que tu as fait.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2017
    Messages : 8
    Par défaut
    ActiveCell(4, 8) = "=somme(" & Range(Activecell).Offset(8,8) &":" & Range(Activecell).Offset(8,ActiveCell(1, 2).Value) & ")"

    ou alors

    ActiveCell(4, 8) = "=somme(" & ActiveCell.Offset(8,8) &":" & ActiveCell.Offset(8,ActiveCell(1, 2).Value) & ")"

    Qu'en pense-tu ? désolé si c'est mauvais mais je débute

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

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

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Attention, tu n'as pas bien compris.
    ActiveCell = la cellule active.
    ActiveCell.Offset(i,j) = on part de la cellule active et on se décale de i lignes et j colonnes.
    Range("A2") = cellule A2
    Cells(i, j) = cellule de la ligne i et de la colonne j.

    ActiveCell est un objet qui ne prend pas d'arguments. Par ex. supposons que la feuille Excel est un échéquier et que tu as un pion. On appelle ActiveCell la case de l'échéquier sur laquelle tu poses le pion. ActiveCell.Offset(1,3) est la case qui se situe dans la ligne en dessous de celle où il y a le pion et 3 colonnes à côté. Cells(2,3) est la case qui se situe à la ligne 2 et la colonne 3 de l'échéquier peu importe où se situe le pion.
    Tu comprends la syntaxe ?

    2ème remarque, je cite un des mes messages précédents :
    Si tu veux écrire la formule comme si tu l'écrivais dans Excel (donc elle s'adaptera à d'éventuels changements), tu dois utiliser Formula en écrivant les fonction en ANGLAIS
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(4,8).Formula = "=SUM(H8:H15)"
    En tout cas tu as l'air d'avoir bien compris où mettre les guillemets, c'est déjà ça

    Ceci pourra t'être utile : http://bidou.developpez.com/article/VBA/

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2017
    Messages : 8
    Par défaut
    Par rapport à ActiveCell j'ai utilisé plein de fois des codes du type :

    ActiveCell(8, i + 8) = ActiveCell(5, i + 8) + ActiveCell(6, i + 8) + ActiveCell(7, i + 8)

    Cela marche très bien. Donc je pense que ActiveCell (i,j) se comporte comme Cell(i,j) mais Cell a comme cellule de référence A1 et ActiveCell la cellule active comme référence. Dis moi si je me trompe mais en utilisant le code comme je l'ai mis plus haut cela marche très bien. Après pour l'utiliser avec une formule là ça se complique car ça ne marche pas..

    Comment utiliserais-tu la fonction somme sur une plage dont la colonne est variable avec Cell ?

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

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

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Ok, bon, ben tu m'apprends qqc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveCell(4, 8) = "=somme(" & ActiveCell.Offset(8,8) &":" & ActiveCell.Offset(8,ActiveCell(1, 2).Value) & ")"
    C'est un début, MAIS
    1. je répète, en VBA, il faut utiliser les fonctions en ANGLAIS.
    2. dans la somme, il faut que tu donnes une plage de cellule sous forme de chaine de caractères. Avec Formula, c'est comme si tu écrivais dans la cellule, il faut donc seulement une chaîne de caractères (comme quand tu écris dans une cellule). Par exemple : "H8:H10". Si tu as des variables, il faut que ces variales soient égales à un/des caractère(s) de cette chaîne de caractère. Par ex. :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ligne = 10
    premCellule = "H8"
    ..."=SUM(H8:H" & ligne & ")"
    ..."=SUM(" & premCellule & ":H10)"
    C'est OK, mais pas ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ..."=SUM(" & Range("H8") & ":H10)"

    Car Range("H8") est l'objet cellule H8.
    Tu peux utiliser la propriété Address des cellules :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox Range("A1").Address     'renvoie $A$1

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2017
    Messages : 8
    Par défaut
    Citation Envoyé par riaolle Voir le message
    Ok, bon, ben tu m'apprends qqc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ligne = 10
    premCellule = "H8"
    ..."=SUM(H8:H" & ligne & ")"
    ..."=SUM(" & premCellule & ":H10)"
    Je n'ai pas compris ce code
    Après on est pas obligé d'utiliser la fonction somme mais on peut définir une addition avec un nombre d'élément à additionner égal au nombre de colonnes (qui est variable donc) mais mes connaissance en VBA ne me permettent pas de réussir à le faire avec activecell, as-tu une idée (pourquoi pas avec Cell déjà, car tu a l'air de bien le maîtriser)

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

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

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Je vais d'abord essayé de t'expliquer le code que tu ne comprends pas.

    1. Supposons qu'en cellule B1, tu veux écrire la somme des cellules A1 à A10, tu peux écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Range("B1").Formula = "=SUM(A1:A10)"
    '---ou---
    Cells(1,2).Formula = "=SUM(A1:A10)"
    Comment marche Formula ? Regardons d'abord ce qu'est la propriété Value d'une cellule. Value permet de définir la valeur que tu veux donner à une cellule, donc si tu veux écrire "toto" dans la cellule A1n tu écris ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1").Value = "toto"
    Soit la syntaxe : cellule.Value = la_valeur.
    Avec Formula, c'est un peu la même chose sauf que là tu définis p as la valeur que tu veux écrire dans une cellule, mais la formule que tu veux écrire dans une cellule. Quand tu écris une formule dans une cellule, tu écris du texte, donc entre guillemets en VBA : tu mets entre guillemets exactement ce que tu écririrais en Excel (mais en ANGLAIS). Pour la somme, en français tu écrirais =SOMME(A1:A10) dans la cellule. D'où le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("B1").Formula = "=SUM(A1:A10)"
    2. Maintenant, notre problème, c'est que la plage est variable. Supposons qu'en B1, tu veuilles écrire la somme d'une plage variable : allant de A1 à la cellule en colonne A et en ligne Lig. Il faut qu'on trouve un moyen d'écrire plus ou moins : =SOMME(A1:ALig). Regardons d'abord un exemple d'utilisation de variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim i As Long
    i = 3
    MsgBox "La famille Dupond compte " & i & " enfants."      'renvoie : La famille Dupond compte 3 enfants.
    MsgBox "La famille Dupond compte i enfants"     'renvoie : La famille Dupond compte i enfants.
    Tu observes que tout ce qui est entre guillemets est considéré comme une chaîne de caractères. Si on veut caler une variable on ferme les guillemets et on concatène la chaine de caractère avec la variable avec le signe &.
    Maintenant, on peut faire la même chose avec notre somme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim Lig As Long
    Lig = 10
    Range("B1").Formula = "=SUM(A1:A" & Lig & ")"
    On peut aussi le faire avec la première cellule plutôt que la dernière ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim prem As Long
    prem = "A2"
    Range("B1").Formula = "=SUM(" & prem & ":A10)"
    Tu comprends mieux ?

    3. Tu observes bien qu'il faut écrire la formule comme si tu l'écrivais dans Excel. Tu dois donc écrire les addresses des cellules. Ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveCell(4, 8) = "=somme(" & ActiveCell.Offset(8,8) &":" & ActiveCell.Offset(8,ActiveCell(1, 2).Value) & ")"
    Tu essaies de concaténer l'objet cellule avec une chaîne de caractère, ce n'est pas possible. Tu ne peux que concaténer des valeurs numériques (converties automatiquement en texte) et des chaînes de caractères.
    Il faut donner l'adresse des cellules --> on utilise la propriété Address.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveCell(4, 8).Formula = "=SUM(" & ActiveCell.Offset(8,8).Address &":" & ActiveCell.Offset(8, ActiveCell(1, 2).Value).Address & ")"


    Là, tu passes par l'écriture d'une formule dans Excel, mais tu peux aussi directement calculer la somme et l'écrire dans la cellule avec Application.Sum. Application.Sum est une fonction dans VBA, donc là tu peux écrire avec des objets. Syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x = Application.Sum(Range(plage_a_sommer))
    Dans ton cas ce erait donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveCell.Offset(4,8).Value = Application.Sum(Range(ActiveCell.Offset(8,8), ActiveCell.Offset(8, ActiveCell.Offset(1, 2).Value))
    La syntaxe Range(cellule1, cellule2) indique que tu veux travailler sur la plage cellule1 à cellule2.
    C'est une autre possibilité, à toi de voir là où tu te sens le plus à l'aise. Néanmoins sache que la 2ème syntaxe écrit la valeur de la somme dans la cellule. Elle n'écrit pas une formule, donc si tu changes des valeurs dans les plages à sommer, les sommes ne seront pas mises à jour.

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2017
    Messages : 8
    Par défaut
    Riaolle Merci à toi grave à tes explication et exemple j'ai réussi à générer mon tableau à colonne variable et tout marche parfaitement un grand merci à toi !! Il ne me manque plus qu'à automatiser la mise en forme (police, bordure, etc) et ça sera top merci à toi

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/04/2016, 15h09
  2. boucle en VBA avec activecell.formula et fonction hyperlink
    Par polo92 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/10/2014, 13h59
  3. Problème avec activecell en vba
    Par vero911 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 18/12/2008, 10h45
  4. [VBA-E]selectionner une ligne repérée avec activecell
    Par titou007 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 31/03/2006, 16h24
  5. Ajouter un enregitrement a une table vide en VBA avec access
    Par Mateache dans le forum VBA Access
    Réponses: 4
    Dernier message: 03/01/2006, 16h36

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