Mettre différents nombres dans un label avec séparateur de millier

Bonjour,

J'ai 3 labels dans mon USF (76, 77, 78) qui doivent prennent des valeurs numériques variables (1200,25 / 26697,88 / 325213,50 etc etc etc) qui sont inscrites dans une colonne de la feuille.

Actuellement la valeur est renvoyée sans format : ex : 10253,52

Je voudrais que le format soit avec séparateur de milliers : ex : 10 253,52 (et ce, quel que soit le nombre , à 3, 4, 5, 6, ou 7 chiffres)

Les nombres pour le label 76 sont dans la colonne S, pour le label 77 dans la colonne T, pour le label 78 dans la colonne U

Si besoin du fichier, dites le moi, je l'anonymiserai et le mettrai en ligne.

Merci d'avance !

Ci dessous le code dans lequel les nombres sont renvoyés dans les labels

'Pour la liste déroulante BC'
Private Sub ComboBox1_Change()
Application.ScreenUpdating = False
Dim I%, L%
With Worksheets("BC")
On Error GoTo SORTIE
    L = Application.Match(Me.ComboBox1, .Range("ED10:ED" & .Cells(.Rows.Count, 134).End(xlUp).Row), 0) + 9
    If Me.ComboBox1.ListIndex = -1 Then Exit Sub
    For I = 1 To 18
        Me.Controls("TextBox" & I) = .Cells(L, I + 115)
    Next I
    Me.Label46 = CStr(Application.Index(.Range("EE:EE"), L))
    Me.Label47 = CStr(Application.Index(.Range("EF:EF"), L))
    Me.Label52 = CStr(Application.Index(.Range("AA:AA"), L))
    Me.Label54 = CStr(Application.Index(.Range("I:I"), L))
    Me.Label56 = CStr(Application.Index(.Range("EG:EG"), L))
    Me.Label59 = CStr(Application.Index(.Range("C:C"), L))
    Me.Label61 = CStr(Application.Index(.Range("L:L"), L))
    Me.Label62 = CStr(Application.Index(.Range("BM:BM"), L))
    Me.Label76 = CStr(Application.Index(.Range("S:S"), L))
    Me.Label77 = CStr(Application.Index(.Range("T:T"), L))
    Me.Label78 = CStr(Application.Index(.Range("U:U"), L))

End With
Exit Sub
Application.ScreenUpdating = True
SORTIE: Exit Sub
End Sub

Salut Mona !

Peux-tu essayer cette ligne :

MonLabel = format(valeuraconvertir, "#,##0.00")

Cdlt,

Bonjour,

Pour avoir le format avec séparateur de milliers et forcer deux décimales : Me.Label1.Caption = Format(Round(Range("A1"), 2), "#,##0.00") à toi d'ajuster

Salut 3GB, j'ai essayé ton code mais cela ne fonctionne pas (debogage)

Salut GGautier, j'ai adapté ton code comme suit mais aucune réaction :

'Pour la liste déroulante BC'
Private Sub ComboBox1_Change()
Application.ScreenUpdating = False
Dim I%, L%
With Worksheets("BC")
On Error GoTo SORTIE
    L = Application.Match(Me.ComboBox1, .Range("ED10:ED" & .Cells(.Rows.Count, 134).End(xlUp).Row), 0) + 9
    If Me.ComboBox1.ListIndex = -1 Then Exit Sub
    For I = 1 To 18
        Me.Controls("TextBox" & I) = .Cells(L, I + 115)
    Next I
    Me.Label46 = CStr(Application.Index(.Range("EE:EE"), L))
    Me.Label47 = CStr(Application.Index(.Range("EF:EF"), L))
    Me.Label52 = CStr(Application.Index(.Range("AA:AA"), L))
    Me.Label54 = CStr(Application.Index(.Range("I:I"), L))
    Me.Label56 = CStr(Application.Index(.Range("EG:EG"), L))
    Me.Label59 = CStr(Application.Index(.Range("C:C"), L))
    Me.Label61 = CStr(Application.Index(.Range("L:L"), L))
    Me.Label62 = CStr(Application.Index(.Range("BM:BM"), L))
    Me.Label76 = CStr(Application.Index(.Range("S:S"), L))
    Me.Label77 = CStr(Application.Index(.Range("T:T"), L))
    Me.Label78 = CStr(Application.Index(.Range("U:U"), L))

Me.Label76.Caption = Format(Round(Range("S:S"), 2), "#,##0.00")
Me.Label76.Caption = Format(Round(Range("T:T"), 2), "#,##0.00")
Me.Label76.Caption = Format(Round(Range("U:U"), 2), "#,##0.00")

End With
Exit Sub
Application.ScreenUpdating = True
SORTIE: Exit Sub
End Sub

