Enregistrer le format d'une valeur textbox en monétaire

gbstyle

XLDnaute Impliqué
Bonjour, voila je souhaiterai lors de l'enregistrement sur mon tableau que le format nombre soit monétaire
ci joint mon bout de code
Private Sub BtnAenregistrer_Click()
Ref = Me.TxtARefArticles
With Sheets("Base_Articles")
Set trouvé = .Range("TblBaseArticles").Columns(1).Find(Ref, lookat:=xlWhole, LookIn:=xlValues)
If trouvé Is Nothing Then 'il s'agit d'un nouvelle articles
derlig = .Range("A" & .Rows.Count).End(xlUp).Row + 1 'on se positionne sur la dernière ligne
Else 'existe déjà
derlig = trouvé.Row
If MsgBox("Souhaitez vous modifier l'article ?", vbYesNo) = vbNo Then Exit Sub
End If

.Range("A" & derlig) = TxtARefArticles
.Range("B" & derlig) = CboAFamille
.Range("C" & derlig) = CboASousfamille
.Range("D" & derlig) = TxtADesignation
.Range("E" & derlig) = CboAFournisseur
.Range("F" & derlig) = TxtALongueurcolisage
.Range("G" & derlig) = TxtALargeurcolisage
.Range("H" & derlig) = TxtAHauteurcolisage
.Range("I" & derlig) = TxtACréele
.Range("J" & derlig) = TxtANotes
.Range("K" & derlig) = TxtADelaislivraison
.Range("L" & derlig) = TxtAFraistransport
.Range("M" & derlig) = TxtAFacturation
.Range("N" & derlig) = CboAModedegestion
.Range("O" & derlig) = TxtAminicommande
.Range("P" & derlig) = TxtAPrixUnitHT ' => données à afficher en format Euros lors de la saisie dans le text box et lors de l'enregistrement que sont format se mette en monétaire dans le tableau source
J'ai essaye un code avec .NumberFormat = "#,##0.00 $" mais je n'y arrive pas, il me manque une déclaration de variable je pense


End With

End Sub

D'avance merci
 

Dranreb

XLDnaute Barbatruc
J'avais dit que j'interviendrai pour positionner le fournisseur sur celui d'un article.
Alors je l'ai fait: j'ai écris une sub AppelF qui est appelée à la fin de la GarnirArticle
Un essai aussi de coloriage des Frame.
 

Pièces jointes

  • CBxLiéesGbstyle.xlsm
    484.8 KB · Affichages: 36

gbstyle

XLDnaute Impliqué
Pour les couleur c'est vraiment top merci, je viens de m'apercevoir que pour la mise à jour de la fiche fournisseur lors de la selection de n'importe quel article il faut systématiquement valider tout les combobox sur les proposition effectué. c'est pour cela que je n'avais pas la mise à jour de ma fiche

Par contre je ne sais pas par quel fait du hasar mais je n'ai plus les affichage dans la listbox fournisseur alors qu'il y a 5 mn lors de l'ouverture du fichier j'ai réussis à les voir apparaitre
 

Dranreb

XLDnaute Barbatruc
Je considère qu'absolument rien n'est encore écrit pour la mise à jour des bases.
Mais il y a encore du boulot en amont.
Prévoir quand même des Sub _Change pour les CL. car ni les _Résultat ni les _BingoUn ne sont exécutées si NbrLgn est passé à 0 dans une _Change. Or il faut quand même vider les contrôles si on n'est positionné sur rien d'existant. Il y a bien la _Défait qui peut jouer à cet effet en contrepartie si seule la _BingoUn est utilisée par ailleurs. Mais on est dans un cadre de circonstances variées et complexes, on aurait meilleur temps d'utiliser partout des _Change et des _Résultat.
Prévoir dans chaque Frame un bouton "Effacer". Hyper simple la procédure, une seule instruction, pour l'article: CLsA.Nettoyer
 

gbstyle

XLDnaute Impliqué
Je suis partis du principe que l'on avait besoin d'effacer que les infos déclarer comme lié si j'ai bien compris
'***********************************************************************************
'Procédure permettant de réinitialiser les champs du frame fournisseur
'***********************************************************************************
Private Sub BTnRazF_Click()
CLsF.Nettoyer

End Sub

Donc j'ai créer 2btn un dans le frame Fournisseur et l'autre dans le frame article
 

gbstyle

XLDnaute Impliqué
J'ai écris cette procédure : pour remplacer la listbox par une list views car après utilisation c'est nettement plus lisible je pense :

