Calcul d'un minimum

Résolu
titeuf136 Messages postés 91 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 19 octobre 2012 - 14 févr. 2010 à 19:34
titeuf136 Messages postés 91 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 19 octobre 2012 - 16 févr. 2010 à 21:34
Bonjour,

je souhaite extraire la valeur minimum d'une liste de cellules (certaines des cellules sont vides).

Voici mon code:
Sub min_max()


For i = 0 To 6
    min1 = ""
    For n = 3 To 90
        If Cells(60 + i, n) <> "" And Cells(60 + i, n) <> 0 And min1 = "" Then
        min1 = Cells(60 + i, n)
        min2 = min1
        End If
        If Cells(60 + i, n) <> "" And Cells(60 + i, n) <> 0 And min1 <> "" And Cells(60 + i, n) <= min1 Then
        min2 = Cells(60 + i, n)
    End If
    Next n
Cells(73 + i, 7) = min2
Next i


End Sub


Celui-ci ne fonctionne pas!
Pouvez-vous m'aider

Merci

20 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 févr. 2010 à 17:05
Je vois que tu as tout compris de la transformation en tableau dynamique !!!
Le code que je t'ai donné plus haut concernait la recherche d'un minimum dans une colonne !!!
Voilà que maintenant, c'est dans une ligne, que tu le cherches !!!
L'exploitation du tableau résultant n'est plus la même dans ce cas et doit bien évidemment être inversée !
Voilà pour une ligne, donc (tout est inversé) :
Dim tablo, min As Single, i As Integer, j As Integer
 tablo = Range("A1:J1").Value
 MsgBox UBound(tablo, 2)
 For i = 1 To UBound(tablo, 2)
    If IsNumeric(Replace(tablo(1, i), ".", ",")) And Val(tablo(1, i)) <> 0 Then
      min = Replace(tablo(1, i), ".", ","): Exit For
    End If
 Next
 For j = i To UBound(tablo, 2)
   If Val(tablo(1, j)) <> 0 Then
     If IsNumeric(Replace(tablo(1, j), ".", ",")) And Replace(tablo(1, j), ".", ",") < min Then
       min = Replace(tablo(1, j), ".", ",")
     End If
   End If
 Next
 MsgBox min

