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 :

Récuperer la valeur min/max d'une plage variable [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Homme Profil pro
    tech mecanique
    Inscrit en
    Décembre 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Maroc

    Informations professionnelles :
    Activité : tech mecanique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2018
    Messages : 9
    Par défaut Récuperer la valeur min/max d'une plage variable
    Bonjour la communauté, je suis tout nouveau et d'un domaine un peu loin de la programmation (ingenerie mécanique),bref , ma demande est la suivante: recupérer la "norme" à partir de la source , chercher s'il existe dans "piste" dans la cible, si oui récuperer sa valeur minimale (il peut etre une seule ou plusieurs et c'est là ou je me bloque) sinon passer à l'autre "norme" et ainsi de suite.

    sûr de votre collaborartion et compréhension!

    Nom : Capture.JPG
Affichages : 2714
Taille : 61,8 Ko

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Deux questions :
    1) tu es ici dans la section "Macros et VBA Excel". Cela veut-il dire que tu souhaites une solution VBA ?
    2) Si choix par VBA --->> ton image montre des données "Piste" triées. Est-ce systématiquement le cas ?

  3. #3
    Membre habitué
    Homme Profil pro
    tech mecanique
    Inscrit en
    Décembre 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Maroc

    Informations professionnelles :
    Activité : tech mecanique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2018
    Messages : 9
    Par défaut
    Bonsoir unparia,

    tout d'abord merci pour l'interêt,

    deux bonne questions,

    1- oui SVP je cherche une solution VBA excel (j'ai essayé de postrer dans l'endroit approprié qui est VBA pour excel mais j'ai oublié de le mentionner)
    2- oui par hypothése je considère que les valeurs de ma colonne "piste" sont systémetiquement triées, la macro va les exploiter du coup dans l'ordre!

    merci d'avance pour votre Retour.

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Je te propose ceci, en admettant que ton image commence à la colonne B et que tes données commencent en ligne 2. Si tel n'est pas le cas, --->> adapte
    1) supprime de la colonne B tout ce qui n'est pas une valeur de piste (ta colonne B ne doit avoir que ces valeurs et son entête)
    2) supprime de la colonne E tout ce qui n'est pas une "norme" (ta colonne E ne doit avoir que ces valeurs et son entête)

    code :
    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
     
     Dim plage_pistes As Range, plage_norms As Range, groupe As Range, ou As Range, DL As Long, v As Range
      DL = Range("B" & Rows.Count).End(xlUp).Row
      Set plage_pistes = Range("B2:B" & DL)
      DL = Range("E" & Rows.Count).End(xlUp).Row
      Set plage_norms = Range("E2:E" & DL)
      For Each v In plage_norms.Cells
        Set ou = plage_pistes.Find(v.Value)
        If Not ou Is Nothing Then
            Set groupe = ou
            Do While ou.Offset(1).Value = v.Value
              Set groupe = Application.Union(groupe, ou.Offset(1))
              Set ou = ou.Offset(1)
            Loop
            v.Offset(0, 1) = WorksheetFunction.Min(groupe.Offset(0, 1))
        Else
            v.Offset(0, 1).Value = 0
        End If
      Next
    cela devrait "faire" en VBA (puisque tu souhaites du VBA et non des formules) ce que tu cherches à faire

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonjour j' ai tenté une approche avec colonne d:e vide au depart
    mais il semble y avoir un soucis avec les nombre

    Nom : demo2.gif
