Arrondir toutes les valeurs numériques d'un fichier

Bonjour à tous,

Je dispose d'un fichier avec de nombreux feuillets, des formules, des tables de données, etc...

Je remarque que de nombreuses cellules contiennent des valeurs bien + complexes et lourdes à traiter qu'il n'y paraît.

Exemple : dans une cellule, je lis "22%", mais en fait, la valuer contenue dans la cellule est : "22,3688841957057%"

Je viens de supprimer les décimales d'une table contenant quelques dizaines de milliers de cellules dans ce cas, et la vitesse de recalcul du fichier s'en est trouvée nettement améliorée.

Or, des cellules dans ce cas, j'en ai des centaines de milliers voire des millions par-ci par-là dans mon fichier...

Donc je voudrais savoir s'il existe un moyen (une macro VBA? une option du fichier excel?) pour parcourir automatiquement tout le fichier et :

1. dès lors qu'une cellule contenant un pourcentage est trouvée, supprimer les nombres après la virgule du pourcentage.

Exemple : "22,3688841957057%" est remplacé par "22%"

2. dès lors qu'une cellule contenant un nombre est trouvée, supprimer les nombres après la 2ème décimale.

Exemple : "22,3688841957057" est remplacé par "22,36". Si la valeur n'a pas de décimale ou n'en a qu'une seule, ne pas en ajouter. Si la cellule a un format "texte", ne pas la modifier (dans certaines cellules, j'ai des expressions textes composées de chiffres comme "93" par exemple, précédées ou non de " ' " pour l'assimiler à du texte).

Evidemment, seules les cellules contenant des valeurs numériques sont concernées.

Si une cellule contient une formule, celle-ci doit rester inchangée (surtout ne pas remplacer la formule par son résultat arrondi). Idem s'il s'agit de texte (par exemple, dans certaines formules, j'ai des données contenant du texte et/ou des nombres séparés de plusieurs virgules du type : "ab, ac, ae, bd" ou "32,45,95" : ces cellules doivent rester inchangées.

Egalement, si une cellule contient une formule contenant des valeurs avec beaucoup de décimales : ne pas les modifier car il s'agit d'une formule donc elle doit être laissée intacte.

Voilà, si quelqu'un sait faire cela, ça m'intéresse grandement.

Si ça doit être 2 macros différentes, c'est pas un souci, évidemment.

Merci de votre aide

Nicole

Bonjour,

Je viens de supprimer les décimales d'une table contenant quelques dizaines de milliers de cellules dans ce cas, et la vitesse de recalcul du fichier s'en est trouvée nettement améliorée.

Tu es sûr que ce n'est pas une illusion ? Une fois qu'un classeur a été calculé son recalcul est plus rapide.

Quoiqu'il en soit :

Sub suppDec()
    Dim sh As Worksheet, pl As Range, c As Range
    For Each sh In Worksheets
        Set pl = sh.Cells.SpecialCells(xlCellTypeConstants, xlNumbers)
        If Not pl Is Nothing Then
            For Each c In pl
                c.Value = Round(c.Value, 2)
            Next c
        End If
    Next sh
End Sub

ton 1) et ton 2) sont équivalents puisque 22.123% = 0.221234

eric

PS : traite le fichier actif

Merci Eric pour ton aide,

Quand je lance la macro, ça ouvre un message d'erreur 1004 : "pas de cellules correspondantes".

Pourtant, j'ai bien des cellules comme cela dans mon fichier, et même dans le feuillet qui est ouvert.

Et quand j'ouvre le débogage, c'est cette ligne qui est en jaune :

Set pl = sh.Cells.SpecialCells(xlCellTypeConstants, xlNumbers)

Sais-tu de quoi il s'agit?

Nicole

PS : Malheureusement je ne peux pas partager mon fichier.

Ah oui, un fonctionnement que j'avais oublié.

Ca devrait aller mieux :