Les données dans tes cellules sont bien des valeurs numériques ?! dans le doute essaie Format(Round(Cdbl(Application.Index(.Range("S:S"), L)), 2), "#,##0.00")

Ci dessous le fichier pour te montrer que chez moi ça marche

7testformat.xlsm (21.73 Ko)

Pour une meilleur lisibilité je te conseil même de créer un variable, exemple :

Dim Val as Double

Val = Cdbl(Application.Index(.Range("S:S"),L))
Me.Label76.Caption=Format(Round(Val,2),"#,##0.00")

Une autre question tu cherches à obtenir quoi avec cette ligne ? L = Application.Match(Me.ComboBox1, .Range("ED10:ED" & .Cells(.Rows.Count, 134).End(xlUp).Row), 0) + 9

Oui en effet ça fonctionne impeccable chez toi. Mais pas sur mon fichier... Peut être du à la recherche en colonne et non attribué à une cellule...

Ci-joint le message que j'ai lorsque je colle ton nouveau code

photo 1

Bonjour GGautier,

Une autre question tu cherches à obtenir quoi avec cette ligne ? L = Application.Match(Me.ComboBox1, .Range("ED10:ED" & .Cells(.Rows.Count, 134).End(xlUp).Row), 0) + 9

Comme j'ai travaillé sur ce code j'apporte mon élément. L renvoie le numéro de la ligne correspondant a un BC stocké en string dans une combobox 1. J'ajoute 9 car la table ne commence qu'à la ligne 10.

Comme les recherches n'étaient initialement que par colonne entière je n'ai trouvé que cette parade pour trouver le numéro de ligne sur la feuille EXCEL et non sur la plage de travail ..

En espérant que tu comprennes mes explications.

Cdlt,

Bonjour Ergotamine,
Je me suis permis une adaptation à ma sauce pour essayer d'automatiser le plus possible Je ne sais même pas si ça marche vu que je n'ai pas de fichier...

Monadesign_83, tu dois préciser le Label auquel tu veux appliquer la valeur, par exemple : Me.Label76.Caption=Format(Round(Cdbl(Application.Index(.Range("S:S"), L)), 2), "#,##0.00")

Private Sub ComboBox1_Change()
Dim Ws As Worksheet
Dim PremLig As Long, DernLig As Long, i As Long, Lig As Long
Dim Col As String, SearchValue As String
Dim Plage() As Variant, ListLabel() As Variant, ListCol() As Variant, ListTxt() As Variant
Dim ValueFind As Boolean

    On Error GoTo GestionError
    '//Paramètrage des valeurs////////////////////////////////////////////////////////////////////////
    Set Ws = ThisWorkbook.Worksheets("BC") 'La feuille sur laquellle tu veux travailler
    Col = "ED" 'Colonne où effectuer les recherches
    PremLig = 10 'Effectuer la recherche à partir de cette ligne
    ListLabel = Array(46, 47, 52, 54, 56, 59, 61, 62, 76, 77, 78) 'Liste des Label du Userform à remplir
    ListCol = Array("EE", "EF", "AA", "I", "EG", "C", "L", "BM", "S", "T", "U") 'List des colonnes où récupérer les données pour remplir les Label correspondants
    ListTxt = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18) 'Liste des textBox à remplir
    '/////////////////////////////////////////////////////////////////////////////////////////////////

    '//A partir d'ici tout est automatique////////////////////////////////////////////////////////////
    If UBound(ListLabel) <> UBound(ListCol) Then MsgBox "Le nombre de colonne et de Label configurés ne correspondent pas", vbCritical: Exit Sub
    DernLig = Ws.Range(Col & Ws.Rows.Count).End(xlUp).Row
    If DernLig < PremLig Then Exit Sub 'Cas si colonne vide
    Plage = Ws.Range(Col & PremLig & ":" & Col & DernLig).Value
    SearchValue = Me.ComboBox1
    ValueFind = False
    For i = LBound(Plage) To UBound(Plage)
        If Plage(i, 1) = SearchValue Then ValueFind = True: Lig = i + PremLig - 1: Exit For
    Next i
    If ValueFind = False Then MsgBox "Pas de valeur correspondante", vbCritical: Exit Sub
    For i = LBound(ListTxt) To UBound(ListTxt)
        Me.Controls("TextBox" & ListTxt(i)) = Ws.Cells(Lig, i + 116)
    Next i
    For i = LBound(ListCol) To UBound(ListCol)
        Me.Controls("Label" & ListLabel(i)).Caption = Ws.Range(ListCol(i) & Lig)
    Next i
    '/////////////////////////////////////////////////////////////////////////////////////////////////
    Set Ws = Nothing
GestionError: MsgBox "Une erreure critique est survenue.", vbCritical
End Sub

