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 :

Créer une fonction "find, intersection" [XL-MAC 2011]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2014
    Messages : 21
    Par défaut Créer une fonction "find, intersection"
    Bonjour à tous,

    En me lançant dans ce petit code, j'étais certain d'y arriver, pourtant je bute sur je ne sais quoi, cela ne fonctionne pas.

    Dans un tableau, j'ai besoin de trouver une valeur à l'intérieur de la colonne d'en tête, une autre valeur sur la ligne d'en-tête et d'afficher dans ma cellule la donnée à l'intersection de la ligne et de la colonne.
    Il m'a parut simple de créer pour cela une fonction, mais j'obtiens une erreur #valeur!...
    Qu'est ce qui bug ? Merci pour votre aide.

    voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function Intersection(Argument1, Argument2, plage1, plage2) As Variant
     
    Dim Resultat As Range
    Dim x As Range
    Dim y As Range
     
    Set x = Sheets("Débits").plage1.Cells.Find(Argument1)
    Set y = Sheets("Débits").plage2.Cells.Find(Argument2)
     
    Resultat = Intersect(Range("x"), Range("y"))
    ActiveCell.Value = Resultat.Value
     
    End Function

  2. #2
    Membre chevronné
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2012
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 214
    Par défaut
    Il faudrait typer les arguments en paramètres de la fonction

  3. #3
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

    Tu peux essayer comme cela.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function Intersection(Argument1, Argument2, Plage1, Plage2) As Variant
    Dim x As Range, y As Range
        Set x = Plage1.Find(Argument1, , xlValues, xlWhole)
        If Not x Is Nothing Then
            Set y = Plage2.Cells.Find(Argument2, , xlValues, xlWhole)
            If Not y Is Nothing Then
                Intersection = Application.Intersect(x.EntireColumn, y.EntireRow).Value
            Else
                MsgBox "y non trouvé dans la plage" & Plage2.Address
            End If
        Else
            MsgBox "x non trouvé dans la plage" & Plage1.Address
        End If
    End Function
    Si la valeur recherchée n'est pas trouvée, un message indiquera cet échec.

    Cordialement.

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2014
    Messages : 21
    Par défaut
    Merci pour votre aide mais pour l'instant, je ne parviens pas à faire fonctionner ce code.
    Les deux arguments saisis ne sont pas trouvés dans les lignes et colonnes d'entêtes (alors qu'ils y figurent)
    J'ai lu récemment sur le forum quelle était l'utilité de la double négation (If Not x Is Nothing...) mais cela reste encore nébuleux pour moi... je continue mes recherches.

  5. #5
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Voici un exemple qui te montrera une application du code que je t'ai donné.
    Reste à voir pourquoi tu ne parviens pas a l’adapter à ta situation.
    Problème d'arguments ? de type de données ?

    Cordialement.
    Fichiers attachés Fichiers attachés

  6. #6
    Expert éminent 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
    Par défaut
    Ton truc ne peut pas marcher pour une raison très simple : ton Find renvoie une cellule et non pas une ligne ou une colonne.
    Donc, il n'y a pas d'intersection.
    Il y a aussi le fait que tu mets une référence de cellule comme argument de Range. Tes variable x et y sont déjà des Range, inutile de les mettre dans un objet Range.

    Beaucoup plus simple que de rechercher l'intersection, utiliser les n° de ligne et de colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Resultat = Cells(x.Row,y.Column)
    ActiveCell.Value = Resultat.Value
    Comme tu n'as pas dit dans ta question lequel de x et y représenterait la ligne et la colonne, il se peut que tu ais à inverser x et y dans la première ligne.

    Cela dit, à mon avis, c'est une mauvaise idée de mettre une action dans une fonction.

  7. #7
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2014
    Messages : 21
    Par défaut
    Bonsoir,

    Merci gFZT82 pour la pièce jointe, c'est exactement ce que je souhaite faire. En réalité les deux arguments issus effectivement de menus déroulants proviennent d'une autre feuille. Les menus déroulants par ailleurs, interdisent la saisie d'une valeur erronée, ce qui je crois rend superflu l'usage des messages d'erreurs. Pour autant, si l'idée est bien celle-ci, le code ne fonctionne pas chez moi.
    Je bidouille et j'ai tenté d'inclure au code la proposition de Menhir, mais j'arrive à rien!

    Voici ou j'en suis pour l'instant de mes réflexions :

    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 Intersection(Argument1, Argument2, Plage1, Plage2) As Variant
     
    Dim x As Range, y As Range
     
          Set x = Plage1.Cells.Find(Argument1, , xlValues, xlWhole)                                    'plage horizontale (si je comprends bien, Excel cherche mon argument 1 dans la plage 1 et donne cette valeur à x)
                If Not x Is Nothing Then                                                                               ' (là, j'ai plus de mal à saisir la logique, mais c'est si il ne trouve pas la valeur cherchée !)
           Set y = Plage2.Cells.Find(Argument2, , xlValues, xlWhole)                                   'Plage verticale     (Il cherche le deuxième argument dans la plage 2)
                If Not y Is Nothing Then                                                                               ' (idem à + haut, si il ne trouve pas l'argument 2
            Resultat = Cells(y.Row, x.Column)                                                                    ' là ça se corse... j'imagine qu'il part de la position des valeurs trouvées dans les différentes plages et considère la ligne et la colonne correspondante
            ActiveCell.Value = Resultat.Value                                                                      ' La cellule active prends la valeur de "résultat" mais je ne vois pas trop lequel.
             'Intersection = Application.Intersect(x.EntireColumn, y.EntireRow).Value            ' j'ai mis cette ligne en commentaire pour l'instant, mais je la trouve plutôt logique... il trace la colonne et la ligne des points x et y, puis renvoie la valeur de l'intersection.
                Else
           MsgBox "Argument 2 non trouvé dans la plage" & Plage2.Address                         'Messages d'erreurs'
                End If
                Else
           MsgBox "Argument 1 non trouvé dans la plage" & Plage1.Address                         'Messages d'erreurs'
                End If
     
    End Function

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

Discussions similaires

  1. Créer une Fonction recherche sur Access
    Par remwideco dans le forum Access
    Réponses: 4
    Dernier message: 30/01/2006, 10h36
  2. créer une fonction avec parametre optionnel
    Par maximenet dans le forum Langage
    Réponses: 2
    Dernier message: 29/01/2006, 20h51
  3. Réponses: 6
    Dernier message: 10/08/2005, 11h36
  4. Créer une fonction mathématique pendant l'exécution
    Par zeprogrameur dans le forum Langage
    Réponses: 5
    Dernier message: 09/07/2004, 11h36

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