Mon soucis et que j'aimerais le meme résultat lors de la selection du fournisseur dans la listview et je n'arrive pas à faire le lien
:/
Code intégrer à l'userform_initialize
With LVw2
.Gridlines = True 'Afficher ou pas les lignes
.View = lvwReport 'style de rapport
.FullRowSelect = True 'Permet de selectionner une ligne dans la liste
'Création des en-tête personnalisées avec leur largeur
.ColumnHeaders.Add Text:="Réf Article", Width:=50
.ColumnHeaders.Add Text:="Désignation", Width:=50
.ColumnHeaders.Add Text:="Fournisseur", Width:=80
.ColumnHeaders.Add Text:="Stk Réservé", Width:=50
.ColumnHeaders.Add Text:="Stk Actuel", Width:=50
.ColumnHeaders.Add Text:="Stk Virtuel", Width:=50
.ColumnHeaders.Add Text:="Etat du stock", Width:=100
.ColumnHeaders.Add Text:="Total Stock HT", Width:=100

End With

Call Actualisation2
End Sub
****************************************
Private Sub Actualisation2()
'Déclaration des variables
Dim Item As ListItem
Dim Derniereligne As Integer
Dim I As Integer
Dim couleur As Variant

LVw2.ListItems.Clear 'On vide le contenu de la liste à chaque chargement
Derniereligne = Sheets("Base_Articles").Cells(Rows.Count, 1).End(xlUp).Row 'on cherche la dernière ligne du tableau

For I = 2 To Derniereligne
With Me.LVw2
With .ListItems
.Add , , Format(Sheets("Base_Articles").Cells(I, 1), "0000000")
End With
.ListItems(I - 1).ListSubItems.Add 1, , Sheets("Base_Articles").Cells(I, 4) 'Désignation
.ListItems(I - 1).ListSubItems.Add 2, , Sheets("Base_Articles").Cells(I, 5) 'Fournisseur
.ListItems(I - 1).ListSubItems.Add 3, , Sheets("Base_Articles").Cells(I, 22) 'Stock Réservé
.ListItems(I - 1).ListSubItems.Add 4, , Sheets("Base_Articles").Cells(I, 23) 'Stock Actuel
.ListItems(I - 1).ListSubItems.Add 5, , Sheets("Base_Articles").Cells(I, 25) 'Stock Virtuel
.ListItems(I - 1).ListSubItems.Add 6, , Sheets("Base_Articles").Cells(I, 24) 'Etat du stock
.ListItems(I - 1).ListSubItems.Add 7, , Sheets("Base_Articles").Cells(I, 26) 'Total stock
End With
Next I

End Sub
 

Dranreb

XLDnaute Barbatruc
Ça ne va peut être pas bien si le fournisseur à été rappelé par ma Sub AppelF.
Javais pensé à :
VB:
Private Sub CBnEffacerA()
Dim RemettreF As Boolean, NomFou As String
RemettreF = Not CLsA.Item(CBxFournisseur).Assumé
NomFou = CBxFournisseur.Text
CLsA.Nettoyer
If RemettreF Then CBxFournisseur.Text = NomFou
End Sub
Mais ce n'est pas une mauvaise idée en soit.
Ce serait alors juste un coup de CLsA.Stopper: CLsF.Réactiver: CLsF.Stopper: ClsA.Réactiver

Edit: Je répondais au message précédent, seulement.
Pour les valeurs dans les ListView, pas Sheets("Base_Articles").Cells(I, 4) mais TDon(LDon, 4)
On ne doit charger que les articles du fournisseur sélectionné. Et c'est trop long de prendre les cellules une par une. Ça se fait dans la CLsA_Résultat
Je ne sais pas si tu l'as en version ListBox :
VB:
Private Sub CLsA_Résultat(Lignes() As Long)
Dim TDon(), TLBx(), LDon As Long, LLBx As Long, C As Long
If UBound(Lignes) = 1 Then
   LCouA = Lignes(1)
   TVLA = CLsA.Lignes(LCouA).Range.Value
   GarnirArticle
Else
   TLA = Lignes
   TDon = CLsA.PlgTablo.Value
   ReDim TLBx(1 To UBound(TLA), 1 To 15)
   For LLBx = 1 To UBound(TLA)
      LDon = TLA(LLBx)
      For C = 1 To 15: TLBx(LLBx, C) = TDon(LDon, C): Next C, LLBx
   ListBox1.List = TLBx: End If
End Sub
 
Dernière édition:

gbstyle

XLDnaute Impliqué
en gros sur mon Bouton de Raz il faut que après avoir avoir fait
ClsA Nettoyer
Je rajoute ClsF réactiver c'est à peu prés ca ...
Sinon je ne sais pas si tu as regardé mon code de lvw j'aimerai avoir ton avis car pour l'instant j'ai bien évidement toute les infos article qui apparaisse au démarrage de l'userform
 