Affichages : 2513
Taille : 266,0 Ko

    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
    Option Explicit
    Sub test2()
        Dim PA As Range, newc As Range, n#, x$, cel As Range
        With ActiveSheet
             .Range("D2", .Cells(Rows.Count, "D")).Clear
            Set PA = .Range("A2", .Cells(Rows.Count, 1).End(xlUp))
            x = ""
             For Each cel In PA.Cells
                If cel.Value <> x Then
                   n = 100000000
            ' récupération des normes sans doublons dans "D"
                    Set newc = .Cells(Rows.Count, "D").End(xlUp).Offset(1)    'first cellule dispo dans"D"
                    cel.Copy Destination:=newc: x = cel.Value    'copie de la norme dans newc
                    'recuperation de la valeur min
                    If Val(cel.Offset(0, 1).Value) < n Then newc.Offset(0, 1) = cel.Offset(0, 1).Value: n = cel.Offset(0, 1).Value
                End If
            Next
        End With
    End Sub
    Fichiers attachés Fichiers attachés
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 364
    Par défaut
    Bonjour
    ton image me laisse penser que tu utilises l'outil Tableau. Si c'est le cas, la syntaxe VBA pourra être simple.
    Avec Le tableau cible nommé Pistes et le tableau source nommé Normes, un exemple de macro (adaptée de celle de unparia -merci - serait
    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 mini()
      Dim R As Range, C As Range, plage As Range
      [Normes[Mini]] = 0
      For Each R In [Normes[norme]]      'première colonne titrée normee du tableau Normes
        Set C = [Pistes[Piste]].Find(R)  'première colonne du titrée Piste du tableau Pistes
        If Not C Is Nothing Then
          Set plage = C
          Do While C(2, 1) = R
            Set plage = Union(plage, C(2, 1))
            Set C = C(2, 1)
          Loop
          R(1, 2) = Application.Min(plage(1, 2))
        End If
      Next
    End Sub
    Patrick : problème avec les négatifs, le minimum a la plus grande valeur absolue, non ?

    Nota
    : j'en profite pour montrer que l'on peut, pour le décalage, oublier le "Offset" ; C.Offset(x,y) peut être remplacé par C(x+1,y+1)

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    Patrick : problème avec les négatifs, le minimum a la plus grande valeur absolue, non ?
    oui c'est exact pourtant j'ai le max moi en utilisant "<" c'est bizarre et avec app.min aussi
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 364
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    re

    oui c'est exact pourtant j'ai le max moi en utilisant "<" c'est bizarre et avec app.min aussi
    Patrick, ton test ne fait pas boucler sur les valeurs.
    Une autre proposition pour ceux qui utilisent l'outil Tableau (exemple de programmation avec une syntaxe simple à lire et analyser)
    Nom : Exemple.jpg
Affichages : 2404
Taille : 168,6 Ko
    Avec d'écrire une macro, beaucoup ne se posent pas la question : «où vais-je poser ma plume ?» et c'est fort dommage *!

    Remarque : il n'est pas sûr que la méthode filtre soit la plus performante sur de très grands tableaux.

    * pensée du jour : «Pourquoi aller voir ailleurs quand on a ce que qui nous intéresse sous les yeux ?»
    Fichiers attachés Fichiers attachés

  9. #9
    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,

    En espérant avoir compris la demande !
    Avec une formule matricielle qui est ensuite supprimée pour n'en garder que la valeur. Résultat en colonne F à partir de F2.
    Les normes à chercher en colonne D à partir de D2, les pistes en colonne A à partir de A2 et la plage de valeurs des normes en colonne B à partir de B2 :
    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
     
    Sub Test()
     
        Dim Plage As Range
        Dim I As Integer
     
        Set Plage = Range("A1:A21")
     
        For I = 2 To 8
     
            Range("F" & I).FormulaArray = "=MIN(IF((" & Plage.Address & "=D" & I & ")," & Plage.Offset(, 1).Address & "))"
            Range("F" & I).Value = Range("F" & I).Value
     
        Next I
     
    End Sub

  10. #10
    Membre habitué
    Homme Profil pro
    tech mecanique
    Inscrit en
    Décembre 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Maroc

    Informations professionnelles :
    Activité : tech mecanique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2018
    Messages : 9
    Par défaut re
    Bonjour à tous, merci tout d'abord pour l'intérêt que vous avez accordé à ma demande, c'est énorme !

    par contre j'ai essayé d'adapter tout ça à mes tableaux mais sans résultat (j'avoue que j'ai mal exprimé mon besoin), du coup, je vous explique d'avantage mon problématique (ne soyez pas fâchés car je n'ai jamais fais ni informatique ni programmation ) :

    Classeur Fiche 001--->Onglet "source"-->récupérer la valeur de la case rouge -->la chercher dans onglet "Cible" colonne "valeur 3" et récupérer la valeur mini de sa plage depuis colonne "valeur 9" --> coller cette valeur mini dans case rose onglet "source"

    Nom : 123.PNG
Affichages : 2356
Taille : 67,3 Ko

    Nom : 1234.PNG
