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 :

Rechercher valeur Mini dans variable tableau (array)


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut Rechercher valeur Mini dans variable tableau (array)
    Bonjour,
    Lorsque je souhaite rechercher la valeur mini d'une variable tableau, j'ai la valeur 0 qui ressort.
    Voici ma méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub TestMin()
    Dim test(0 To 2) As Double
    test(0) = 7.45
    test(1) = 2.79
    test(2) = 4.5
    With Application.WorksheetFunction
        Debug.Print "Min test: " & .Min(test) ' affiche 0 ?
    End With
    End Sub
    Pourtant si j'affiche la valeur Max j'ai bien 7.45 qui ressort.

    Avez vous une idée?
    Merci beaucoup

  2. #2
    Invité
    Invité(e)
    Par défaut Bonjour, regarde ç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
    20
    Sub TestMin()
    Dim test(0 To 2) As Double
    test(0) = 7.45
    test(1) = 2.79
    test(2) = 4.5
        Debug.Print "Min test: " & MyMin(test) ' affiche 0 ?
        Debug.Print "Max test: " & MyMAx(test) ' affiche 0 ?
    End Sub
    Function MyMin(v) As Double
    Dim I As Long
    For I = 0 To UBound(v)
        If MyMin > CDbl(v(I)) Or MyMin = 0 Then MyMin = CDbl(v(I))
    Next
    End Function
    Function MyMAx(v) As Double
    Dim I As Long
    For I = 0 To UBound(v)
        If MyMAx < CDbl(v(I)) Or MyMAx = 0 Then MyMAx = CDbl(v(I))
    Next
    End Function

  3. #3
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut
    Bonjour.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Demo()
        Test = Array(7.45, 2.79, 4.5)
        Debug.Print "Min test: " & Application.Min(Test)
    End Sub
    Cela me renvoie bien 2.79 …

    Edit : le code de jojo86 fonctionne bien tel quel sous Excel 2003 …

    __________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

  4. #4
    Invité
    Invité(e)
    Par défaut
    autant pour moi
    Dernière modification par AlainTech ; 23/07/2013 à 06h45. Motif: Suppression de la citation inutile

  5. #5
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Bonjour,
    Merci de votre aide.
    Ma variable est une variable dynamique qui est renseignée en parcourant des cellules d'une feuille.

    Pour remplir la variable je fait quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 0 To 3
        test(i) = Cells(i+1,2) 
    Next i
    Comment faire pour remplir la variable de cette manière : Merci !

  6. #6
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    J'ai un gros soucis... Peut être est-ce lié au surmenage...

    J'ai encore 0 avec la fonction que tu m'as donné...
    Mon code de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub TestMyMin()
    Dim i As Integer
    Dim Test() As Double
    ReDim Test(0) 'Initialise la variable
     
    For i = 1 To 3
        ReDim Preserve Test(UBound(Test) + 1) 'j'ajoute une ligne dans la variable
        Test(UBound(Test) - 1) = i 
    Next i
     
    Debug.Print MyMin(Test) ' =0...
    End Sub
    Je ne pige plus rien...
    Merci de votre aide.

  7. #7
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Points : 2 553
    Points
    2 553
    Par défaut
    normal...

    Min(0,1,2,3)=0

  8. #8
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Citation Envoyé par EngueEngue Voir le message
    normal...

    Min(0,1,2,3)=0
    Pourtant ma boucle saisi les valeurs en partant de 1...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For i = 1 To 3
        ReDim Preserve Test(UBound(Test) + 1) 'j'ajoute une ligne dans la variable
        Test(UBound(Test) - 1) = i 'Ajout de 1 puis 2 puis 3 sur les lignes 0, 1, 2 du tableau.
    Next i
    Ca revient au même que de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim Test(0 To 2) as Double
    Test(0) = 1
    Test(1) = 2
    Test(2) = 3

  9. #9
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Points : 2 553
    Points
    2 553
    Par défaut
    Tu oublies ton:

  10. #10
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Redim Test(0) c'est pour remettre à 0 la variable et pour l'initialiser...
    Si je ne met pas de Redim Test(0), il est impossible de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    redim preserve test(...)
    J'ai une erreur dans ce cas.

    Comment faire?

  11. #11
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Points : 2 553
    Points
    2 553
    Par défaut
    for example
    Ne te prends pas la tête et utilise l'application min de ton tableau de doubles que tu ne vas pas redimensionner à chaque step mais dès le début...
    Le redimensionnement est très gourmand..

  12. #12
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Le souci c'est que je suis obligé d'avoir un tableau dynamique car je ne connais pas à l'avance le nombre de lignes de ma variable...

    Le option base 1 ne change rien.
    Je l'ai mis en tête de module, mais j'ai toujours une erreur si je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Option base 1
     
    Sub test
    dim test() as double
     
    Debug.print UBound(test) ' = ERREUR

  13. #13
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    C'est assez confu. Il faudrai plus d'info pour comprendre ce que tu veux faire.

    En attendant, essaie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub TestMyMin()
    Dim i As Integer
    Dim Test() As Double
    ReDim Test(1 To 1) 'Initialise la variable
     
    For i = 1 To 3
        ReDim Preserve Test(1 To i) 'j'ajoute une ligne dans la variable
        Test(i) = i
    Next i
     
    MsgBox MyMin(Test) ' =0...
    End Sub
    Mais le redim n'est pas une solution lorsque c'est employé dans une boucle. Ici, le tableau varie de 1 To 1 à 1 To i et prends la valeur i pour le UBOUND du tableau.

  14. #14
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Points : 2 553
    Points
    2 553
    Par défaut
    Comme cité REDIMENSIONNE UNE FOIS, pas cinquante, tu trouves la loingueur de ton tableau et tu redimensionnes dès le début, pas dans ta boucle

  15. #15
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Ok, ça fonctionne en Initialisant avec :
    Merci beaucoup.

  16. #16
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par EngueEngue Voir le message
    Ne te prends pas la tête et utilise l'application min de ton tableau de doubles que tu ne vas pas redimensionner à chaque step mais dès le début...
    Le redimensionnement est très gourmand..
    Comme cité REDIMENSIONNE UNE FOIS, pas cinquante, tu trouves la loingueur de ton tableau et tu redimensionnes dès le début, pas dans ta boucle
    Entièrement d'accord.

  17. #17
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Points : 2 553
    Points
    2 553
    Par défaut
    pour i > 200 je pense que tu ferais directement mieux de faire dim(1 to 1000000) en terme de temps d'allocation mémoire.

  18. #18
    Invité
    Invité(e)
    Par défaut
    Je viens de faire un bench.
    - La variable en Integer ou en Long ne change rien ici. J'ai fait le test en Long.
    - J'ai mis un DoEvents tous les 150 000 passages (tout juste suffisant). Ici, il n'influe pas sur le temps. 1 DoEvents doit prendre 0,085 ms ici environ. Ici, il y en a 10 au Maximum soit 0,85 ms de perdu (soit rien dutout).
    - J'ai fais le test avec et sans la ligne Test(i) = i et ça ne change rien.
    - ScreenUpdating = False non plus ne change rien.


    25 000 redimensions = 7,8125 ms (le 1er pas du Timer au niveau précision)
    250 000 = 390~445 ms (5 essais)
    2 500 000 = 49 ~ 50,5 s

    On a du x100 au lieu d'avoir du x10 au niveau temps.

    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 TestMyMin()
     
    Dim t(1 To 10) As Single
    t(1) = Timer
    Dim i As Long
    Dim Test() As Double
    ReDim Test(1 To 1) 'Initialise la variable
    t(2) = Timer
    For i = 1 To 2500000
        ReDim Preserve Test(1 To i) 'j'ajoute une ligne dans la variable
        If i Mod (150000) = 0 Then DoEvents
    Next i
    t(3) = Timer
     
    t(4) = (t(2) - t(1)) * 1000
    t(5) = (t(3) - t(1)) * 1000
     
    MsgBox Format(t(4), "###,###.####") & " ms" & Chr(10) & Format(t(5), "###,###.####") & " ms"
     
    End Sub

    Conclusion: Pour les grandes valeurs, le Redim prends du temps, pour les petite valeurs par contre, c'est instantanée.


    -------------------------------------------------- EDIT --------------------------------------------------

    Sans redim à l'intérieur de la 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
    Sub TestMyMin()
     
    Dim t(1 To 10) As Single
    t(1) = Timer
    Dim i As Long
    Dim Test() As Double
    ReDim Test(1 To 250000) 'Initialise la variable
    t(2) = Timer
    For i = LBound(Test) To UBound(Test)
        'Test(i) = i
        If i Mod (250000) = 0 Then DoEvents
    Next i
    t(3) = Timer
     
    t(4) = (t(2) - t(1)) * 1000
    t(5) = (t(3) - t(1)) * 1000
     
    MsgBox Format(t(4), "###,###.####") & " ms" & Chr(10) & Format(t(5), "###,###.####") & " ms"
     
    End Sub
    Temps initialisation du Redim // Temps total :
    250 000 passages = 0 ms / 7,8125 ms (le 1er pas du Timer au niveau précision)
    2 500 000 = 7,8 ~ 15 ms // 80 ~ 105 ms
    25 000 000 = 110 ~ 130 ms // 930 ~ 950 ms
    250 000 000 (250 Millions) = 1 s // 9,5 s (ScreenUpdating = True)
    250 000 000 (250 Millions) = 1 s // 6,6 s (ScreenUpdating = False)
    Dernière modification par Invité ; 16/07/2013 à 20h59.

  19. #19
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut
    Citation Envoyé par jojo86 Voir le message
    Pour remplir la variable je fait quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 0 To 3
        test(i) = Cells(i+1,2) 
    Next i
    Comment faire pour remplir la variable de cette manière : Merci !
    Donc là on a un tableau de quatre indices de B1 à B4 pouvant s'alimenter directement par Test = [B1:B4] ,

    comme s'il avait été dimensionné ainsi : Dim Test(1 to 4, 1 to 1)
    Normal car la source est bien de quatre lignes sur une seule colonne.

    Sinon Test = Application.Transpose([B1:B4]) afin de n'avoir qu'une seule dimension de 1 à 4 …

    Entre les deux, tout dépend de l'utilité réelle de la variable tableau.

    Pour le reste, sans voir plus de code ni de claires explications …

    __________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …


    __________________________________________________________________________________________
    L'expérience, c'est une connerie par jour, mais jamais la même …

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 28/04/2015, 18h28
  2. [MySQL] les caractères accentués renvoient une valeur "null" dans un tableau array
    Par olivier8064 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 21/12/2012, 16h09
  3. recherche valeur max dans un tableau
    Par www.rubis dans le forum Langage
    Réponses: 4
    Dernier message: 31/01/2011, 17h43
  4. Valeur mini dans un tableau
    Par nicolasferraris dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 17/04/2009, 09h23
  5. Faire une recherche de texte dans un tableau de variable
    Par alexxx69 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/02/2006, 13h12

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