Valeur minimum d'une chaine de nombres

Résolu
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:43
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 17 févr. 2010 à 14:37
J'ai une chaine de caractères composée de strings numériques séparés par un point-virgule. Comment afficher la valeur minimum de cette chaîne ?

voici la chaine en question:
sur la première ligne de A1 à J1:
[vide][vide][3][4][vide][vide][10][2][7][vide]

voici la chaîne de caractères: liste="3;4;10;2;7"

Celle-ci est obtenue par:

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
end sub


Merci pour votre aide

7 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 à 21:51
Bon...
La fonction split (à lire dans ton aide en ligne) te permetr de transformetr cette chaîne en Array.
Tu as donc obtenu la chaine liste="3;4;10;2;7" ?
donc :
1) pour reprendre ton exemple, qui ne contient que des entiers :
Dim min As Long, liste As String, toto
  liste = "3;4;10;2;7"
  toto = Split(liste, ";")
  min = Val(toto(0))
  For i = 1 To UBound(toto)
    If Val(toto(i)) < min Then min = Val(toto(i))
  Next
  MsgBox min

2) mais si tu risques également d'avoir des nombres décimaux, tu ferais mieux de :

 Dim min As Single, liste As String, toto
  liste = "3,4;4;10;2,1;7"
  toto = Split(liste, ";")
  min = CSng(toto(0))
  For i = 1 To UBound(toto)
    If CSng(toto(i)) < min Then min = CSng(toto(i))
  Next
  MsgBox min


Tu vois ? ==>> Rien de différent entre ce code et le code donné dans ton autre discussion ! Utilisation d'un tableau dynamique dans tous les cas de figure. Seules la/les dimensions du tableau change(nt). Tout le reste est identique

____________________
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
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 à 22:04
Merci beaucoup, pour cette réponse rapide et pour les précisions !

bonne soirée
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 à 23:32
Je t'ai toutefois répondu sur la base de ton travail (donc une fois générée ta chaine Liste.)
Mais je n'aurais jamais fait ce travail là (passer par un tremplin). J'aurais écrit directement ceci, dans un tel cas :
 Dim min As Single, R As Range
  For i = 1 To 10
    If Cells(1, i) <> "" Then
      If R Is Nothing Then Set R Cells(1, i) Else Set R Union(R, Cells(1, i))
    End If
  Next
  min = WorksheetFunction.min(R)
  Set R = Nothing
  MsgBox min


J'aurais en fait été plus loin en affinement (vérification de la validité des valeurs avant de les mettre dans R). Mais entre ce que je te dis là et ce que je t'ai dit ailleurs, tu devrais être capable de le faire seul, ce dernier pas .
Profite pour analyser ce petit bout de code et pour ouvrir ton aide en ligne sur le mot Union.
Tu vas en apprendre, des choses ...
Bonne nuity.

____________________
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
17 févr. 2010 à 10:51
en fait je souhaite calculer la valeur minimum et la valeur maximale de plusieur lignes.

Comment gérer le cas où l'une des lignes est vides

voici le code tel que je l'emploi (il fonctionne):

Sub min_max()
 Dim mini1 As Single, maxi1 As Single, R As Range
   For j = 60 To 66
   Set R = Nothing
   For i = 3 To 93
    If Cells(j, i) <> "" Then
      If R Is Nothing Then Set R Cells(j, i) Else Set R Union(R, Cells(j, i))
      mini1 = WorksheetFunction.min(R)
      maxi1 = WorksheetFunction.Max(R)
      End If
  Next
mini2 = mini1
maxi2 = maxi1
  Cells(j + 13, 7) = mini2
  Cells(j + 13, 9) = maxi2
Next j
End Sub


comment l'optimiser pour ne pas que le code ai besoin de calculer le min et la max à chaque itterration. Si j'effectue ce calcul après construction complète de "R", il se trouve que si "R" est "vide" le code ne fonctionne plus. comment comment conditionner le calcul de min et de max en fonction de R (si R est vide) ?

Merci
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
17 févr. 2010 à 11:08
1) Si R est vide, c'est que toutes ses cellules le sont (et de quel min parlerait-on alors, hein ?)
2) si j'ai bien compris, tu cherches la valeur minimum apparaissant dans une plage de cellules composée de plusieurs lignes et de plusieurs colonnes, c'est çà ?)

Si oui, il te suffit (toujours la même méthode ! ...) de :
Dim min As Single, R As Range, monrange As Range, c As Range
  Set monrange = Range("A1:C10")
  For Each c In monrange.Cells
    If c.Value <> "" Then
      If R Is Nothing Then Set R c Else Set R Union(R, c)
    End If
  Next
  min = WorksheetFunction.min(R)
  Set R Nothing: Set monrange Nothing: Set c = Nothing
  MsgBox min


Si, maintenant, tu cherches le minimum sur chaque ligne (donc plusieurs minimums) c'est différent, mais tu en as déjà le code, non (à adapter si peu !)?
Je souhaites VRAIMENT que tu commences à t'y mettre un peu mieux (commencer à analyser, à comprendre, de sorte à devenir capable de créer et cesser d'être ainsi dépendant à chaque détail à modifier. Tu en as réellement besoin, crois-moi )
____________________
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
17 févr. 2010 à 13:21
En effet je cherche le minimum sur chaque ligne, pour y parvenir, j'ai déjà adpatéle code. Et il fonctionne. C'est à dire que j'arrive à afficher le minimum de chaque ligne dans des cellules différentes.

Le code en question (qui fonctionne)est celui que j'ai inséré dans le message précédent.

Ma question était y a-t-il un moyen d'éviter le calcul de min et de max à chaque itération de "i".

Je précise que dans le cas où je place le calcul du min et du max après les itération de i, si la ligne est vide, le code ne fonctionne pas.

Voilà, toujours est-il que si je pose cette question sur le forum, c'est que j'ai cherché, mais que je n'est pas trouvé de réponse adéquate.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 févr. 2010 à 14:37
Je crois vraiment, ami, que tu devtrais immédiatementg :
14) cesser de fonctionner en copier/coller
2) commencer à faire travailler tes propres méninges ...
Voilà à quoi tu serais parvenu en faisant ce petit effort :

Dim min As Single, R As Range, monrange As Range, c As Range, ligne As Range
  Set monrange = Range("A1:C10")
  For Each ligne In monrange.Rows
      Set R = Nothing
      For Each c In ligne.Cells
        If c.Value <> "" Then
          If R Is Nothing Then Set R c Else Set R Union(R, c)
        End If
    Next
   If Not R Is Nothing Then
     MsgBox "minimum en ligne " & ligne.Row & " ==>> " & WorksheetFunction.min(R)
   Else
     MsgBox "bernique (que dalle)  en ligne : " & ligne.Row
   End If
  Next
  Set R Nothing: Set monrange Nothing: Set c = Nothing


Le développement n'est pas de la copie. C'est aussi et surtout : - de la compréhension - une communion - de la stratégie. Ces 3 qualités sont à mettre en oeuvre ou l'on abandonne.
Moi, je t'abandonne maintenant là


____________________
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
Rejoignez-nous