Dis-moi un peu : ne crois-tu pas que si tu avais essayé un peu de comprendre (voire de faire quelques tests pour t'aider à comprendre), tu aurais pu trouver tout seul la transformation à faire pour traiter une ligne et plus une colonne ?
Et cela t'aurait ouvert d'autres horizons !
En conclusion : il vaut mieux, comme dans le proverbe chinois, apprendre à pêcher plutyôt que de recevoir d'un autre un poisson de temps à autre, non ? (je suis vraiment triste...)

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 févr. 2010 à 20:59
Bonjour, la fonction Moin est à ta disposition ! (la lire dans lo'aide en ligne).
Exemple (et à toi de jouer ensuite)
 dim titi as range
 Set titi = Range("B1:B10")
 MsgBox WorksheetFunction.Min(titi.Value)

pour extraire la plus petite valeur de la plage B1:B10

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
userrrqi115 Messages postés 181 Date d'inscription mardi 18 novembre 2008 Statut Membre Dernière intervention 4 février 2011
14 févr. 2010 à 21:38
Hello,
La fonction MIN n'est pas suffisante dans ce cas car si je ne m'abuse tu souhaites trouver la valeur minimale en dehors du zéro.
Je pense qu'il manque d'abord une réinitialisation du min2 dans le code. Qu'est-ce qui ne fonctionne pas ?
L'ensemble ? ou les valeurs retrouvées sur le 73eme ligne ?
BR

USERRRQI115
Simple user
Great brain
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 févr. 2010 à 22:10
Re...
S'il ne veut pas compter les 0 comme nombres, il gagnera alors en voitesse à utiliser un tableau dynamique, ainsi (exemple) :

Dim tablo
 tablo = Range("B1:c10").Value
 Min = Val(tablo(1, 1))
 For i = 1 To UBound(tablo)
   If Val(tablo(i, 1)) <> 0 And Val(tablo(i, 1)) < Min Then
     Min = tablo(i, 1)
   End If
 Next
 MsgBox Min


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 févr. 2010 à 22:12
correction : lire :
tablo = Range("B1:B10").Value



____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
titeuf136 Messages postés 91 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 19 octobre 2012 1
14 févr. 2010 à 23:26
Merci pour vos réponses,

En testant le code, celui si me donne pour valeur min de ma série min=0.

Cependant je souhaite également ne pas tenir compte des cellules vides (les cellules sans valeurs).

J'ai essayé avec
tablo(i, 1)) <> ""


mais ça ne donne rien de mieux.

Avez-vous des propositions?

Merci
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 févr. 2010 à 23:36
Que nous racontes-tu ?
If Val(tablo(i, 1)) <> 0 And Val(tablo(i, 1)) < Min Then

traite (les écarte) les cellules vides :
Car val("") = 0, précisément ! et donc : If Val(tablo(i, 1)) <> 0 "écarte" les cellules vides)
J'espère que tu n'as pas décidé d'enlever ces Val (...)
En tout état de cause : je viens de tester chez moi (avec des cellules vides.. et d'autres avec des 0.) ===>> aucun problème !

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
titeuf136 Messages postés 91 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 19 octobre 2012 1
14 févr. 2010 à 23:43
ok

j'ai réessayé le code mais celui-ci affiche comme résultat "zéro"

J'ai rajouté la condition "IsNuméric" et cela fonctionne

j'obtient:

Sub mini()


Dim tablo
 tablo = Range("B1:b10").Value
 min = Val(tablo(1, 1))
 For i = 1 To UBound(tablo)
   If IsNumeric(tablo(i, 1)) And Val(tablo(i, 1)) <> 0 And Val(tablo(i, 1)) < min Then
     min = tablo(i, 1)
   End If
 Next
 MsgBox min
 
End Sub


Merci encore pour votre aide
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 févr. 2010 à 23:51
Ce n'est certes pas le rajout de if isnumeric qui vient troubler la fête !
Dis-nous donc : qu'as-tu (mets-le ici) dans tes cellules B1 à B10 ? (le test...) ?

Il est évident que si elles sont toutes vides, ma foi ...

Ton test de numéricité de sert à rien, par ailleurs ( car Val("blabla") = 0 également )

J'en profite par contre pour apporter une amélioration (juste pour le cas où certaines valeurs seraient décimales ) :

Dim tablo, min As Single
 tablo = Range("B1:c10").Value
 min = CSng(tablo(1, 1))
 For i = 1 To UBound(tablo)
   If CSng(tablo(i, 1)) <> 0 And CSng(tablo(i, 1)) < min Then
     min = CSng(tablo(i, 1))
   End If
 Next
 MsgBox min

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
titeuf136 Messages postés 91 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 19 octobre 2012 1
15 févr. 2010 à 00:03
Ok j'ai réessayé en supprimant isnumeric,et cela fonctionne ... Toujours est-il que cela ne marchaist pas auparavant.

En tout cas merci d'avoir proposé le 2ieme code, car en effet certaines valeurs sont décimales.

Merci
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
15 févr. 2010 à 00:04
Attends un peu, là ...
J'espère que tes cellules ne sont pas formatées en texte ... car alors ... (c'est évident !)
Réponds ...

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
titeuf136 Messages postés 91 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 19 octobre 2012 1
15 févr. 2010 à 00:13
Elles sont "format standard" (excel 2007)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
15 févr. 2010 à 00:38
Ben... tu m'en diras tant !
Tu as donc un joli mélange et Excel t'a transformé en texte certaines de tes cellules !
On ne travaille pas ainsi avec un tableur !

Bref... nous voilà donc confrontés à un problème de recherche de la plus petite carotte parmi ... des carottes et des navets !...
On va s'en sortir, mais tu vas voir ce que ça peut coûter cher, loresque l'on mélange ainsi les serviettes et les torchons !

Essaye et tâche de comprendre ce sport (mama mia !)
 Dim tablo, min As String
 tablo = Range("B1:c10").Value
 min = "999999999.99"
 For i = 1 To UBound(tablo)
   If Val(tablo(i, 1)) <> 0 Then
     If Format(CSng(tablo(i, 1)), "00000000#.00") < min Then
       min = Format(CSng(tablo(i, 1)), "00000000#.00")
     End If
   End If
 Next
 MsgBox CSng(min)


