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 :

Additionner des cellules de différentes feuilles selon une position relative


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 22
    Points : 10
    Points
    10
    Par défaut Additionner des cellules de différentes feuilles selon une position relative
    Bonjour à tous,

    Je souhaite créer une petite fonction qui me semble très simple mais je ne sais pas trop comment faire.

    Le but est simplement d'additionner la case dont la position relative se situe à gauche de ma position courante (cellule où s'exécute la fonction) avec la même cellule des 4 premières feuilles de calcul qui, si elles existent, se situe immédiatement à droite de ma feuille de calcul courante et dont le nom commence par "MC".


    Merci d'avance pour votre aide !
    Bien cordialement,
    Gryon

  2. #2
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Personne n'a d'idée pour cette fonction ?

  3. #3
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Tu mets la position (ligne x colonne) de la cellule active dans deux variables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim VX as Long, VY as Long
    VX = Selection.Row
    VY = Selection.Column
    Ensuite, tu peux te positionner comme tu veux par rapport à ces valeurs.

    Ca manque d'élégance mais c'est simple et efficace.

  4. #4
    Inactif  

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Points : 10 167
    Points
    10 167
    Billets dans le blog
    36
    Par défaut
    Citation Envoyé par Gryon Voir le message
    Personne n'a d'idée pour cette fonction ?
    Oui. Ouvrir ton aide et chercher offset

    http://msdn.microsoft.com/fr-fr/libr...ffice.15).aspx

  5. #5
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Je ne suis pas sûr que Offset puisse résoudre son problème dans la mesure où il veut aussi atteindre les cellules d'autres feuilles.
    D'après ce que je sais (et je serais heureux de me tromper sur ce sujet), Offset ne permet que des référencements dans la même feuille que la cellule désignée.

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Bonjour et merci pour l'indication.

    Je m'en suis sorti avec diverse chose repêchée ici et là.

    Voila ce que ça donne :
    ==============================================
    Function SLD()

    Dim SheetNum As Integer
    Dim Res As Integer
    Dim r As Integer
    Dim cPerf As Integer
    Dim cMinSL
    Dim cExpSL As Integer
    Dim ExpMiss As Integer
    Dim i As Integer

    SheetNum = ActiveSheet.Index
    Res = 0
    i = 0
    ExpMiss = 0
    r = ActiveCell.Row
    cPerf = ActiveCell.Offset(0, -1).Column 'CSC Performance
    cMinSL = ActiveCell.Offset(0, -3).Column 'SL Minimum
    cExpSL = ActiveCell.Offset(0, -4).Column 'SL Expected

    If Sheets(SheetNum).Cells(r, cPerf).Value Like "N*" Then
    Res = 0
    Else
    If Sheets(SheetNum).Cells(r, cPerf).Value < Sheets(SheetNum).Cells(r, cMinSL).Value Then
    Res = 1
    Else
    Do While ((SheetNum + i) <= ActiveWorkbook.Sheets.Count) And (i < 3) And (Sheets(SheetNum + i).Name Like "MC_*")
    If Sheets(SheetNum + i).Cells(r, cPerf).Value < Sheets(SheetNum + i).Cells(r, cExpSL).Value Then
    ExpMiss = ExpMiss + 1
    End If
    i = i + 1
    Loop

    If ExpMiss > 2 Then
    Res = 1
    Else
    i = 0
    ExpMiss = 0
    Do While ((SheetNum + i) <= ActiveWorkbook.Sheets.Count) And (i < 12) And (Sheets(SheetNum + i).Name Like "MC_*")
    If Sheets(SheetNum + i).Cells(r, cPerf).Value < Sheets(SheetNum + i).Cells(r, cExpSL).Value Then
    ExpMiss = ExpMiss + 1
    End If
    i = i + 1
    Loop
    If ExpMiss > 3 Then
    Res = 1
    End If
    End If
    End If
    End If
    SLD = Res
    End Function
    =============================================

    Mais voila que j'ai un autre soucis : ma fonction ne s’exécute pas automatiquement. Après recherche, c'est apparemment normal...
    Qu'à cela ne tienne, je vais faire un joli bouton qui refresh mes cellules :

    ============================================
    Sub Refresh()

    Dim i
    For i = 1 To ActiveWorkbook.Sheets.Count
    If Sheets(i).Name Like "MC_*" Then
    Sheets(i).Range("I:J").Calculate
    End If
    Next

    End Sub
    ============================================

    Malheureusement, il ne se passe rien. Quelqu'un en connait-il la raison ?


    Merci !
    Gryon

  7. #7
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Ajoute quelques Debug.Print ou MsgBox dans tes If pour savoir lesquels sont activés.
    Ou fais avancer ton programme en pas à pas en suivant l'évolution des valeurs de variables dans la fenêtre des variables locales.

    Et fait quelques itération dans ton code pour distinguer tes niveaux de If, ça rendra ton code plus lisible.

  8. #8
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Bonjour Menhir,

    La fonction SLD() fonctionne comme je le souhaite (désolé pour l'indentation mais elle est apparemment supprimé automatiquement dans les messages).
    C'est ma fonction et mon bouton refresh qui ne fonctionne pas...

    Une idée ?

    Gryon

  9. #9
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Pour résumer, quand j'appuie sur mon bouton ou que j'exécute la procédure refresh via la fenetre développeur, il ne se passe rien...

    Par contre si je vais dans ma cellule ou j'ai écris =SLD() et que j'appuie sur Entrée, le calcul s'effectue correctement...

  10. #10
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Le Calculate ne fait rien de plus que ce que fait le mode de calcul automatique.
    Il ne force pas l'intégralité des calcul d'une feuille. Il se contente, en mode recalcul manuel, de relancer de calcul pour les formule qui ont un ascendant qui a été modifié depuis le calcul précédent.

  11. #11
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Très bien mais quel est le code équivalent à "je clique dans ma cellule puis appuie sur Entrée" pour lancer correctement le calcul de mes fonctions ?

  12. #12
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Tu peux essayer un CalculateFull.
    Tu peux aussi essayer avec la méthode Volatile mais sur une grosse feuille de calcul, ça peut être très lourd à l'usage.

  13. #13
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    En utilisation Application.volatile au niveau de la fonction SLD(), ça fait quelque chose mais pas du tout ce que je souhaite : toutes les valeurs contenant =SLD() se mettent à jour mais avec la même valeur. C'est comme si la fonction s’exécutait une fois et cet unique résultat appliqué à toute les cellules. J'aimerai que la fonction s'éxécute indépendemment les une des autres dans chaque case. Un peu comme une fonction de base d'Excel type "=somme(...)".

  14. #14
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Elle fait exactement ce que tu lui demandes.
    Etant donné que tu ne transmet aucun paramètre dans cette fonction, je ne vois pas pourquoi ses différentes utilisations enverraient des valeurs différentes.
    Ce n'est pas les ActiveCell et autres ActiveSheet qui y changeront quelque chose puisque ces propriétés ne désignent pas la cellule ou la feuille où se trouve la fonction mais la cellule ou la feuille qui est sélectionnée au moment où elle s'exécute.

    Si tu veux que l'une des deux méthodes que je t'ai proposées fonctionne comme tu le souhaites, il va falloir que tu changes ton code.

  15. #15
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Ah... c'est ballot... Bon, du coup je vais faire une procédure qui appelle cette fonction avec des paramètres.

  16. #16
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Il serait plus simple de mettre des paramètres dans ta fonction.

    Un exemple simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function YYY(MaCellule As Range) As Long
    YYY = MaCellule.Row
    End Function
    Si, dans ta feuille Excel, tu tapes :
    Ca inscrira 10 dans la cellule.

    Un autre exemple pour connaitre l'onglet de la cellule où se trouve la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function YYY2(MaCellule As Range) As String
    YYY2 = MaCellule.Parent.Name
    End Function

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

Discussions similaires

  1. Réponses: 81
    Dernier message: 16/09/2013, 14h48
  2. [XL-2007] copier cellules de différentes feuilles sur une feuille recap
    Par izardjacky dans le forum Excel
    Réponses: 1
    Dernier message: 25/08/2013, 14h08
  3. Réponses: 1
    Dernier message: 23/03/2013, 08h51
  4. Réponses: 4
    Dernier message: 30/01/2012, 12h04
  5. Réponses: 3
    Dernier message: 23/01/2008, 03h52

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