Faire des calculs avec le contenu d'une cellule

Résolu
roideseaux Messages postés 274 Statut Membre -  
roideseaux Messages postés 274 Statut Membre -
Bonjour,

Je suis en train de faire un fichier qui formalise un autre fichier.
En gros, j'ai des lignes avec des virgules entre chaque éléments. Donc pour déparer ces éléments, j'ai utilisé des formules qui chope la virgule etc... bref :
Je souhaiterais une macro qui me retourne seulement les chiffres contenus dans une colonne (correspondant à un élément), sauf que dès que je fais un petit calcul avec cette valeur, j'ai une erreur : "argument ou appel de procédure incorrect".
Je pense que ça vient du fait que j'ai une formule dans ma cellule mais comment faire pour ma macro ne prenne en compte que le contenu de la cellule et non sa formule ?

Merci !

13 réponses

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    à tester sur différents cas :
    Dim a  As String, v As Single, unite As String
    a = "2.2k"
    v = Val(a)
    unite = Mid(a, Len(CStr(v)) + 1)

    S'il peut y avoir des , en séparateur décimal les remplacer par des . :
    a = Replace(ta_chaine, ",", ".")
    eric

    En essayant continuellement, on finit par réussir. 
    Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
    En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
    1
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    Pourrais-tu donner quelques exemples de la situation de départ, et de la situation finale que tu attends, après exécution de la macro?
    Ta question est un peu confuse. La partie utile de ta question est "Je souhaiterais une macro qui me retourne seulement les chiffres contenus dans une colonne (correspondant à un élément)". Cependant, une macro ne "retourne" rien, ce n'est ni une formule ni une fonction.
    0
  3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    Avec ce code-ci:
    Option Explicit
    Function rdsnum(ByVal inp As String) As Long
    Dim c As String
    rdsnum = 0
    Do While Len(inp) > 0
        c = Left(inp, 1)
        inp = Right(inp, Len(inp) - 1)
        If IsNumeric(c) Then
            rdsnum = 10 * rdsnum + CInt(c)
        Else
            Exit Function
        End If
    Loop
    End Function
    Function rdsstr(ByVal inp As String) As String
    Dim c As String
    Do While Len(inp) > 0
        c = Left(inp, 1)
        
        If IsNumeric(c) Then
            inp = Right(inp, Len(inp) - 1)
        Else
            Exit Do
        End If
    Loop
    rdsstr = inp
    End Function
    
    

    Tu peux utiliser des formules telles que =rdsnum(A1) et =rdsstr(A1) pour obtenir soir le nombre, soit les lettres.
    0
  4. roideseaux Messages postés 274 Statut Membre 5
     
    Ça a l'air de plutôt bien fonctionner, juste une chose, j'ai parfois un point dans la valeur pour avoir des décimales, mais du coup, ça coupe avant ce point, et vu que je ne comprend pas tout le code...
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      Alors ceci?
      Function rdsnum(ByVal inp As String) As Single
      rdsnum = 0
      Do While Len(inp) > 0
          If IsNumeric(inp) Then
              rdsnum = inp
              Exit Function
          End If
          inp = Left(inp, Len(inp) - 1)
      Loop
      End Function
      Function rdsstr(ByVal inp As String) As String
      Dim c As String
      Do While Len(inp) > 0
          c = Left(inp, 1)
          If IsNumeric(c) Or c = "." Then
              inp = Right(inp, Len(inp) - 1)
          Else
              Exit Do
          End If
      Loop
      rdsstr = inp
      End Function
      
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 833
     
    Bonjour
    Quel code as tu écris ?
    -1
  7. roideseaux Messages postés 274 Statut Membre 5
     
    J'ai récupéré ce code sur un autre sujet (qui est censé servir à séparer les éléments d'une adresse postale) :

    Sub extrac()
    Dim c As Range, t As Integer
    Set c = Range("A2")
    Do While c <> ""
    For t = InStr(InStr(c, " "), c, " ") To Len(c)
    Select Case Mid(c, t, 1)
    Case "0" To "9"
    Exit For
    End Select
    Next t
    c(1, 2) = Mid(c, 1, t - 2)
    c(1, 3) = Mid(c, t, 5)
    c(1, 4) = Mid(c, t + 6)
    Set c = c(2, 1)
    Loop
    End Sub


    L'erreur est au moment ou la macro est rendue à la ligne
    For t = InStr(InStr(c, " "), c, " ") To Len(c)
    -1
  8. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 833
     
    Je ne comprend pas trop ton code....

    Sachant que :

    j'ai des lignes avec des virgules entre chaque éléments. Donc pour séparer ces éléments,...

    Pourquoi ne pas directement utiliser la fonction "Split" ?

    Vas voir ici : https://silkyroad.developpez.com/VBA/ManipulerChainesCaracteres/#LI-I

    -1
  9. roideseaux Messages postés 274 Statut Membre 5
     
    En fait, la partie séparation de ma ligne de base, c'est bon, je suis passé par des formules mais dans un des résultats que j'ai obtenu et stocké dans une cellule, il y a des chiffres et des lettres, du style 100nF ou 2.2k (ce sont des valeurs de composants et la casse peut varier). Ce sont ces chiffres que je voudrais récupérer dans une nouvelle cellule de la même ligne (avec la première lettre ou les deux premières lettres qui suivent).

    Le problème, c'est que je ne suis pas hyper doué en macro, et je suis loin de connaitre toutes les fonctions disponibles !
    -1
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      Donc tu veux éliminer les dernières lettres? Comment déterminer si tu veux garder une ou deux lettres?
      0
  10. roideseaux Messages postés 274 Statut Membre 5
     
    En fait, je souhaite récupérer la valeur du composant (les chiffres séparés des lettres, dans deux cases différentes) pour pouvoir ensuite comparer avec le contenu d'une colonne d'une autre feuille, afin de voir si je trouve une correspondance et du coup récupérer la référence qui y est associée...

    Je peux être plus précis, avec des exemples si besoin...
    -1
  11. roideseaux Messages postés 274 Statut Membre 5
     
    j'ai le même résultat :/
    -1
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      Ton système est configuré pour utiliser le point comme séparateur décimal?
      0
  12. roideseaux Messages postés 274 Statut Membre 5
     
    Oui, j'ai le point configuré en séparateur décimal, j'ai essayé de rajouter dans rdsnum ce que tu as rajouté dans rdsstr mais j’ai toujours la même chose :/
    Option Explicit
    Function rdsnum(ByVal inp As String) As Single
    rdsnum = 0
    Do While Len(inp) > 0
        If IsNumeric(inp) Or c = "." Then
            rdsnum = inp
            Exit Function
        End If
        inp = Left(inp, Len(inp) - 1)
    Loop
    rdsnum = inp
    End Function
    Function rdsstr(ByVal inp As String) As String
    Dim c As String
    Do While Len(inp) > 0
        c = Left(inp, 1)
        If IsNumeric(c) Or c = "." Then
            inp = Right(inp, Len(inp) - 1)
        Else
            Exit Do
        End If
    Loop
    rdsstr = inp
    End Function
    -1
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      Tu peux partager un fichier qui montre ce qui ne marche pas?
      0
  13. roideseaux Messages postés 274 Statut Membre 5
     
    A priori, je ne peux pas mettre de lien...
    Tu pourrais m'indiquer ou je peut héberger pour que tu puisses y jeter un oeil ?
    -1
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      cjoint.com pour déposer un fichier.
      Et ce que je t'ai proposé, c'est bon ????
      Chez moi oui en tout cas
      0
    2. roideseaux Messages postés 274 Statut Membre 5 > eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Eh bien j'ai essayé quelques trucs mais je n'ai réussi à n'obtenir que les lettres, pas les chiffres :/
      0
    3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      v = la valeur numérique
      à condition d'avoir 2.2k et non 2,2k auquel cas :
      v=Val(Replace(a, ",", "."))
      qui fonctionne dans les 2 cas
      0
    4. roideseaux Messages postés 274 Statut Membre 5 > eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Oui, ca j'ai compris, ce que je n'ai pas réussi, c'est à l'appeler à partir de ma feuille... :/
      0
    5. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Il faut le mettre sous forme de fonction si tu veux l'appeler depuis une feuille (comme les autres exemples que tu as eu).
      Function rdsnum(ByVal inp As String) As Single
          rdsnum = Val(Replace(inp, ",", "."))
      End Function
      
      Function rdsstr(ByVal inp As String) As String
          rdsstr = Mid(inp, Len(CStr(Val(Replace(inp, ",", ".")))) + 1)
      End Function
      


      Option Explicit doit se trouver en début de module si tu veux qu'il serve.
      0
  14. roideseaux Messages postés 274 Statut Membre 5
     
    Voilà un lien pour obtenir mon fichier
    https://www.cjoint.com/c/FKCwCQhww7x
    Je voudrais obtenir dans les cases V15 et W15 respectivement les chiffres et les lettres de la case N15
    Idem pour toutes les lignes

    Et si quelqu'un peut également jeter un rapide coup d'oeil à ma macro pour créer un fichier et y coller le contenu des lignes qui ne sont pas vides de la colonne A a T, ce serait cool (parce que là aussi je butte :/)
    -1
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      Peut-être mieux de faire une autre question pour le deuxième sujet?
      0
      1. roideseaux Messages postés 274 Statut Membre 5 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        ouai ^^
        0