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écupérer la plus petite valeur d'un array


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Octobre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Octobre 2016
    Messages : 5
    Par défaut Récupérer la plus petite valeur d'un array
    bonjour à tous,
    nouveau sur ce forum et en VBA, je cherche une fonction me permettant de retrouver le plus petit nombre d'un tableau, au préalable trié.
    objectif : générer un planning automatiquement

    Je m'explique :
    **phase 1 : le tri : je récupère le nom des personnes et le nombre de fois où ils sont présent dans le planning.
    ca...c'est bon : a la fin j'ai bien mon tableau avec (toto, 0) (tutu,0) (tata,1)

    **phase 2 : l'équilibrage : je souhaiterai équilibrer les présences de chacun (pour pas que toto apparaisse 5 fois sur le planning et tutu 0 fois par exemple)
    c'est la que je bloque ! quand j'appuie sur mon bouton "générer mon planning", je vois les noms qui s'inscrive mais a la fin de ma boucle il n’écris personne !
    voici mon code (peut être pas adapté vu mes faibles connaissances en 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
      'on fait une reccherche dans notre tableau de niveau 1 pour comparer le plus petit nombre de départ
                For m = 0 To lignes_tab_niveau1
                    grade_Compare = tab_niveau1(m, 0)
                    nom_Compare = tab_niveau1(m, 1)
                    nbstats_Compare = tab_niveau1(m, 2)
     
     
                    'on recupere le 1er de notre tableau pour comparer
                    premier = tab_niveau1(0, 2)
     
                    If nbstats_Compare < premier Then
                        premier = nbstats_Compare
                        grade_Recup = grade_Compare
                        nom_Recup = nom_Compare
     
                    End If
                    'on écris le résultat récupéré
                    espace = "          "
                    compil_Recup = grade_Recup + espace + nom_Recup
                    'variable J étant une boucle supérieure pour les colonnes
                    Sheets("planning").Cells(15, J).Value = compil_Recup
     
                Next m
    n'hésitez pas a me demander plus de précision si ma demande n'est pas assez claire....
    d'avance merci pour votre aide précieuse !

    bonne journée

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x = Application.Min(Tbl)
    Boisgontier

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Octobre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Octobre 2016
    Messages : 5
    Par défaut
    merci pour votre réponse.
    c'est un tableau a 2 dimenions. comment puis je récupérer le nom associé a cette plus petite valeur ?
    ex : tab_niveau1(toto,0) le X me retourne 0 mais pas "toto"
    d'avance merci

  4. #4
    Membre chevronné
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Par défaut
    L'utilisation d'un dictionnaire ici me parait plus simple :
    http://boisgontierjacques.free.fr/pa...ctionnaire.htm

    (oui en plus ca vient de toi boisgontier )

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Noms en colonne A, Nombres en colonnes B

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Sub essai()
      Tbl = [A1:B5]
      mini = Application.Min(Tbl)
      pos = Application.Match(mini, Application.Index(Tbl, , 2), 0)
      nom = Tbl(pos, 1)
      MsgBox nom
    End Sub

    Boisgontier

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Octobre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Octobre 2016
    Messages : 5
    Par défaut
    j'ai essayé d'adapter mon code a celui que tu vous m'avez proposé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mini = Application.Min(tab_niveau1)
                pos = Application.Match(mini, Application.Index(tab_niveau1, , 2), 0)
                nom_Recup = tab_niveau1(pos, 1)
     
                MsgBox nom_Recup
    il me sort une erreur "erreur d'execution 13 : incompatibilité de type"sur la ligne nom_Recup

    Desolé de vous soliciter encore !

    Merci

  7. #7
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    sans nous montrer la déclaration des variables, et la partie du code où ton tab_niveau1 est crée/alimenté ... il est difficile de te montrer où est le problème.

    Clairement ça ressemble à une variable mal typée

    tu peux le voir assez simplement en testant le type de tes variables si elles ne sont pas typées (chose déconseillée)

    ==> Utiliser la fonction TypeName(MaVariable) qui te retourne le type de la variable si tu veux te dépanner seul

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Octobre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Octobre 2016
    Messages : 5
    Par défaut
    Bonjour Joe,

    merci pour ta réponse. Voici comment je créé mon tab_niveau1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim tab_niveau1()
    ReDim tab_niveau1(60, 2)
    voici comment je l'alimente dans une boucle :

    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
    grade = Sheets("personnel").Cells(i, 1).Value
    nom = Sheets("personnel").Cells(i, 2).Value
    espace = "          "
    compil = grade + espace + nom
     
    dispoLundiNuit = Sheets("dispo").Cells(i, J - 1).Value
    aptitudeStats = Sheets("personnel").Cells(i, 12).Value
     
                    If aptitudeStats = "oui" And dispoLundiNuit = "ST" Then
                        'on récupere la 1ere ligne vide dans le tableau niveau 1
     
                        trouve = 0 'première ligne à vérifier
                        Do While Not IsEmpty(tab_niveau1(trouve, 0))
                                trouve = trouve + 1
                        Loop
     
     
                        plage1 = Application.WorksheetFunction.CountIf(Worksheets("planning").Range("D15:M15"), compil) 'somme des stationnaires
                        plage2 = Application.WorksheetFunction.CountIf(Worksheets("planning").Range("I15"), compil)  'somme samedi jour
                        plage3 = Application.WorksheetFunction.CountIf(Worksheets("planning").Range("K15"), compil)  'somme dimanche jour
                        plage4 = Application.WorksheetFunction.CountIf(Worksheets("planning").Range("M15"), compil)  'somme jour ferie
                        nbstats = plage1 - plage2 - plage3 - plage4
     
                        tab_niveau1(trouve, 0) = grade
                        tab_niveau1(trouve, 1) = nom
                        tab_niveau1(trouve, 2) = nbstats
                    End If
    le tableau est bien allimenté et que je regarde le type de variant, dans la fenetre des variables locales, mon tab_niveau1 est bien alimenté et me retourne un type "VARIANT"
    si tu le souhaite je peux t'envoyer le fichier excel complet.
    Merci pour votre aide !

  9. #9
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonjour,

    Dans l'exemple que j'ai donné, on suppose que le tableau Tbl(,) est un Array(1 to x, 1 to y).

    Sans Option Base 1, Dim xxx(60,2) donne un Array (0 To 60,0 To 2)

    Déclarer le tableau avec:

    Dim tab_niveau1(1 To 60, 1 To 2)


    Boisgontier
    Fichiers attachés Fichiers attachés

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Octobre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Octobre 2016
    Messages : 5
    Par défaut
    merci Jacques pour ton fichier joint,

    tout le probleme réside dans cette utilisation du array ; en effet, mon tab_niveau1 est un array qui s'alimente dans mon code VBA et non une récupération de donnée depuis des cellules d'excel (dans ton exemple, le tableau est issu de [A1:B5]).

    Quand tu avais écris ta première fonction j'avais bien vu que ton code marchais bien avec tbl, issu des cellules excel mais pas depuis un array declaré et alimenté en VBA
    Mon tab_niveau1 est un tableau temporaire de tri en fait (il récupére que les personnes qui correspondent a des criteres precis, pour le jour en question).

    en mettant le debogueur, la variable "pos" retourne une erreur 2042.
    Le "application.Match(mini, Application.Index(tab_niveau1, , 2), 0)" ne doit pas aimer les "array locales" puisque "application.Match(mini, Application.Index(Tbl, , 2), 0)" fonctionne bien....

    J'ai déclaré également mon Dim tab_niveau1( 0 to 60,0 to 2) = je suis obligé de partir de 0 et non pas 1 to 60, 1 to 2 comme tu me l'as proposé dans ton dernier message, sinon le fichier excel me retourne une erreur.
    je ne sais plus trop quoi faire la.......

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/07/2016, 11h08
  2. Réponses: 8
    Dernier message: 28/09/2012, 11h44
  3. [XSL]Récupérer les 5 plus petites valeurs de 10 éléments
    Par muad'dib dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 02/03/2009, 18h04
  4. Initialiser un double à la plus petite valeur possible.
    Par Pierre8r dans le forum Général Java
    Réponses: 4
    Dernier message: 05/03/2008, 20h36
  5. [SQL] Sélectionner la plus petite valeur
    Par Gabout dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 30/04/2007, 10h36

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