Bonjour GGautier,

Pas de soucis, je me suis penché vraiment que sur la base mais pas sur les effets de bords. Toute la partie Caption je ne m'en suis pas occupé.

Si tu veux un fichier qui me semble représentatif tu en trouveras ein ici. Pas sûr que ce soit la dernière version mais c'est un fichier que j'avais nettoyé pour le rendre utilisable et avoir a peut près la structure : https://forum.excel-pratique.com/excel/bug-avec-les-options-de-protection-d-une-feuille-excel-157654...

En espérant que ça te serve a y voir plus clair.

Cdlt,

Ergotamine, GGautier,

Merci beaucoup à tous les deux, vraiment.

Le code : Me.Label76.Caption=Format(Round(Cdbl(Application.Index(.Range("S:S"), L)), 2), "#,##0.00")

fonctionne très bien !

Je n'ai pas testé ton nouveau long code... pourquoi autant de modif?

Je dois partir maintenant, j'anonymise le fichier (à jour depuis) demain et te l'envoie. tu me diras ce que tu en penses.

Bonne soirée à vous deux

Mon code semble bien fonctionner, le problème c'est que la dernière version que j'ai récupéré (merci Ergotamine) il manque des Label ce qui fait planter le code (étant donné que je me suis basé sur les screen). Monadesign_83 pourrais-tu partager ici la dernière version de ton fichier ainsi que la liste des Label que tu souhaite avoir avec le format "nombre avec séparateur de millier" stp ?

EDIT : Monadesign_83, je n'avais pas vu ton message. J'ai fait toutes ces modifications car nous avons tous notre manière de coder, sans fichier j'ai du réinterpréter le code à ma manière.... Et puis je trouvais ça plus simple de passer par des listes de label/textbox à configurer et que le reste du code fasse tout tout seul comme un grand que de devoir se "taper" une ligne de code par Controls. Enfin bref chacun sa façon de faire

Si ma solution précédente fonction alors c'est parfait. Tu peux aussi essayer de comprendre mon code pour en apprendre d'avantage sur la programmation VBA

si tu veux tester mon code pense bien avant de modifier les listes ListLabel, ListCol et ListTxt. Attention dans ma version les formats ne sont pas pris en charges car je ne sais pas sur quels label l'appliquer.

Bonjour,

Je suis d'accord avec GGautier. Lorsque l'on code en VBA il faut également penser à la maintenabilité et le dynamisme du code sur le long terme. Travailler avec des boucles, des tableaux sous formes d'array, des variables, des références sont des outils d'aides à atteindre ces objectifs. Même si ça paraît plus "dur" du fait d'une non simple recopie d'une ligne après l'autre, ça facilite grandement la compréhension lorsqu'on travaille avec ces outils régulièrement, permet d'alléger visuellement le code et d’accélérer son exécution (a bas les Select, activate, etc ...) pour le grand bonheur de son utilisateur.

Après les méthodes (Find VS Match), les dénominations etc ... C'est un peu chacun sa sauce.

Cdlt,

Bonjour GGautier et Ergotamine,

Oui, je suis en cours d'apprentissage en autodidacte, pas facile 20 ans après la fin des études

Voici le fichier dernière version qui est fonctionnel pour tout, sauf "ouverture dossier" objet d'un autre sujet.

En effet Ergotamine, la grande difficulté c'est d'arriver à comprendre les codes et leurs impacts sur d'autres mécanismes.

Ci-joint le fichier :

5fichier-test.zip (1.40 Mo)

Attention au multiposte https://forum.excel-pratique.com/excel/ouvrir-1-pdf-depuis-un-bouton-du-usf-lie-a-un-lien-hypertexte...

De plus Monadesign_83, je t'invite à mettre en favori de ton moteur de recherche ce site, vraiment pour apprendre, tester, bidouiller c'est parfait. J'apprend aussi à coder en VBA en autodidacte depuis maintenant 2 ans et le site à été la base de mon apprentissage. Tu veras c'est vraiment complet et avec des fichiers Excel pour pour avoir de vrai exemples concrets te concernant, regarde tout particulièrement les parties "Formulaire" et "Tableau VBA(array)" !

image
Bien pris pour le multiposte... Mais à l'origine je voulais distinguer la problématique par le titre. (qui j'espère servira à d'autres)

Effectivement je n'avais pas naviguer jusque là... Je vais donc le faire !!! ET sinon le site est déjà dans mes favoris

Encore merci à vous deux, et si vous venez dans le sud (var) je serais ravi de vous offrir un coup à boire ! (MP)

C'est ce qui s'appel une proposition alléchante Mais malheureusement 9h de route pour une bière c'est compliqué

Rechercher des sujets similaires à "mettre differents nombres label separateur millier"