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 :

Recherche min dans la colonne d'une variable tableau multidimensionnel


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 338
    Par défaut Recherche min dans la colonne d'une variable tableau multidimensionnel
    Bonjour,

    J'ai une variable tableau et je recherche dans la colonne 23 la valeur minimale. J'ai testé ces 2 hypothèses qui semblent erronées :

    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
    'Hypothèse 1 :
     
    For i = 1 To UBound(recap) Step 1
            If recap(23, i) = Application.Min(Application.index(recap, , 23)) Then
                Feuil4.Range("A2") = recap(1, i)
            End If
    Next i
     
    'Hypothèse 2 :
     
    For i = 1 To UBound(recap) Step 1
            If recap(23, i) = Application.Min(recap(23,)) Then
                Feuil4.Range("A2") = recap(1, i)
            End If
    Next i
    Auriez vous des suggestions ? ou encore mieux une solution ?

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

    travailles-tu en base 0 ou base 1 ?

    En base 0, la 23è colonne porte l'indice 22... ce qui expliquerait ton problème si tu cherches sur l'indice 23

    Et je te conseille de capturer une fois ton Min() plutôt que de le calculer à chaque itération de boucle

    voici un exemple à tester sur une feuille vierge, et te montre que ça fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub ioi()
    Dim Tabl(1 To 1000, 1 To 23)
        For i = LBound(Tabl, 1) To UBound(Tabl, 1)
            For j = LBound(Tabl, 2) To UBound(Tabl, 2)
                Tabl(i, j) = i + j
            Next j
        Next i
    Range("A1").Resize(1000, 23).Value = Tabl
    MsgBox Application.Min(Application.Index(Tabl, , 23))
    End Sub
    ici, j'ai défini la Base 1 lors du dimensionnement de mon tableau
    Mais on peut aussi rester sur ta méthode, en ajoutant tout en haut du module

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

    2 remarques:
    -Application.Min est 10 fois plus lent que la méthode classique
    -Application.Index ne fonctionne pas pour des Arrays > 65.536


    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 MiniArray()
      n = 64000
      Dim a(): ReDim a(1 To n, 1 To 2)
      For i = LBound(a) To UBound(a)
        a(i, 2) = 100000 - i
      Next i
      t = Timer()
      mini = a(1, 2)
      For i = LBound(a) To UBound(a)
        If a(i, 2) < mini Then mini = a(i, 2)
      Next i
      MsgBox Timer() - t
      MsgBox mini
    End Sub
    Avec Application.Min()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Sub MiniArray2()
      n = 64000
      Dim a(): ReDim a(1 To n, 1 To 2)
      For i = LBound(a) To UBound(a)
        a(i, 2) = 100000 - i
      Next i
      t = Timer()
      mini = Application.Min(Application.Index(a, , 2))
      MsgBox Timer() - t
      MsgBox mini
    End Sub
    Fichiers attachés Fichiers attachés

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 338
    Par défaut
    Bonjour et merci pour ces retours qui me sont d'une grande aide.

  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
    Bonsoir,

    Application.index(tbl,,colonne) ne fonctionne plus pour un Array de plus de 65536 lignes.
    Avec une fonction, le calcul est 10 fois plus rapide.

    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
     
    Sub AppelFonctionMini()
      n = 64000
      Dim a(): ReDim a(1 To n, 1 To 2)
      For i = LBound(a) To UBound(a)
        a(i, 2) = 100000 - i
      Next i
      Min = Mini(a, 2)
      MsgBox Min
    End Sub
     
    Function Mini(a, col) ' minimum d'une colonne d'Array
      Mini = a(1, col)
      For i = LBound(a) To UBound(a)
        If a(i, 2) < Mini Then Mini = a(i, col)
      Next i
    End Function
    Boisgontier
    http://boisgontierjacques.free.fr

  6. #6
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Bonsoir,

    en supposant que ton tableau provient de l'une de tes feuilles de ton classeur et donc que l'on a toutes les données à dispo (possible aussi sur un autre classeur ouvert, …)
    sans passer par le tableau on peut aisément récupérer la valeur très rapidement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Demo()
        Feuille$ = "Feuil1"
        Col$ = Split(Columns(23).Address, "$")(2) ' ici Colonne W
        Debug.Print Evaluate("=MIN(" & Feuille & "!A2:A100000)")
        Debug.Print Evaluate("=MIN(" & Feuille & "!" & Col & "2:" & Col & "100000)")
    End Sub
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

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

Discussions similaires

  1. [Toutes versions] Trouver l'index colonne du min dans une variable tableau
    Par patricktoulon dans le forum Macros et VBA Excel
    Réponses: 72
    Dernier message: 21/10/2015, 08h53
  2. Ne coller qu'une coller que la 4è colonnes d'une variable tableau
    Par wyzer dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/05/2011, 09h39
  3. Réponses: 5
    Dernier message: 26/03/2008, 21h48
  4. Recherche dans plusieurs colonnes d'une table
    Par yoline dans le forum Access
    Réponses: 4
    Dernier message: 26/07/2006, 11h58
  5. Recherche dans plusiuers colonnes d'une table
    Par yoline dans le forum Access
    Réponses: 3
    Dernier message: 25/07/2006, 13h00

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