Sub suppDec()
    Dim sh As Worksheet, pl As Range, c As Range
    For Each sh In Worksheets
        On Error Resume Next
        Set pl = sh.Cells.SpecialCells(xlCellTypeConstants, xlNumbers)
        On Error GoTo 0
        If Not pl Is Nothing Then
            For Each c In pl
                c.Value = Round(c.Value, 2)
            Next c
            Set pl = Nothing
        End If
    Next sh
End Sub

Mais tu sais pour excel 2.12 ou 2.12345678901234 pas de différence.

Maintenant, j'ai :

Erreur d'éxécution '13':

Incompatibilité de type

Et la ligne en jaune est celle-ci :

c.Value = Round(c.Value, 2)

là c'est moins normal, ça ne devrait pas arriver.

Mais sans le fichier il faut que tu débogue toi même.

Affiche la fenetre Espions. Copie c (du code) et fait glisser dans cette fenetre.

Lit la valeur qui devrait être numérique.

Ajoute derrière pour obtenir c.address pour obtenir la cellule, et c.parent.name pour avoir la feuille.

Si tu ne trouve pas le pourquoi envoie ton fichier avec au moins cette cellule (supprime lignes et colonne entières pour alléger le fichier). Contrôle avant que tu as toujours l'erreur...

eriiic a écrit :

là c'est moins normal, ça ne devrait pas arriver.

Mais sans le fichier il faut que tu débogue toi même.

Affiche la fenetre Espions. Copie c (du code) et fait glisser dans cette fenetre.

Lit la valeur qui devrait être numérique.

Ajoute derrière pour obtenir c.address pour obtenir la cellule, et c.parent.name pour avoir la feuille.

Si tu ne trouve pas le pourquoi envoie ton fichier avec au moins cette cellule (supprime lignes et colonne entières pour alléger le fichier). Contrôle avant que tu as toujours l'erreur...

Alors là, ça se complique parce que je ne sais pas du tout de quoi tu parles?

Peux-tu m'indiquer ce que je dois faire à partir de l'affichage de la fenêtre Microsoft VB indiquant l'erreur d'éxécution stp?

eriiic a écrit :

Si tu ne trouve pas le pourquoi envoie ton fichier avec au moins cette cellule (supprime lignes et colonne entières pour alléger le fichier). Contrôle avant que tu as toujours l'erreur...

Le problème, c'est que je ne sais même pas quelle cellule pose problème.

dans VBE menu Affichage, cocher fenêtre Espion et fais ce que je t'ai écrit.

Si tu ne comprends pas ce que j'ai mis fait une recherche google avec déboguage excel, ou attend qq'un d'autre car là je vais m'occuper de plages, mais celles avec du sable, pas avec des cellules.

eriiic a écrit :

dans VBE menu Affichage, cocher fenêtre Espion et fais ce que je t'ai écrit.

Si tu ne comprends pas ce que j'ai mis fait une recherche google avec déboguage excel, ou attend qq'un d'autre car là je vais m'occuper de plages, mais celles avec du sable, pas avec des cellules.

ahhh noooo....

Ca t'embêterait de repousser tes vacances pour m'aider stp?

J'essaye de trouver un fichier ressemblant au mien pour éventuellement le poster ici.

Salut à tous,

Un petit récap du problème : mon besoin figure dans le post#1

Eric a mis au point la macro suivante :

Sub suppDec()
    Dim sh As Worksheet, pl As Range, c As Range
    For Each sh In Worksheets
        On Error Resume Next
        Set pl = sh.Cells.SpecialCells(xlCellTypeConstants, xlNumbers)
        On Error GoTo 0
        If Not pl Is Nothing Then
            For Each c In pl
                c.Value = Round(c.Value, 2)
            Next c
            Set pl = Nothing
        End If
    Next sh
End Sub

Cette macro semble fonctionner dans divers fichiers tests, mais ne fonctionne pas sur mon gros fichier (que malheureusement, je ne peux pas partager).

Le bug qui survient à l'usage de cette macro est le suivant : Erreur d'éxécution '13':

