Modification en % de nombres sous excel

Résolu
Bonjour,

Je fais des devis sous excel, et souvent j'ai besoin de modifier les prix d'un certain pourcentage (baisser ou augmenter, dependant du client et de l'avis du chef :), Donc je me suis demande s'il serait possible de faire une macro qui applique une reduction/augmentation, en pourcentage, sur les chiffres des cellules selectionnees actuellement.

Par exemple j'ai une colonne K2 a K37 de chiffres, et je veut augmeter tous les chiffres de 5%, donc je selectionne les cellules a modifier, et je clik sur la macro, qui me demande le pourcentage, et en validant elle l'applique aux cellules selectionnees.
Configuration: Windows 7
Firefox 3.5.7

40 réponses

  • Votes
  • Date
  • Date décroissante
Résumé de la discussion

Une demande porte sur la création d'une macro Excel permettant d'appliquer un pourcentage d'augmentation ou de réduction sur les valeurs des cellules sélectionnées, en fonction du client. Pour répondre, il est recommandé d'appliquer le facteur via une instruction qui multiplie la valeur sélectionnée par le pourcentage, par exemple Selection.Value = Selection.Value * Valeur, et d'anticiper les cas non numériques. Des échanges évoquent les problématiques liées aux cellules non numériques, aux cellules vides et à la compatibilité avec différentes versions d'Excel, ainsi que l'usage de la plage de cellules réellement sélectionnée. En pratique, certaines propositions préconisent de vérifier la présence d'un texte ou d'éléments non numériques avant d'appliquer le calcul, afin d'éviter les erreurs Type Mismatch.

Bobot (l’IA à votre service)
  1. Oui, ca marche enfin XD. Par contre, j'ai change un peu le code pour le rendre plus facile a utiliser :
    Sub test_du_matin()
          Dim Plage As Range
          Dim Valeur As Double
          Valeur = Application.InputBox("Saisissez 0.5 par exemple", Type:=1)
                If Valeur = 0 Then Exit Sub
          Set Plage = Application.InputBox("Sélectionnez une plage !", "Sélection de cellules", Type:=8)
          For Each Cell In Plage
          Cell.Value = Cell.Value * ((100 + Valeur) / 100)
          Next
    End Sub


    De cette facon en utilisant un nombre positif on ajoute un pourcentage, et en utilisant un nombre negatif on deduit le pourcentage, et on utilise le pourcentage directement sans calculer le taux de reduction. En tout cas je viens d'apprendre une chose importante : je n'avais pas pense a essayer d'utiliser
    For Each Cell In Plage
    pour faire une boucle sur les cellules selectionnees.

    Oki, avec ce que tu m'a montre j'ai essaye une autre methode et apparement ca marche chez moi :
    Sub test_du_matin2()
          Dim Plage As Range
          Dim Valeur As Double
          Valeur = Application.InputBox("Saisissez 0.5 par exemple", Type:=1)
                If Valeur = 0 Then Exit Sub
          Set Plage = Selection
          For Each Cell In Plage
          Cell.Value = Cell.Value * ((100 + Valeur) / 100)
          Next
    End Sub
    

    Le probleme venais du fait que j'essayais d'utiliser une propriete sur une propriete, c'est-a-dire que j'utilisais Range sur Selection, alors que les deux sont des proprietes. Mais ceci ne vaut que pour mes essais, je vois toujours pas pourquoi les 1eres macros que vous m'avez donne ne marchaient pas.

    Ah, merci a vous et merci pour vos efforts pour m'aider ^^
    1. Ouff,

      Je suis content d'en avoir fini avec ce problème.

      Bonne journée a tous

      a bientot (surtout pour pijaku que je croise souvent sur le forum)
  2. Modérateur
    Bonjour,
    Tout le monde est en forme? Vous avez pris le café? bien déjeuner car c'est important...
    On peux commencer?
    Allons y.
    Cette procédure permet de choisir un taux et ensuite, grâce à une Inputbox de sélectionner la plage de cellules (sources : https://apprendreexcel.com/ ou appliquer ce taux. Dites moi ce que ça donne chez vous :

    Sub test_du_matin()
          Dim Plage As Range
          Dim Valeur As Double
          Valeur = Application.InputBox("Saisissez 0.5 par exemple", Type:=1)
                If Valeur = 0 Then Exit Sub
          Set Plage = Application.InputBox("Sélectionnez une plage !", "Sélection de cellules", Type:=8)
          For Each Cell In Plage
          Cell.Value = Cell.Value * Valeur
          Next
    End Sub

    1. Je ne suis pas sur mais, serait-ce possible que les regles sur les types de variables sont devenues plus strictes avec la version 2007? parce que je ne vois pas d'autres explications.
      1. Joli, mais j'obtiens toujours la meme erreur a la ligne

        Selection.Areas(i).Value = Selection.Areas(i).Value * Valeur


        Par contre, moi j'ai essaye de faire pareil mais avec la propriete Range.
        1. Donc voici avec la correction messagebox :

          Sub DisplayColumnCount()
          Dim iAreaCount As Integer
          Dim i As Integer
          Valeur = Application.InputBox("Saisissez 0.5 par exemple", Type:=1)
          Worksheets("feuil1").Activate
          iAreaCount = Selection.Areas.Count

          For i = 1 To iAreaCount
          Selection.Areas(i).Value = Selection.Areas(i).Value * Valeur

          Next i

          End Sub
          1. J'ai enfin trouvé quelque chose de valable :

            Sub DisplayColumnCount()
            Dim iAreaCount As Integer
            Dim i As Integer

            Worksheets("feuil1").Activate
            iAreaCount = Selection.Areas.Count

            For i = 1 To iAreaCount
            Selection.Areas(i).Value = Selection.Areas(i).Value * 2 'mettre à la place de 2 la messagebox du debut

            Next i

            End Sub

            merci de tester et me faire un retour
            1. Avant de venir ici, j'avais favorise l'idee de faire une variable type range ou array, chaque valeur de la variable contenant les cellules selectionnees, et ensuite d'aller faire les valeurs une a une et les modifier. Ceci viens de la facon dont je ferais le code si je devais le faire en php. Le probleme c'est qu'etant debutant en VB, j'ai du mal a comprendre el fonctionnement des proprietes des objets. Vu que la simple macro que vous m'avez donne au debut ne marche pas chez moi, je serais pas surpris que mes essais infructeux ont la meme origine.
              1. pour les cellules vides ce n'est pas un probleme si tu ajoute un truc du genre
                If Range("H" & i).Value <> "" Then
                


                Euh, j'avais fait un essai avec ce genre de truc et ca avait marche, mais l'autre probleme c'est celui de la selection, la j'ai pris pour test un devis faisant une page, mais j'ai souvent des devis qui depassent 400 lignes, d'ou mon interet pour la macro. D'ou, aussi, mon besoin que je puisse indiquer facilement a la macro quelles cellules modifier. Le besoin de modifier les cellules selectionnees automatiquement, c'est a cause d'eventuels autres utilisateurs qui pourraient essayer d'utiliser la macro. Il serait plus facile pour eux de simplement selectionner les cellules a modifier au lieu de devoir ecrire la colonne et les lignes a editer, ou meme editer la macro.
                1. Modérateur
                  Alors suivons la logique. Essaie ceci:
                  Sub test()
                  Dim Valeur As Double
                  Dim i as Integer
                  Valeur = Application.InputBox("Saisissez 0.5 par exemple", Type:=1)
                  If Valeur = 0 Then Exit Sub
                  For i = 10 to 25 '10 étant la 1ère ligne traitée et 25 la dernière
                  Range("H" & i).Value = Range("H" & i).Value * Valeur 'H représente la colonne traitée, bien sur!!
                  Next i
                  End Sub
                  1. Chez moi ca marche bien,

                    seul bemol : des 0,00 apparaissent dans les cellules vides de la selection H10:H25

                    a+
                  2. @jejelefouAutre bémol : l'idée de départ était de changer uniquement les cellules selectionnées. Avec ton code tu changes toutes les valeurs <> 0 de la selection H:H25

                    d'ou l'utilisation de selection.value
                2. Modérateur
                  Et cette procédure tu veux l'appliquer à quel Range?
                  H10:H25?
                  J10:J25?
                  1. Salut pijaku

                    En toute logique ca doit etre en H.

                    a+
                3. Hmm, maintenant cela n'applique l'operation de calcul que sur la 1ere cellule selectionnée, meme si j'ai selectionne plusieures cellules
                  1. Modérateur
                    bah oui j'ai mis
                    ActiveCell
                    à remplacer par ce que tu avais tout au début :
                    Selection.Value = Selection.Value * Valeur
                4. Oui, jejelefou a dit qu'il travaillais aussi sous 2003, je pense que cela prouve qu'il y a une difference entre els versions.
                  1. Modérateur
                    Et bien tentons une approche différente :
                    Sub test()
                    Dim Valeur As Double
                    Valeur = Application.InputBox("Saisissez 0.5 par exemple", Type:=1)
                        If Valeur = 0 Then Exit Sub
                    ActiveCell = ActiveCell * Valeur
                    End Sub

                5. Modérateur
                  Je bosses sous 2003. Cela viens peut être de cela. Pas sur cependant...
                  1. Alors, ce que je vois dans le "About" c'est Microsoft Office Excel 2007 (12.0.6514.5000) SP2 MSO (12.0.6425.1000).
                    1. Euh, desole, mais pourrais tu m'expliquer la signification de ton ps?
                      Et je viens d'essayer avec la modification et cela ne marche toujours pas. Est-ce que j'aurais une version buggée de excel? Vu que cela semble marcher chez vous...
                      1. Modérateur
                        Essayons encore...
                        ceci peut être :
                        Selection.Value = CInt(Selection.Value) * CInt(reduc)


                        ps : quand tu places du code sur CCM mets le entre les balises <CODE> c'est le 4ème bouton de mise en forme au dessus du message (à côté de souligné)
                        • 1
                        • 2