Calcul d'un minimum [Résolu]

titeuf136 91 Messages postés vendredi 15 janvier 2010Date d'inscription 19 octobre 2012 Dernière intervention - 14 févr. 2010 à 19:34 - Dernière réponse : titeuf136 91 Messages postés vendredi 15 janvier 2010Date d'inscription 19 octobre 2012 Dernière intervention
- 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
Afficher la suite 

Votre réponse

20 réponses

Meilleure réponse
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 16 févr. 2010 à 17:05
3
Merci
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

Merci ucfoutu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 14 févr. 2010 à 20:59
0
Merci
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
Commenter la réponse de ucfoutu
userrrqi115 181 Messages postés mardi 18 novembre 2008Date d'inscription 4 février 2011 Dernière intervention - 14 févr. 2010 à 21:38
0
Merci
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
Commenter la réponse de userrrqi115
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 14 févr. 2010 à 22:10
0
Merci
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
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 14 févr. 2010 à 22:12
0
Merci
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
Commenter la réponse de ucfoutu
titeuf136 91 Messages postés vendredi 15 janvier 2010Date d'inscription 19 octobre 2012 Dernière intervention - 14 févr. 2010 à 23:26
0
Merci
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
Commenter la réponse de titeuf136
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 14 févr. 2010 à 23:36
0
Merci
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
Commenter la réponse de ucfoutu
titeuf136 91 Messages postés vendredi 15 janvier 2010Date d'inscription 19 octobre 2012 Dernière intervention - 14 févr. 2010 à 23:43
0
Merci
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
Commenter la réponse de titeuf136
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 14 févr. 2010 à 23:51
0
Merci
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
Commenter la réponse de ucfoutu
titeuf136 91 Messages postés vendredi 15 janvier 2010Date d'inscription 19 octobre 2012 Dernière intervention - 15 févr. 2010 à 00:03
0
Merci
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
Commenter la réponse de titeuf136
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 15 févr. 2010 à 00:04
0
Merci
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
Commenter la réponse de ucfoutu
titeuf136 91 Messages postés vendredi 15 janvier 2010Date d'inscription 19 octobre 2012 Dernière intervention - 15 févr. 2010 à 00:13
0
Merci
Elles sont "format standard" (excel 2007)
Commenter la réponse de titeuf136
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 15 févr. 2010 à 00:38
0
Merci
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
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 15 févr. 2010 à 08:20
0
Merci
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
Commenter la réponse de ucfoutu
titeuf136 91 Messages postés vendredi 15 janvier 2010Date d'inscription 19 octobre 2012 Dernière intervention - 15 févr. 2010 à 13:18
0
Merci
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
Commenter la réponse de titeuf136
titeuf136 91 Messages postés vendredi 15 janvier 2010Date d'inscription 19 octobre 2012 Dernière intervention - 16 févr. 2010 à 16:33
0
Merci
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
Commenter la réponse de titeuf136
titeuf136 91 Messages postés vendredi 15 janvier 2010Date d'inscription 19 octobre 2012 Dernière intervention - 16 févr. 2010 à 20:04
0
Merci
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 !
Commenter la réponse de titeuf136
titeuf136 91 Messages postés vendredi 15 janvier 2010Date d'inscription 19 octobre 2012 Dernière intervention - 16 févr. 2010 à 20:38
0
Merci
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
Commenter la réponse de titeuf136
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 16 févr. 2010 à 20:45
0
Merci
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
Commenter la réponse de ucfoutu
titeuf136 91 Messages postés vendredi 15 janvier 2010Date d'inscription 19 octobre 2012 Dernière intervention - 16 févr. 2010 à 21:34
0
Merci
Désolé je n'avais pas noté ce principe. Je vais immédiatement suivre ton conseil.
Commenter la réponse de titeuf136

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.