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 :

Appel d'une fonction VBA depuis une feuille [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    TDG
    Inscrit en
    Mars 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : TDG

    Informations forums :
    Inscription : Mars 2007
    Messages : 152
    Points : 367
    Points
    367
    Par défaut Appel d'une fonction VBA depuis une feuille
    Bonjour

    J'ai écrit le code suivant dans un module VBA :

    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
    Function NumColSemaine(strSheet As String, strPlage As String, Optional dDate As Date)
     
    ' Fonction NumColSemaine
    ' Renvoie le numéro de la colonne de la semaine passée. Par défaut, semaine 
    ' courante (on fait référence à une plage de cellules, en l'occurrence 
    ' "M2:ASJ2", contenant uniquement les dates des lundis : 
    ' ...2 nov 2009, 9 nov 2009, 16 nov 2009, ...)
    ' Arguments :
    ' 1.*Feuille où se trouve la plage de dates
    ' 2. Plage de dates
    ' 3.(facultatif) Date dont on cherche la colonne correspondante – Par défaut : aujourd'hui
    '
     
    Dim c As Object
    Dim iCol As Integer
     
    ' Par défaut, date du jour : recherche colonne semaine actuelle
    If dDate = 0 Then
        dDate = Date
    End If
     
    ' Les colonnes contiennent des dates de lundi, d'où soustraction de Weekday
    Set c = Sheets(strSheet).Range(strPlage).Find(dDate - Weekday(dDate, vbMonday) + 1)
     
        If c Is Nothing Then
            iCol = 0
        Else
            iCol = c.Column
        End If
        Set c = Nothing
     
        NumColSemaine = iCol
     
    End Function
    Problème :
    Quand j'appelle la fonction depuis la fenêtre exécution, tout fonctionne à merveille et l'objet c est rempli des données correspondant à la cellule trouvée.

    En revanche, quand j'appelle la fonction depuis une feuille de calcul, c reste égal à Nothing et la fonction ne renvoie pas la valeur attendue.

    Une idée, quelqu'un?

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Bonjour,

    Il sera bon que tu nous montres comment et depuis quoi (une formule dans une cellule ? si oui : quelle formule ? .... sinon : précises depuis où et comment) tu appelles cette fonction.

    Je remarque par ailleurs que ta "fonction" ne retourne aucune valeur typée !

  3. #3
    Membre averti
    Profil pro
    TDG
    Inscrit en
    Mars 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : TDG

    Informations forums :
    Inscription : Mars 2007
    Messages : 152
    Points : 367
    Points
    367
    Par défaut
    En fait, au stade du test, j'appelle simplement ma fonction depuis une cellule quelconque du classeur, sans l'intégrer à d'autres formules, comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =NumColSemaine(paramètres)
    La fonction est censée retourner un entier. La variable iCol est définie comme Integer, et la fonction renvoie cette valeur.

    Mais il ne semble pas que le problème soit au niveau du typage de la valeur renvoyée. Quand je l'exécute pas par pas, c'est l'objet c, qui n'est pas peuplé de la même façon selon que j'appelle la fonction depuis la feuille ou depuis la fenêtre d'exé. Autrement dit, la méthode range.Find ne semble pas fonctionner de le même manière...

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Commence par typer ta fonction (en integer, si j'ai bien compris)
    montre-nous une formule complète ... ne la remplace pas par "paramètres" (qu'on ne voit pas...)
    vérifie ce que serait Sheets(strSheet).Name (par une msgbox) juste avant ton
    Et dis-nous le format de la cellule où tu l'utilises.

  5. #5
    Membre averti
    Profil pro
    TDG
    Inscrit en
    Mars 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : TDG

    Informations forums :
    Inscription : Mars 2007
    Messages : 152
    Points : 367
    Points
    367
    Par défaut
    J'ai typé la fonction "As Integer"
    Ça ne change rien
    Je l'ai appelée depuis une cellule (au format Nombre) d'une feuille de calcul de différentes façon :
    • = NumColSemaine("Caisse","M2:AZ2")
    • = NumColSemaine("Caisse","M2:AZ2",aujourdhui)
    • = NumColSemaine("Caisse","M2:AZ2",#16/11/2009#)
    • = NumColSemaine("Caisse","M2:AZ2",#11/16/2009#)
    etc.

    J'ai aussi entré les paramètres en dur dans le code pour appeler la fonction sans lui passer de paramètres, en utilisant aussi bien sheets("Caisse") que Sheets(2), en essayant toutes les combinaisons et formats de date possible dans Find. J'ai même essayé dans d'autres plages de chercher des chaînes ou des données numériques.

    À chaque fois, c'est la même chose :
    Ça fonctionne aux petits oignons dans le fenêtre d'exécution, la variable objet c pointe sur la cellule voulue.
    ... et ça ne fonctionne pas quand je l'appelle depuis une feuille du classeur...

    Et le test Sheets(strSheet).Name (par une msgbox) (MsgBox Sheets("Caisse").Name et MsgBox Sheets(2).Name) renvoie bien la MsgBox attendue.

  6. #6
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Sans connaître l'explication exacte,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Function NumColSemaine(strSheet As String, strPlage As String, Optional dDate As Date) As Integer
    Dim c As Range
    Dim DateLun As Variant    '<<<--VARIANT
     
    If dDate = 0 Then dDate = Date
    DateLun = Format(dDate - Weekday(dDate, vbMonday) + 1, "dd/mm/yyyy")  'même format que les données de la feuille
     
    Set c = Sheets(strSheet).Range(strPlage).Find(DateLun)
        If Not c Is Nothing Then NumColSemaine = c.Column
    Set c = Nothing
     
    End Function
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  7. #7
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Bon...

    Je vais faire l'impasse totale sur ton calcul (ce n'est pas lui qui importe, dans ce qui te gêne)

    Nous allons nous contenter ici de retourner la colonne qui a une cellule réunissant la condition (paramètre date fourni ou date du jour sinon...)

    Ceci marche sans faille chez moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Function NumColSemaine(ByVal strSheet As String, ByVal strPlage As String, Optional dDate As Date) As Integer
      Dim c As Object
      Dim iCol As Integer
      If IsMissing(dDate) Or dDate = 0 Then dDate = Date
       Set c = Worksheets(strSheet).Range(strPlage).Find(CStr(dDate))
       If c Is Nothing Then
             iCol = 0
        Else
            iCol = c.Column
        End If
        Set c = Nothing
        NumColSemaine = iCol
    End Function
    Tout le reste: détermination de ce qu'il y a à chercher (résultat de ton calcul) est une autre affaire. Mais observe l'emploi de Cstr.

    Voilà comment se fait l'appel (formule dans cellule) .... exemples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =NumColSemaine("Feuil1";"A1:B100")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =NumColSemaine("Feuil1";"A1:B100";B3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =NumColSemaine("Feuil1";"A1:B100";"20/11/2009")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =NumColSemaine("Feuil1";"A1:B100";AUJOURDHUI())

  8. #8
    Membre averti
    Profil pro
    TDG
    Inscrit en
    Mars 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : TDG

    Informations forums :
    Inscription : Mars 2007
    Messages : 152
    Points : 367
    Points
    367
    Par défaut
    Bonjour mercatog et ucfoutu,

    Merci pour votre aide et vos efforts.

    Malheureusement, je ne parviens pas à faire fonctionner le code de ucfoutu, quelle que soit la syntaxe utilisée (bien sûr, contrairement à ce que j'ai écrit par erreur dans un précédent courriel, j'utilise des points-virgules à la place des virgules dans la feuille de calcul :-), que ce soit pour chercher des dates ou même des valeurs numériques.

    En revanche, le code de mercatog fonctionne à merveille depuis une feuille de calcul (après tout, c'est ça que je voulais), mais pas moyen d'en tirer quelque chose depuis la fenêtre d'exécution. Étrange.

    Merci à tous les deux!

    Philippe

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

Discussions similaires

  1. [Free Pascal] Enregistrer une fonction callback depuis une fonction membre
    Par EpiTouille dans le forum Free Pascal
    Réponses: 3
    Dernier message: 11/03/2015, 11h11
  2. Réponses: 2
    Dernier message: 15/05/2008, 10h45
  3. Appel d'une fonction A depuis une fonction B.
    Par LeFlou dans le forum C++
    Réponses: 9
    Dernier message: 22/05/2007, 17h36
  4. [WebForms]Comment appeler une fonction ASP depuis une JavaScript ?
    Par flagadda dans le forum Général Dotnet
    Réponses: 6
    Dernier message: 11/08/2006, 14h24
  5. [VBA-E] Une fonction Excel dans une fonction VBA
    Par laloune dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 14/07/2006, 10h21

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