PS : je te conseille de cesser de travailler de la sorte ! Excel est un tableur !
Regarde donc le sport dont la nécessité n'est ici générée qu'en raison d'une appli mal pensée !

Bonne nuit.



____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
15 févr. 2010 à 08:20
Re...
Voilà finalement ce que je préfère que tu fasses dans ce mélange de numériques et de textes...
Car je crains, si tu as un tel mélange et que tu as des décimales, que ton séparateur de décimales soit un couip "." et un coup "," ... (on ne sait jamais, dans un tel micmac ...
Alors voilà qui te garantit normalement à 100%
Dim tablo, min As Single, i As Integer, j As Integer
 tablo = Range("B1:B10").Value
 For i = 1 To UBound(tablo)
    If IsNumeric(Replace(tablo(i, 1), ".", ",")) And Val(tablo(i, 1)) <> 0 Then
      min = Replace(tablo(i, 1), ".", ","): Exit For
    End If
 Next
 For j = i To UBound(tablo)
   If Val(tablo(j, 1)) <> 0 Then
     If IsNumeric(Replace(tablo(j, 1), ".", ",")) And Replace(tablo(j, 1), ".", ",") < min Then
       min = Replace(tablo(j, 1), ".", ",")
     End If
   End If
 Next
 MsgBox min

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
titeuf136 Messages postés 91 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 19 octobre 2012 1
15 févr. 2010 à 13:18
Bonjour,

merci pour ces améliorations.

le code fonctionne, pour des données placées entre B1 et B10

mais que faut t'il modifier lorsque les cellules en question sont sur la même ligne?

tablo = Range("A1:J1").Value


En procédant à l'unique changement ci-dessus le résultat affiché est la valeur de la premiere cellule lue.

ex: si sur la 1ere ligne on a:
[vide][vide][3][4][vide][vide][10][2][7][vide]

le résultat affiché est:0 (au lieu de 2)

Merci d'avance
0
titeuf136 Messages postés 91 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 19 octobre 2012 1
16 févr. 2010 à 16:33
Je parviens à établir une liste des données figurant les cellules
j'obtient arrets="3;4;10;2;7"

Sub mini()
arrets = ""
Set f = ActiveSheet
 For m = 1 To 10
    If f.Cells(1, m) <> "" Then
              arrets = arrets & f.Cells(1, m) & ";"
    End If
 Next m


A partir de cette liste qui ne contient plus de "0" comment isoler le minimum? comment faire pour faire références à ces éléments listés

Merci bcp
0
titeuf136 Messages postés 91 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 19 octobre 2012 1
16 févr. 2010 à 20:04
Ne sois pas triste ... même si je ne l'avais pas précisé j'avais pensé a intervertir les indices des tablo. Probablement que j'avais commis une autre erreure car le résultats n'était pas le bon.

Je te rassure cette fois-ci le code fonctionne à merveille.

Désolé pour tous ces dérangements et merci beaucoup pour ton aide !
0
titeuf136 Messages postés 91 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 19 octobre 2012 1
16 févr. 2010 à 20:38
tout de même aurais-tu par hasard la réponse à ma question précédente, à savoir comment interroger un élément de la liste arrci-dessous

Sub mini()
liste = ""
Set f = ActiveSheet
 For m = 1 To 10
    If f.Cells(1, m) <> "" Then
              liste = liste & f.Cells(1, m) & ";"
    End If
 Next m


Merci
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 févr. 2010 à 20:45
Non...
Pourquoi non ?
Parce-que je refuse par principe de mélanger les questions dans une même discussion.
La présente discussion a trouvé sa solution ? ===>>> Tag réponse acceptée (c'est une règle pour moi).
Tu as maintenant une autre question, du genre, apparemment :
J'ai une chaine de caractères composée de strings numériques séparés par un point-virgule. Comment trouver la valeur minimum dans cette chaîne (qui n'est pas une liste, mais une chaîne de caractères !) .
Voilà ! fais comme tu veux, maintenant, mais mon attitude sera, sois-en certain, le résultat de la tienne


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
titeuf136 Messages postés 91 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 19 octobre 2012 1
16 févr. 2010 à 21:34
Désolé je n'avais pas noté ce principe. Je vais immédiatement suivre ton conseil.
0
Rejoignez-nous