Dranreb

XLDnaute Barbatruc
J'ai mis un Edit pour ce problème poste précédent.
Il faut les 4 instructions que j'ai indiquées pour ne jamais laisser 2 CLs actifs en même temps.
Mais c'est peut être plus simple de faire comme je propose parce que ça ne gêne pas de remettre simplement le nom du fournisseur dans la CBx: ça ne va pas déclencher de recherche de fournisseur vu qu'on sait que le CLsF est stoppé. Par contre ça va déclencher une recherche d'articles. Pas grave…

Par ailleurs je suis un peu peiné que tu ne semble pas encore avoir compris que les plages de tableaux (toujours au bon nombre de lignes et de colonnes) sont exprès mises à disposition de la programmation de l'UserForm par les objets ComboBoxLiées. C'est leur propriété PlgTablo. C'est elle qu'il faut partout utiliser pour éviter tout risque d'erreur et non des expressions Sheets(…).Range ou .Cells.
En case de besoin, une expression Range telle qu'un PlgTablo de ComboBoxLiées est pourvu tout comme un objet Worksheet des méthodes Rows, Columns et Cells. Simplement elles sont relatives au début de la plage représentée par le Range au lieu d'être relatives au début de la feuille.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Tiens, je viens de me rappeler qu'un ComboBoxLiées est équipé d'une méthode Filtrer…
Elle n'a pas souvent été utilisée.
Elle pourrait être la solution de beaucoup de problèmes.
Elle permettrait en théorie que la CBxFournisseur ne soit gérée que par le CLsF, pour peu que celui ci veille à filtrer les autres sur leurs colonnes Fournisseur…
Du coup les CLs pourraient toujours tous être actifs en même temps.
 

gbstyle

XLDnaute Impliqué
Bonjour Dranreb, désolé de ne pouvoir répondre que tardivement ah les enfants :/
Alors voila ce que j'ai modifié :

1) Ajout des fonctions comme tu m'a évoqué ci dessus, je pense que tu as raison après un raz Article et un raz Founisseur j'ai le libre choix de recherche par le nom du fournisseur ca me parait vraiment bien

Private Sub BTnRazA_Click()
CLsA.Nettoyer
End Sub

Private Sub CBnEffacerA()
Dim RemettreF As Boolean, NomFou As String
RemettreF = Not CLsA.Item(CBxFournisseur).Assumé
NomFou = CBxFournisseur.Text
CLsA.Nettoyer
If RemettreF Then CBxFournisseur.Text = NomFou
End Sub
***********************************************************


2)Oui j'avais insérer un le code listbox, quand je t'ai mis le miens pour la listview c'était pour que tu puisse te rendre compte du visuel obtenu, car je n'ai pas besoin de toute les infos dans la listbox mais de 5 ou 6 infos

J'essaye depuis ce matin de redimentionner le nombre de collonne de la listbox
je pensais modifié ceci :
Private Sub CLsA_Résultat(Lignes() As Long)
Dim Tdon(), TLBx(), Ldon As Long, LLBx As Long, C As Long
If UBound(Lignes) = 1 Then
LCouA = Lignes(1)
TVLA = CLsA.Lignes(LCouA).Range.Value
GarnirArticle
Else
TLA = Lignes
Tdon = CLsA.PlgTablo.Value
ReDim TLBx(1 To UBound(TLA), 1 To 15) '15=>28 comme 28 colonne de plage du tableau
For LLBx = 1 To UBound(TLA)
Ldon = TLA(LLBx)
For C = 1 To 15: TLBx(LLBx, C) = Tdon(Ldon, C): Next C, LLBx '15=>28 comme 28 colonne de plage du tableau
ListBox1.List = TLBx: End If
End Sub

Ca ne fonctionne pas, c'était juste pour manipuler puisque mon souhait est dans le point 2 ou je souhaite que ma listbox ne fasse pas apparaitre toute les colonne ou alors que j'ai potentiellement le choix de l'ordre d'affichage des colonnes si je ne peux réduire.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Changer 15 par le nombre de colonnes voulu dans les Redim et dans la boucle.
Si les colonnes ne se suivent pas faire une série d'affectations au lieu d'une boucle.
Ou alors au lieu de TDon(LDon, C) prendre TDon(LDon, Choose(C, x, y, z …))
Changer dans la fenêtre de propriété la propriété ColumnCount.
Il y a aussi la propriété ColumnSize qui permet de spécifier les largeurs des colonnes.
 
Dernière édition:

Statistiques des forums

Discussions
312 677
Messages
2 090 821
Membres
104 677
dernier inscrit
soufiane12