XL 2016 Macro convertit cellule en texte

JhnnPhl

XLDnaute Nouveau
Bonjour à tous,

Je fais fasse à un problème lors d'un replacement via macro.

Lorsque que je récupère des données sur un tableau web, ces données (des montants en euros) sont indiquées par des valeurs tel que: 1,000.50 (se traduisant par 1 000,50 €)

Ainsi, lors mon "copier-coller" vers excel, les données sont conservées à l'identique. Cependant afin de les traiter correctement j'ai besoin de les convertir en valeur exploitable et d'utiliser une macro afin d'être plus efficace.

Voici mon code:
VB:
Sub Macro1()

    Selection.Replace ",", " "
    Selection.Replace ".", ","
    Selection.Style = "Currency"

End Sub

Je peux donc théoriquement sélectionner la plage de mon choix pour la convertir via la macro.
Cependant, lors de la conversation, la macro transforme les cellules en texte et je me retrouve avec une erreur :
1599213144343.png


Du coup, la macro n'est pas allée jusqu'au bout et ma cellule n'est pas au format 0,00 € (ou format monétaire).

Je serais aussi ouvert à ce qu'on me propose une macro pouvant convertir (selon la sélection de la plage de mon choix) une cellule au format 1,000.50 pour 1 000,50 €.

Merci de votre aide :)

Ps: j'ai également essayé "Selection.TextToColumns" mais la sélection n'est pas libre et mon tableau comportent plusieurs colonne à convertir.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Je ferais comme ça :
VB:
Sub Macro1()
   MettreEnCurrency Selection
   End Sub
Sub MettreEnCurrency(ByVal Rng As Range)
   Dim Cel As Range, X
   For Each Cel In Rng
      X = Cel.Value
      If VarType(X) = vbString Then Cel.Value = CCur(Val(Replace$(X, ",", "")))
      Next Cel
   End Sub
 

JhnnPhl

XLDnaute Nouveau
Re-bonjour,

Merci à vous trois de m'avoir aidé, je suis toujours fasciné par la réactivité de la communauté :)

Je n'ai essayé que la solution de soan qui fonctionne parfaitement!
sylvanu je n'ai pas essayé votre solution car j'étais contrains d'indiquer une cellule.
Dranreb merci également de votre aide!

Encore un gros merci!

à bientôt

PS: finalement la solution de soan m'envoie une erreur lorsqu'une cellule vide est sélectionné, la solution de Dranreb fonctionne même sur cellule vide.
 
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
Re,

Tu aurais dû préciser qu'il peut y avoir des cellules vides dans la sélection ! ;)

Le code VBA est donc :
VB:
Sub Macro1()
  Dim cel As Range: Application.ScreenUpdating = 0
  For Each cel In Selection
    If Not IsEmpty(cel) Then
      cel = Replace$(Replace$(cel, ",", ""), ".", ",") * 1
      cel.NumberFormat = "# ##0.00\ €"
    End If
  Next cel
End Sub
(il suffisait d'ajouter le test If)

soan
 

JhnnPhl

XLDnaute Nouveau
Re,

Tu aurais dû préciser qu'il peut y avoir des cellules vides dans la sélection ! ;)

Le code VBA est donc :
VB:
Sub Macro1()
  Dim cel As Range: Application.ScreenUpdating = 0
  For Each cel In Selection
    If Not IsEmpty(cel) Then
      cel = Replace$(Replace$(cel, ",", ""), ".", ",") * 1
      cel.NumberFormat = "# ##0.00\ €"
    End If
  Next cel
End Sub
(il suffisait d'ajouter le test If)

soan

Vous êtes au top! Merci :D
 

JhnnPhl

XLDnaute Nouveau
Du coup, vous m'avez motivé à aller plus dans ma réflexion :D

J'ai remarqué que les colonnes où je dois remplacer les données sont toujours les colonnes de I4 à O4 (I4:O4) mais que cependant la dernière ligne est toujours aléatoire. (de I3 à O3 il n'y a que des en-têtes ou des cellules vides)

Est-ce possible possible en VBA de demander de transformer (avec les conditions précédemment souhaités) toutes les cellules de la colonnes/cellule I4 à O4 jusqu'à la dernière ligne de cellule non-vide?

IJKL
4cellule à transformercellule à transformercellule à transformercellule à transformer
5cellule à transformercellule videcellule à transformercellule à transformer
6cellule à transformercellule à transformercellule videcellule à transformer
7cellule videcellule videcellule videcellule vide
(ici la transformation de format via VBA s'arrêterait d'elle-même à la ligne 6, dernière ligne de cellule non-vide)

Ainsi je n'aurais même plus besoin au préalable d'effectuer une sélection de cellules.

J'espère m'être bien exprimé.

Merci beaucoup :)
 

soan

XLDnaute Barbatruc
Inactif
Re,

Je te propose ce code (non testé) :
VB:
Sub Macro1()
  Dim nlm&, col%, dlg&, lig&
  nlm = Rows.Count: Application.ScreenUpdating = 0
  For col = 9 To 15 'colonnes I à O
    dlg = Cells(nlm, col).End(3).Row
    For lig = 4 To dlg
      With Cells(lig, col)
        If Not IsEmpty(.Value) Then
          .Value = Replace$(Replace$(.Value, ",", ""), ".", ",") * 1
          .NumberFormat = "# ##0.00\ €"
        End If
      End With
    Next lig
  Next col
End Sub
Perso, je me méfie un peu de Activesheet.UsedRange :
je ne suis pas toujours sûr qu'il détecte la bonne plage
de cellules, surtout s'il y a des cellules vides.

soan
 

soan

XLDnaute Barbatruc
Inactif
Re,

Lis d'abord mon post #12

J'ai testé la macro précédente sur le fichier ci-dessous ;
ça marche impeccable ; si tu as autre chose à demander,
ce serait mieux que tu joignes un fichier exemple avec
des données. ;)

fais Ctrl e ➯ travail effectué

soan
 

Pièces jointes

  • Exo JhnnPhl.xlsm
    14.1 KB · Affichages: 15

soan

XLDnaute Barbatruc
Inactif
Bonjour,

JhnnPhl m'a répondu ici :

https://www.excel-downloads.com/thr...iere-cellule-non-vide.20048791/#post-20359393
JhnnPhl à dit:
Comme vous l'aviez indiqué dans votre post #12, Activesheet.UsedRange engendrait une erreur dans certains
contextes. Votre code proposé est très efficace et je m'en sers maintenant quotidiennement! :) milles merci!

Je vous remercie une nouvelle fois pour la solution apportée qui est très efficace et, si je la comprends bien,
très ingénieuse!
Ce sujet est résolu ! :)

soan
 

Discussions similaires

Statistiques des forums

Discussions
312 095
Messages
2 085 250
Membres
102 837
dernier inscrit
CRETE