Comparaison avec 1 boucle VBA

Résolu
ezor Messages postés 190 Statut Membre -  
ezor Messages postés 190 Statut Membre -
Bonjour à tous

Je cherche à apprendre le VBA, et pour cela, je fais un petit programme pour arrondir des données à 0.1 pres par valeurs supérieures. Je sais que la fonction ARRONDI.SUP existe mais elle ne me permet pas de faire un tableau dynamique croisé après.

(en effet il y a des doublons. Exemple, si j'ai 2.05 et 2.1, les deux sont arrondis à 2.1 mais dans le TDC, j'ai deux cases 2.1, l'une correspondant à l'ancien 2.05 et l'autre à l'ancien 2.1)

Bref, j'ai fais le code suivant

Sub Arrondi_Calc()

Dim DerLi As Long
DerLi = Range("B" & Rows.Count).End(xlUp).Row

Dim MyRange As Range
Dim Maxi As Long
Set MyRange = Worksheets("feuil1").Range("B3:B" & DerLi)
Maxi = Application.WorksheetFunction.Max(MyRange)

For k = 3 To DerLi
    For i = (-0.2) To Maxi Step 0.1
        If Range("B" & k).Value > (i - 0.1) Then
        Range("C" & k).Value = i
        End If
        Next
        Next
End Sub


avec en B mes données à arrondir et en C les nouvelles valeurs sont écrites.

Le problème est le suivant :

ça fonctionne pour toutes les valeurs sauf pour
1 qui est arrondi à 1.1 (et pas 1)
0.9 qui est arrondi à 1

Je ne connais pas bien le VBA, j'ai déjà programmé un tout petit peu dans d'autre langage, mais là je sèche. Pourquoi n'ai-je un probleme qu'avec la valeur 1?

Merci à tous d'avance

--
ezor

8 réponses

  1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    Bonjour,

    Essaies :
    Option Explicit
    Sub ArrondiSup_Calc()
    Dim DerLi As Long
    Dim MyRange As Range
    Dim K As Long
    Dim X As Double
      
      DerLi = Range("B" & Rows.Count).End(xlUp).Row
      Set MyRange = Worksheets("feuil1").Range("B3:B" & DerLi)
    
      For K = 3 To DerLi
        X = 10 * Range("B" & K).Value
        If X - Int(X) > 0 Then
          Range("C" & K).Value = Int(X + 1) / 10
        Else
          Range("C" & K).Value = Int(X) / 10
        End If
      Next
    
    End Sub

    On peut simplifier :
      For K = 3 To DerLi
        X = 10 * Range("B" & K).Value
        Range("C" & K).Value = Int(X + IIf(X - Int(X) > 0, 1, 0)) / 10
    Next
    

    1
  2. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    Il s'agit d'un problème de précision des calculs, voici un exemple typique :
    Sub Test()
      MsgBox 1.1 - 0.1 - 1
    End Sub 

    1
  3. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    Bonjour,

    Au lieu de
     If Range("B" & k).Value > (i - 0.1) Then


    Utilises
    If Range("B" & k).Value >= i Then

    0
    1. ezor Messages postés 190 Statut Membre 11
       
      Bonjoir et merci pour ta reponse

      J'ai déjà essayé le >=. Mais ça ne regle pas mon problème qui n'apparait que pour les valeurs 0.9 et 1.
      Pour tiutes les autres ça marche bien
      (2,1 reste à 2,1 et 1,91 passe bien à 2 par exemple)

      de plus, si je rajoute une ligne

      Elseif range("b" & k).value = 1 then
      range("c" & k).value = 1


      alors les 1 sont bien tranformés en 1 mais ils apparaissent encore differement dans un TCD par rapport aux 1 qui sont issus de valeurs arrondis (ancinement 0,96 par exemple)

      J'espere que j'arrive à être clair.

      Encore merci pour ton aide

      PS : avec la fonction =ARRONDI.SUP, c'est les valeurs 0.3 et 1.2 qui me posent problème en faisant apparaître deux lignes dans le TDC, les 0.3 anciennement 0.3 et les 0.3 qui proviennent de valeurs arrondies (anciennement entre 0.2001 et 0.29999)
      0
  4. ezor Messages postés 190 Statut Membre 11
     
    Bonjour Patrice33740

    Merci beaucoup, ça a l'air de très bien fonctionner !

    Je cherche à comprendre ce qui donnait des erreurs dans mon code maintenant, parce que ça me semble assez étrange que toutes les valeurs donnent quelques chose de correct sauf deux ou trois, et même avec la fonction excel ARRONDI.SUP.

    Peut être est-ce parce que ton code est plus "propre" et moins compliqué que le mien

    Je vais maintenant pouvoir tenter de gérer le cas où une des cellules que je traites contiens du texte...

    En tout cas encore merci
    ezor
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ezor Messages postés 190 Statut Membre 11
     
    Je me doutais bien que ça venait de quelques chose comme ça. Merci (je n'avais même pas pensé à tester avec un MsgBox la valeur renvoyée...)

    Si ça ne te dérange pas de répondre encore à une de mes questions (naïves?) : y connais tu un moyen dans les options excel ou dans le code vba, pour limiter le nombre de chiffre après la virgule (et ainsi éviter ce genre de problème) ?

    Sinon ce n'est pas bien grave tu m'as déjà bien aidé ;)
    0
  7. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    Re,

    «connais tu un moyen dans les options excel, pour limiter le nombre de chiffre après la virgule (et ainsi éviter ce genre de problème) ?» Oui :
    Option / Calcul / Calcul avec la précision au format affiché

    Sinon tu peux aussi utiliser la fonction ARRONDI(Nombre, Nombre de décimales)

    «connais tu un moyen dans le code vba, pour limiter le nombre de chiffre après la virgule (et ainsi éviter ce genre de problème) ? » Oui et non !!!
    Comme dans les feuilles Excel, tu peux arrondir les valeurs, évite la fonction Round() et utilises plutôt celle-ci : fonction Arrondi()
    Cependant, avec tous les nombres décimaux (Double, Single, Currency, Decimal et Date) il y aura toujours une incertitude (infiniment petite) liée à la précision de calcul comme le msgbox ci dessus.
    0
  8. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    Je sais que la fonction ARRONDI.SUP existe mais elle ne me permet pas de faire un tableau dynamique croisé après.

    (en effet il y a des doublons. Exemple, si j'ai 2.05 et 2.1, les deux sont arrondis à 2.1 mais dans le TDC, j'ai deux cases 2.1, l'une correspondant à l'ancien 2.05 et l'autre à l'ancien 2.1)

    Très étrange, j'ai testé et as réussi à avoir le pb.
    Que ça ne t'empêche pas d'apprendre vba ;-)

    Plus simple (à tester) :
    Sub Arrondi()
        Dim lig As Long
        For lig = 2 To Cells(Rows.Count, 2).End(xlUp).Row
            Cells(lig, 2) = Application.RoundUp(Cells(lig, 2), 1)
        Next lig
    End Sub 


    eric
    0
  9. ezor Messages postés 190 Statut Membre 11
     
    Décidément tu as réponse à tout !

    Je vais tester ces deux cas, je verrai bien. encore merci pour le code fonctionnel.

    0