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 :

Comment passer une référence à une cellule ou objet Range en argument d'une fonction


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut Comment passer une référence à une cellule ou objet Range en argument d'une fonction
    Bonjour!

    Je voudrais écrire une fonction (f1) qui prenne en argument la référence à une cellule et qui soit ensuite appelée dans une autre fonction (f2) en tant qu'argument.
    Le pb que je rencontre c que je n'arrive pas réutiliser cette cellule dans la fonction f2 car je ne sais pas si je doit déclarer cette cellule comme un objet Range, ou en tant que chaîne de caractère (référence) . En gros, la fonction f2 doit pouvoir utiliser cette cellule car je voudrais me déplacer dans les cellules voisines. Il faut absolument que je passe en argument une référence à une cellule car je manipule des formules de maths derrière.

    Pouvez-vous m'aider svp?

    Merci de votre aide.

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Montre ce que tu as fait, ça aidera à résoudre ton pb

  3. #3
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Il vaut toujours mieux utiliser un objet qu'une string permettant de le retrouver.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    J'essaie de décortiquer ton problème comme tu le ferais pour un problème de math
    Je voudrais écrire une fonction (f1) qui prenne en argument la référence à une cellule
    L'adresse de la cellule ?
    qui soit ensuite appelée dans une autre fonction (f2)
    La cellule ou la fonction ? Je suppose "la fonction"
    en tant qu'argument.
    Non, ce doit être la cellule. Non, on appelle pas une cellule, on la lit, donc la fonction.
    Le pb que je rencontre c que je n'arrive pas réutiliser cette cellule
    Bon, alors c'est la valeur de la cellulequi t'intéresse.
    dans la fonction f2
    C'est clair
    car je ne sais pas si je doit déclarer cette cellule comme un objet Range, ou en tant que chaîne de caractère (référence)
    Donc, l'adresse de la cellule...
    Et là, j'ai oublié le début
    Désolé, mais si tu pouvais reformuler, on pourrait t'aider.
    Donc, à tout hasard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set LaCellule = ActiveSheet.Range("A1")
    LaCellule.Value = 25
    LaValeur = LaCellule.value
    msgbox LaValeur
    A+

    Edit
    Mais tu ne pourras pas passer LaCellule en argument mais LaCellule.address... ou .value

  5. #5
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut multiselection ds champ de page d un tableau croisé dynamique
    Bonjour

    Tout d'abord, merci de vos réponses.
    Je vais reformuler ce que je veux faire, cela vous aidera à comprendre ma démarche.
    1.Je manipule une feuille de calcul excel, dans laquelle je commence par écrire dans la première cellule une formule qui appelle une fonction f1 en VB. Cette fonction f1 prend en argument l'adresse (ou référence) de la cellule courante.
    2.Cette fonction f1 effectue un certain nombre de calculs... et appelle une fonction f2 dans son code, qui elle va utiliser l'adresse de la cellule que j'avais passée en argument à f1. La fonction f2 utilise en faite cette adresse de cellule pour ajouter des résultats de calculs dans les cellules voisines (à la cellule passée en argument).
    3. Je fais ensuite un autofill que me remplit la formule écrite en 1. à toute la colonne.

    En résumé, lorsque mon code s'exécute dans l'ordre:
    J'écris la formule dans la première cellule appellant la fonction f1; f1 appelle à son tour la fonction f2. Le autofill que j'ai fait m'assure qu'il va me faire cela sur toutes les cellules de ma colonne.


    Code simplifié:

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Sub Initialisation()
     
    ' Ecriture de la formule dans la première cellule
    MaFeuille.Range("A1") = "Prime de l'option"
    Range("A2").Select
    ActiveCell.Formula = "=f1('$A2 ')"
     
     
    'Remplissage des formules dans toute la colonne
     
    Dim fin As String
    Dim MonTab() As String
    Dim MaPlagePremium As Range
     
    Range("A1").Select
    Selection.End(xlDown).Select
     
    fin = ActiveCell.Address
    MonTab = Split(fin, "$")
     
    Set MaPlagePremium = ActiveSheet.Range("A3:S" & MonTab(2))
    MaPlagePremium.Formula = MaPlagePremium.Cells(1).Formula
     
    End sub
     
    Function f1(cellule as Range)
    Dim delta
    ....
    ....
    delta=...
    f2(cellule, delta)
    End Function 
     
    Function f2(cellule As Range, Valeur as Double)
    cellule.Select
    ActiveCell.Offset(0, 1).Value = Valeur
    End Sub
    N'hésitez pas si vous avez des questions.

    Merci de votre aide.

  6. #6
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    pour résumer tu veux qu'en plaçant une fonction dans une cellule... sur modification des valeurs en paramétres de cette cellule .. non seulement celle-ci si soit modifier mais aussi une autre cellule donnée en paramétre de la fonction... !
    pour ma part j'en étais resté sur le fait qu'une fonction appellé dans une cellule excel ne pouvais agir que sur le résultat retourné.. et en aucun cas sur autre chose... ( autre cellule...msgbox....) ..

    je crois que la solution à ton probléme et l'utilisation des procédure évenementielle ... (Worksheet_change...)

  7. #7
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Salut Bbil,

    Non c pas cela mon pb: je ne cherche pas répercuter une modification des valeurs de ma cellule sur mes autres cellules. Ce que je veux faire c'est que je parcoure une colone excel; dans chaque cellule de cette colonne, j'appelle une fonction f1, qui va prendre en argument l'adresse de cette cellule, qui à son tour sera passée en argument d'une fonction f2.

    Par exemple, visuellement,
    colomne A colomne B
    1 =f1($A1)
    2 =f2($A2)
    3 =f1($A3)
    ...

    f1($A1) va appeler f2 qui va afficher un résultat dans $B1.
    f2($A2) va appeler f2 qui va afficher un résultat dans $B2.
    etc...

    Le pb que je rencontre c que quand je transmet $A1 à f2 en argument, VB renvoie #VALEUR dand $B1 .
    Voilà, j'espère que cela va vous aider.

    A bientôt.

  8. #8
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Citation Envoyé par Barjabulle
    Salut Bbil,

    Non c pas cela mon pb: je ne cherche pas répercuter une modification des valeurs de ma cellule ,(....)
    f1($A1) va appeler f2 qui va afficher un résultat dans $B1.
    (...)
    c'est bien "qu'est ce je dis" tu veux mettre en A1 une formule qui doit modifier le contenu de la cellule B1 ..!

  9. #9
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Salut Bbil,

    Autant pour moi. Tu as compris mon pb.
    Je vois la solution que tu me proposes mais je sais pas comment la mettre en oeuvre.

    @+.

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Une indication :
    Si tu sélectionnes une cellule, par soft ou manuellement, tu peux mettre du code dans la feuille de code de la feuille de calcul
    Donc si tu fais par soft
    LaCellule.select, si tu as une macro qui repère la cellule sélectionnée, dans la feuille de code de la feuille de calcul, tu peux générer une action.
    Est-ce que ça t'ouvre des horizons ?
    Tu dis

  11. #11
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Re salut,

    Voici le code de ma fonction Initialisation ()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub initialiser ()
    Range("A2").Select
      
    (*)  ActiveCell.FormulaR1C1 = "=f1(RC19)"
    
    End Sub
    Ma question: quel doit être le prototype de ma fonction f1?

    Function f1(cellule as Range)? -> ça ne marche pas! Je crois qu'il ne comprend pas ce que c'est que RC19 dans f1.
    Function f1(cellule as String)? en modifiant alors la ligne (*) par
    ActiveCell.FormulaR1C1 = "=f1(ActiveCell.Adress)" -> ça ne marche pas! Error 2029.
    Function f1(cellule as Variant)? -> ça ne marche pas non plus! Error 2009.

    Je sais plus quoi faire.

  12. #12
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    change le nom de ta fonction ... fct1 par exemple...

  13. #13
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Pas
    ActiveCell.FormulaR1C1 = "=f1(ActiveCell.Adress)"
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveCell.Formula = "=f1(" & ActiveCell.Address & ")"
    pas testé mais sinon, utilise une variable pour ActiveCell.Address
    Tu dis

    NB - Pour utiliser FormulaR1C1, tu dois indique Row+NoLigneColonne+NoColonne -> R5C3
    Avec formulaLocal, tu peux mettre ta formule en français
    Avec formula tu insères un string et bbil te dira comment elle doit être validée pour fonctionner (il a dit ça il y a quelques jours mais j'ai oubli

  14. #14
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Ok pour ActiveCell.Address. C'est juste une petite coquille.
    J'ai effectivement testé avec une variable mais ça ne marche pas non plus.

    Une petire remarque: quand le lance la fenêtre variable locales avec la première solution (ie je passe en argument RC19 dans la fonction f1) la colonne valeur est vide. Autrement dit, l'argument RC19 est "vide" qd f1 s'execute.

  15. #15
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Citation Envoyé par bbil
    change le nom de ta fonction ... fct1 par exemple...

  16. #16
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Pour utiliser ActiveCell.Address, il n'y a pas qu'un d à ajouter, tu dois l'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "=f1(" & ActiveCell.Address & ")"

  17. #17
    Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Oui je sais, j'ai essayé ça déjà mais ça ne résout pas mon pb.
    Ah il est corriace ce pb!

  18. #18
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Bon j'ai fait ce que tu as dit :
    Dans un module, tu mets ces deux procédures
    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
    Sub Initialisation()
     
    ' Ecriture de la formule dans la première cellule
    Set MaFeuille = ActiveWorkbook.Sheets("Feuil1")
    MaFeuille.Select
    MaFeuille.Range("A1") = "Prime de l'option"
    MaFeuille.Range("A2").Select
     
    End Sub
     
    Function fct1(Adresse As Range)
        '...
        '...
        'ftc1 = ......
    End Function
    dans la feuille de code de la feuille de calculs, tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        If Target.Address = "$A$2" Then
            ActiveCell.Formula = "=fct1($A19)"
        End If
    End Sub
    Tu obtiens bien "=fct1($A19)" dans A2

    Maintenant, dans ta fonction, tu mets ce que tu veux.
    Moi, je n'obtiens rien ou zéro ou #VALEUR# comme si la fonction ne ... fonctionnait pas
    Ce qui me rassure c'est #VALEUR# qui signifie qu'on passe bien par la fonction
    A toi...

Discussions similaires

  1. [GC] Savoir si une référence existe vers un objet
    Par smyley dans le forum Framework .NET
    Réponses: 5
    Dernier message: 17/04/2008, 19h12
  2. Réponses: 7
    Dernier message: 04/05/2007, 12h20
  3. Réponses: 1
    Dernier message: 03/05/2007, 07h49
  4. Réponses: 1
    Dernier message: 02/05/2007, 15h08
  5. [C#] Comment passer la référence d'une fenêtre à une autre ?
    Par L`artiste dans le forum Windows Forms
    Réponses: 6
    Dernier message: 08/01/2006, 16h26

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