Affichages : 2297
Taille : 63,7 Ko


    avec mes sincères remerciements chère communauté.

  11. #11
    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
    Pourquoi ne pas avoir tout de suite, posté ta dernière demande ?
    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
     
    Sub Test()
     
        Dim PlgSource As Range
        Dim I As Integer
     
        With Worksheets("Source")
     
            Set PlgSource = .Range(.Cells(2, 3), .Cells(.Rows.Count, 3).End(xlUp))
     
            For I = 2 To PlgSource.Count + 8 Step 8
     
                .Range("E" & I + 4).FormulaArray = "=MIN(IF((Cible!C:C=C" & I & "), Cible!I:I" & "))"
                .Range("E" & I + 4).Value = .Range("E" & I + 4).Value
     
            Next I
     
        End With
     
    End Sub

  12. #12
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Citation Envoyé par OrDonc Voir le message
    Patrick, ton test ne fait pas boucler sur les valeurs.
    Salut Ordonc
    Il n'y a pas que cela
    Il y a d'autres (en plus, donc) petites choses dont celle-ci
    Lorsque l'on écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Val(cel.Offset(0, 1).Value) ....
    Le "de quoi j'me mêle" Monsieur VBA veut soit-disant rendre service (au lieu de dénoncer l'erreur) et "interpréter" la volonté du développeur. Et si la cellule contient un nombre, M. VBA se substitue au développeur pour décider qu'il veut en fait traiter une valeur de type string (puisque val est utilisé) --->> et retourne donc un splendide 0 si le premier caractère de la "chaine de caractères" supposée n'est pas un numérique ("-" n'est pas un numérique).
    Et ce n'est pas tout (d'autres erreurs et/ou maladresses sont là.

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    meme sans val j'ai exactement le meme resultat
    boucle pas sur les valeur
    ????????????,
    a chaque changement de x en colonne A n prends la valeur de l'offset
    et dans literation on test "< que" et change n si affirmatif
    pour info j'ai essayé avec app.min aussi et j'ai exactement le meme resultat

    en fait il fallait simplement ne pas englober le test .value pour "n" dans le if de "x"


    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
    Option Explicit
    Sub test2()
        Dim PA As Range, newc As Range, n#, x$, cel As Range
        With ActiveSheet
            .Range("D2", .Cells(Rows.Count, "D")).Clear
            Set PA = .Range("A2", .Cells(Rows.Count, 1).End(xlUp))
            x = ""
            For Each cel In PA.Cells
                If cel.Value <> x Then
                    n = 100000000
                    ' récupération des normes sans doublons dans "D"
                    Set newc = .Cells(Rows.Count, "D").End(xlUp).Offset(1)    'first cellule dispo dans"D"
                    cel.Copy Destination:=newc: x = cel.Value    'copie de la norme dans newc
                End If    ' la fin de if doit etre ici
                'recuperation de la valeur min
                If CDec(cel.Offset(0, 1).Value) < n Then newc.Offset(0, 1) = cel.Offset(0, 1).Value: n = CDec(cel.Offset(0, 1).Value)
            Next
        End With
    End Sub
    et je remplace val par cdec
    voila et pas besoins de sousboucler
    Nom : Capture.JPG
Affichages : 2276
Taille : 74,0 Ko
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  14. #14
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    meme sans val j'ai exactement le meme resultat
    a sa réponse plus haut, non ?
    Et ce n'est pas tout (d'autres erreurs et/ou maladresses sont là.
    Voilà.

  15. #15
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    je vois pas ou elles sont les autres maladresses

    et pour ne pas etrre limité a un certain nombre
    je remplace "n=1000...." par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    n = Application.Max(PA.Offset(0, 1).Value) + 1
    n demarrera toujours a 1 de plus que le max de la colonne
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  16. #16
    Membre habitué
    Homme Profil pro
    tech mecanique
    Inscrit en
    Décembre 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Maroc

    Informations professionnelles :
    Activité : tech mecanique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2018
    Messages : 9
    Par défaut
    Citation Envoyé par Theze Voir le message
    Pourquoi ne pas avoir tout de suite, posté ta dernière demande ?
    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
     
    Sub Test()
     
        Dim PlgSource As Range
        Dim I As Integer
     
        With Worksheets("Source")
     
            Set PlgSource = .Range(.Cells(2, 3), .Cells(.Rows.Count, 3).End(xlUp))
     
            For I = 2 To PlgSource.Count + 8 Step 8
     
                .Range("E" & I + 4).FormulaArray = "=MIN(IF((Cible!C:C=C" & I & "), Cible!I:I" & "))"
                .Range("E" & I + 4).Value = .Range("E" & I + 4).Value
     
            Next I
     
        End With
     
    End Sub
    c'est exactement ce que je voulais avoir Theze,avec un petit cirière de plus que j'ai pas réussi à intégrer dans ton code :

    .Range("E" & I + 4).FormulaArray = "=MIN(IF((Cible!C:C=C" & I & "), Cible!I:I" & "))" --> je veux plutôt un test à deux critères, je m'explique ,la valeur min dépend en fait des valeurs de la colonne "C" mai aussi de celles de la colonne "F" genre :
    {=MIN(IF(C:C=C,IF(F :F =F,min)))} que j'arrive pas à intégrer!

    Bref pour une valeur de C donné on peut avoir o moins deux plages à déterminer le min :

    Nom : 12345.PNG
Affichages : 2233
Taille : 66,4 Ko

    merci pour le support

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/12/2015, 15h05
  2. [Toutes versions] Rechercher une valeur max dans une plage de cellules variable
    Par Laur3nt62 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/05/2011, 19h34
  3. Recuperer l'adresse d'une valeur (Max d'une plage définie)
    Par karim19 dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 30/10/2009, 12h32
  4. Récuper les valeurs dans formulaire dans une table
    Par antoine1504 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 02/07/2007, 09h06
  5. [C++.NET] Valeurs min/max dans une TextBox
    Par raboin dans le forum VC++ .NET
    Réponses: 4
    Dernier message: 06/04/2006, 17h15

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