Incompatibilité de type

Et la ligne en jaune est celle-ci :

c.Value = Round(c.Value, 2)

Or, Eric est maintenant parti en vacances... et j'ai passé la journée à essayer de cerner le problème sans succès.

Quelqu'un connait-il une solution à ce bug?

Merci,

Nicole

Bonjour,

une idée en passant...

remplacer par :

If IsNumeric(c.Value) And Not IsEmpty(c.Value) Then c.Value = Round(c.Value, 2)

mais théoriquement il ne devrait y avoir que des numériques de sélectionnés.

Ca prendra un peu plus de temps c'est tout.

Et pour connaitre la cellule en erreur, comme tu ne sais pas déboguer :

Sub suppDec()
    Dim sh As Worksheet, pl As Range, c As Range
    For Each sh In Worksheets
        On Error Resume Next
        Set pl = sh.Cells.SpecialCells(xlCellTypeConstants, xlNumbers)
        On Error GoTo 0
        If Not pl Is Nothing Then
            For Each c In pl
                On Error GoTo fin
                c.Value = Round(c.Value, 2)
                On Error GoTo 0
            Next c
            Set pl = Nothing
        End If
    Next sh
    Exit Sub
fin:
    MsgBox "Feuille : " & c.Parent.Name & vbLf & c.Address & vbLf & "Valeur = " & c.Value
    Resume Next
End Sub

Si ça ne suffit pas je te conseille de démarrer un nouveau topic. Moins de personnes lisent un truc entamé.

Note sur un papier les erreurs, ou supprime le Resume Next qui relance le programme pour continuer le traitement

eric

Bonjour Eric!

Ca se passe bien les vacances?

eriiic a écrit :

Bonjour,

une idée en passant...

remplacer par :

If IsNumeric(c.Value) And Not IsEmpty(c.Value) Then c.Value = Round(c.Value, 2)

mais théoriquement il ne devrait y avoir que des numériques de sélectionnés.

Ca prendra un peu plus de temps c'est tout.

Donc là, ça fait 10mn que ça mouline. Avant, ça plantait au bout de quelques secondes.

Ce qui m'étonne, c'est que je ne vois rien bouger : ni les feuillets défiler, ni la cellule sélectionnée changer en haut à gauche.

Suspense...

nicopat a écrit :

Donc là, ça fait 10mn que ça mouline. Avant, ça plantait au bout de quelques secondes.

Ce qui m'étonne, c'est que je ne vois rien bouger : ni les feuillets défiler, ni la cellule sélectionnée changer en haut à gauche.

Suspense...

45mn, rien n'a bougé...

eriiic a écrit :

remplacer par :

If IsNumeric(c.Value) And Not IsEmpty(c.Value) Then c.Value = Round(c.Value, 2)

mais théoriquement il ne devrait y avoir que des numériques de sélectionnés.

Ca prendra un peu plus de temps c'est tout.

Je l'ai laissé tourné toute la nuit, mais ça a mouliné dans le vide.

Rien n'a bougé : ni les feuillets défiler, ni la cellule sélectionnée changer en haut à gauche.

Et excel ne répond pas.

Bonjour,

Cette ligne en remplacement ne fait que tester en plus si la cellule est bien numérique et non vide pour éviter cette erreur (qui ne devrait pas arriver...)

Comme tu as pu le constater ça fonctionne sur un exemple plus restreint.Maintenant tu parlais de millions de cellules, ça réclame du temps surtout que je travaille directement sur la feuille. Peut être faudrait il découper le travail par colonne pour éviter d'éventuels débordements (???)

Que tu ne vois aucun changement est normal, je n'active pas les feuilles et cellules étudiées, ça serait encore 100 fois plus lent...

Pour accélérer il faudrait travailler en mémoire mais là je suis sur tablette donc tout ça ne sera pas pour moi, désolé

Eric

Rechercher des sujets similaires à "arrondir toutes valeurs numeriques fichier"