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 :

Macro fonction [Débutant(e)] [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Par défaut Macro fonction
    Bonjour a tous,

    Je suis débutant en VBA, et je cherche a créer une fonction simple de boucle, a utiliser dans un de mes fichiers.

    L'idée est la suivante.

    4 variables : un concaténé, une date, une quatité, et une plage de recherche.

    Pour chaque cellule de plage de recherche
    Si le concaténé est égal a la valeur de la cellule
    Si la date (située 5 colonnes a droite de la plage de recherche) est inferieure a la date initiale
    Si la quantité (7 colonnes a droite de la plage de recherche) est superieure ou egale a la quantité initiale,
    Alors on garde en mémoire la date et la quantité
    Et quoiqu'il arrive, on passe a la cellule suivante dans la plage.
    Et on renvoie la date gardée en memoire.

    J'ai essayé de faire un premier jet. Ca donne ça:

    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
    Function DateLotPlusAncien(CCT As String, DteLot As Integer, Qte As Double, Rge As Range) As Integer
     
    Dim DteLotMax, Qtemax As Integer
    DteLotMax = DteLot
    Qtemax = Qte
     
    For Each cell In Rge
    If cell.Value = CCT Then
    If Cells(cell.Row, cell.Column + 5).Value < DteLotMax Then
    If Cells(cell.Row, cell.Column + 7).Value >= Qtemax Then
    Qtemax = Cells(cell.Row, cell.Column + 7).Value
    DteLotMax = Cells(cell.Row, cell.Column + 5).Value
    End If
    End If
    End If
    Next cell
    DateLotPlusAncien = DteLotMax
     
    End Function
    Cependant excel me dit que cela ne fonctionne pas, bien qu'il reconnaisse la fonction.
    Quelqu'un pourrait m'aiguiller sur le chemin a prendre?

    Merci d'avance.
    Cordialement,
    Tinku

  2. #2
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2012
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 564
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    C'est je pense un problème de déclaration de variables.
    Dans la première ligne, toutes les variables "dates" sont définies comme Integer .
    Une variable de ce type ne peut recevoir que des entiers inférieurs ou égaux à 32 767 , or le numéro de série de la date d'aujourd'hui est 41 376.
    Il faudrait plutôt utiliser des variables de type Long.
    De même, je n'ai aucune idée de l'importance des quantités entrant en jeu mais il y une certaine incohérence à définir la variable Qte comme Double et la variable Qtemax comme Integer
    alors qu'on affecte ensuite la valeur contenue dans Qte à la variable Qtmax.
    Cordialement
    Claude

  3. #3
    Membre Expert
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Par défaut
    et j'ajouterai que dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim DteLotMax, Qtemax As Integer
    vous déclarez en fait DteLotMax comme variant et Qtemax comme integer

    la bonne syntaxe pour les déclarer comme integer serait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim DteLotMax as Integer, Qtemax As Integer
    cell est un mot réservé en VBA ile me semble; il faut chager le nom de cette variable (par exemple cellule)
    La déclaration de boucle donnerait plutôt ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for each cellule in rge.cells
    enfin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Cells(cell.Row, cell.Column + 5).Value
    n'est pas assez précis il me semble (je crois avoir des problèmes avec des trucs comme ça).

    Il faudrait idéalement préciser l'objet worksheet devant voir au pire activesheet pour la feuille active

    du coup la déclaration de fonction devient:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Function DateLotPlusAncien(CCT As String, DteLot As Integer, Qte As Double, Rge As Range, optional Feuille as Worksheet) As Integer
    if feuille is nothing then set feuille=activesheet
    J'ai mis l'argument feuille en optional pour ne pas casser tous les appels à cette fonction. Si la feuille n'est pas renseignée alors ce sera activesheet


    Du coup à la place des cells(...).value:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Feuille.cells(.....).value=.....

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Teste car je ne l'ai pas fais :
    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
     
    Function DateLotPlusAncien(CCT As String, DteLot As Integer, Qte As Double, Rge As Range) As Integer
     
        Dim Qtemax As Integer
        Dim Cell As Range
     
        'si utilisée dans Excel comme fonction perso
        '--> Application.Volatile
     
        For Each Cell In Rge
     
            If Cell.Value = CCT Then
     
                If Cell.Offset(, 5).Value < DteLot Then
     
                    If Cell.Offset(, 7).Value >= Qte Then
     
                        Qtemax = Cell.Offset(, 7).Value '<-- et tu en fait quoi ???
                        DateLotPlusAncien = Cell.Offset(, 5).Value
     
                        Exit Function
     
                    End If
     
                End If
     
            End If
     
        Next Cell
     
    End Function
    Tu affecte une valeur à une variable mais après tu veux en faire quoi ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Qtemax = Cell.Offset(, 7).Value
    Hervé.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Par défaut
    Bonjour a tous,

    Merci pour vos conseils et remarques.
    J'ai réussi a faire tourner la macro en prenant vos remarques, en retirant le superflu (merci Theze pour m'avoir fait remarqué l'inutilité de garder en memoire la Qtemax)

    Le code est finalement le suivant:

    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
     
    Function DateLotPlusAncien(CCT As String, DteLot As Long, Qte As Double, Rge As Range) As Long
     
        Dim Cell As Range
     
        DateLotPlusAncien = DteLot
     
        For Each Cellule In Rge.Cells
     
            If Cellule.Value = CCT Then
     
                If Cellule.Offset(, 5).Value < DteLot Then
     
                    If Cellule.Offset(, 7).Value >= Qte Then
     
                        DateLotPlusAncien = Cellule.Offset(, 5).Value
     
                        Exit Function
     
                    End If
     
                End If
     
            End If
     
        Next Cellule
     
    End Function
    Et tout ça pourra surement m'aider pour les potentiels macros suivantes.

    Bonne journée a tous.

    Tinku

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

Discussions similaires

  1. macro fonction personnalisée
    Par db84360 dans le forum Débutez
    Réponses: 6
    Dernier message: 06/10/2011, 09h03
  2. [XL-2003] macro/fonction simple qui ne recalcule pas après modif
    Par akka01 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 14/03/2011, 08h17
  3. Questions Macros Fonctions
    Par Jason T dans le forum VBA Access
    Réponses: 3
    Dernier message: 13/05/2009, 18h23
  4. macro : fonction recherche
    Par M8407108 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 13/12/2007, 23h45
  5. exécution macro fonction dans VBE
    Par Maxence45 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 12/11/2007, 08h57

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