Conversion en nombre des valeurs textbox

bonoboas

XLDnaute Occasionnel
Bonjour

Je me permets de venir vous pour un problème de saisie, j'ai un formulaire avec des textbox qui viennent fournir une base de données (en texte et en nombre) dans la colonne B de la feuille n°1.
J'utilise ensuite la colonne B pour faire des calculs pour cela je dois convertir ces valeurs en "nombre". J'ai trouvé cette commande qui fonctionne, mais je dois avoir la feuille activé pour que cela fonctionne.

Columns(2).TextToColumns Destination:=Range("B1")



J'ai utilisé cela pour sélectionner la feuille n°1 :
Worksheets(1).Columns(2).TextToColumns Destination:=Range("B1")

Mais une fenêtre s'ouvre "Voulez vous remplacer les cellules de destination " deux choix : "Valider" ou "Annulé"
Si je fais annulé VBA s'excite : Erreur d'exécution 1004
"La méthode texttocolumns de la classe Range a échoué"

Pouvez-vous m'aider à transformer la colonne B de la feuille numéro 1 nommé "Programme"
Je souhaiterais sélectionner le numéro de la feuille et non par le nom si possible.

Merci à vous tous.
 

bonoboas

XLDnaute Occasionnel
Re : Conversion en nombre des valeurs textbox

Bonjour Danreb,

Pouvez-vous m'en dire un peu plus s'il vous plaît.

Voici ma boucle :
For i = 2 To 44

'Si un des TextBox est différent de rien alors
If UserForm1.Controls("TextBox" & i) <> Worksheets(1).Cells(i, "B") Then
Worksheets(1).Cells(i, "B") = UserForm1.Controls("textbox" & i)



For j = 22 To 33
UserForm1.Controls("TextBoxResult" & j).Value = Worksheets(1).Cells(j, "D")
'
Next j

Cordialement
 

Dranreb

XLDnaute Barbatruc
Re : Conversion en nombre des valeurs textbox

Faites le avec des tableaux: ce sera beaucoup plus rapide.
VB:
Dim Plg As Range, T(), L As Long, Z As String

Set Plg = Worksheets(1).[B2:B44]
T = Plg.Value
For L = 1 To 43
   Z = UserForm1.Controls("TextBox" & L + 1).Text
   If IsNumeric(Z) Then T(L, 1) = CDbl(Z) ' Else T(L, 1) = Empty ou on laisse l'ancienne valeur ?
   Next L
Plg.Value = T

T = Worksheets(1).[D22:D33].Value
For L = 22 To 33
   UserForm1.Controls("TextBoxResult" & L).Text = T(L - 21, 1)
   Next L
 

bonoboas

XLDnaute Occasionnel
Re : Conversion en nombre des valeurs textbox

Merci Dranreb pour votre réponse,
J'ai mis votre code dans un module de classe et les textbox ou j'ai du texte ne sont pas mis à jour en direct, par contre je l'ai mis à la suite de mon code et la ça marche très bien. Est ce qu'il y a une solution plus simple d'intégrer le IsNumeric dans ma boucle ?
Cordialement
 

Dranreb

XLDnaute Barbatruc
Re : Conversion en nombre des valeurs textbox

Joignez votre fichier (en xls de préférence pour ma version d'Excel) car là je ne sais plus de quoi vous me parlez.
Si vos TextBox font l'objets de modules de classe, vous pourriez les équiper d'une propriété Valeur qui se chargerait des conversions.
Une Public Property Get Valeur() et une Public Property Let Valeur(ByVal LaValeur)
 
Dernière édition:

bonoboas

XLDnaute Occasionnel
Re : Conversion en nombre des valeurs textbox

Bonjour Dranreb,

Je vous envoie le fichier, je vous ai mis des commentaires.
Si vous avez une meilleure idée je suis preneur, car je commence tout juste à organiser mes calculs.
Merci encore.
Cordialement
Anthony
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Conversion en nombre des valeurs textbox

Bonjour.
Moi j'écrirais le module de classe comme ça :
VB:
Option Explicit
Public WithEvents TBx As MSForms.TextBox
Private Sub TBx_Change()
UserForm1.Classe1_TBx_Change CLng(Mid$(TBx.Name, 8))
'Ecrire dans Userform1 : _
Public Sub Classe1_Tbx_Change(ByVal Num As Long)
End Sub
Private Sub TBx_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = Asc(".") Then KeyAscii = Asc(",")
End Sub
Public Property Let Valeur(ByVal LaValeur)
If VarType(LaValeur) = vbDouble Then TBx.Text = LaValeur Else TBx.Text = ""
End Property
Public Property Get Valeur()
If IsNumeric(TBx.Text) Then Valeur = CDbl(TBx.Text) Else Valeur = Empty
End Property
Au début de l'UserForm_Initialize :
VB:
Private Sub UserForm_Initialize()
Dim T(), L As Long
T = Worksheets(1).[B1:B44].Value
For L = 2 To 44
   Set TxtB(L).TxtB = UserForm1.Controls("TextBox" & L)
   TxtB(L).Valeur = T(L, 1)
   Next L
Et n'accédez plus nulle part ailleurs aux "TextBox" & N que par TxtB(N).Valeur
C'est d'ailleurs pour ça qu'il faut écrire une Public Sub Classe1_Tbx_Change, car TxtB n'est connu que dans l'UserForm.

S'ils doivent faire l'objet de calculs, ne mettez que des nombres dans la colonne B.

Edit: Sinon, et si vous êtes sûrs de ce que vous faites les Property doivent s'écrire comme ça :
VB:
Public Property Let Valeur(ByVal LaValeur)
TBx.Text = LaValeur
End Property
Public Property Get Valeur()
If IsNumeric(TBx.Text) Then
   Valeur = CDbl(TBx.Text)
ElseIf TBx.Text <> "" Then
   Valeur = TBx.Text
Else: Valeur = Empty: End If
End Property
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Conversion en nombre des valeurs textbox

Je ne l'ai pas gardé. Je ne sais pas à quoi ça sert. Faites les modifs que je vous indique c'est tout.
L'essentiel c'est de récupérer pour les cellules CDbl(TextBox.Text) pour les numériques, tout le reste est secondaire.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Conversion en nombre des valeurs textbox

Bonjour.
Je modifie le module de classe pour que l'affectation d'une valeur à un TxtB(N) ne provoque plus l'appel de la Public Sub Classe1_Tbx_Change à écrire dans UserForm1, et qui devra garnir des Label à partir de calculs effectué dans l'UserForm, ou bien, si vraiment pas possible, récupérés de la colonne D (inutile de mettre des textbox s'ils n'ont pas à être modifiés). Par ailleurs il peut être utile que celle ci reçoive directement la valeur (il n'est peut être pas indispensable de réécrire toutes les cellules de la B à chaque fois, mais juste la ligne Num qui change). Je la passe donc, cette valeur, en second paramètre.
VB:
Option Explicit
Public WithEvents TBx As MSForms.TextBox
Private ChgBloqué As Boolean
Private Sub TBx_Change()
If ChgBloqué Then Exit Sub
UserForm1.Classe1_Tbx_Change CLng(Mid$(TBx.Name, 8)), Me.Valeur
  'Ecrire dans Userform1 : _
Public Sub Classe1_Tbx_Change(ByVal Num As Long, ByVal Valeur)
End Sub
Private Sub TBx_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = Asc(".") Then KeyAscii = Asc(",")
End Sub
Public Property Let Valeur(ByVal LaValeur)
ChgBloqué = True
TBx.Text = LaValeur
ChgBloqué = False
End Property
Public Property Get Valeur()
If IsNumeric(TBx.Text) Then
   Valeur = CDbl(TBx.Text)
ElseIf TBx.Text <> "" Then
   Valeur = TBx.Text
Else: Valeur = Empty: End If
End Property
Remarque: il pourrait être utile d'écrire une Private Sub GarnirLabels pour ne pas écrire les instructions deux fois: dans la Sub Classe1_Tbx_Change, mais aussi dans la UserForm_Initialize. Comme ça il suffira d'y mettre GarnirLabels au lieu des instructions qui sont dedans.
 
Dernière édition:

bonoboas

XLDnaute Occasionnel
Re : Conversion en nombre des valeurs textbox

Bonjour Dranreb,

Est-ce que vous pouvez joindre votre fichier, car le code que vous m'avez écrit bug sur mon poste.
En fait lorsque je parle de rafraichissement de la colonne D, je veux parler du résultat de celui-ci s'affiche dans l'userform en modifiant les variables les textboxs jaune (colonne B). Les variables pourront être des noms, des dates (ça servira à faire des en-têtes) et des nombres pour faire les calculs en colonne D.
L'utilisateur verra ainsi l'impact de sa saisie. Autrement dit l'userform doit aller chercher les résultats en colonne D à chaque modification de variable des textboxs.

Je devrais avoir environ 100 variables et 50 résultats (avec des calculs intermédiaires que je mettrais sur le côté). Je pourrais en effet utiliser les textboxs et faire les calculs en VBA. Mais je trouve plus simple de les faire sur le tableur, et l'avantage c'est qu'on peut afficher les flèches et vérifier l'enchainement des calculs. Lorsque tout ceci sera terminé, la feuille de calcul sera cachée.

Merci de votre aide
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Conversion en nombre des valeurs textbox

Bonjour.

Je veux bien, mais peut être vaudrait-il mieux que vous joignez ce que vous avez fait, comme ça je pourrai vous expliquer pourquoi ça bogue si vous l'avez mal appliqué, ou rectifier si ça vient de moi.
 

Dranreb

XLDnaute Barbatruc
Re : Conversion en nombre des valeurs textbox

Ah oui, mais il manque plein de chose que je vous avais dit de faire !
Alors faites les, pour avoir une chance d'apprendre quelque chose, et regardez seulement après ma solution.
Remarque: j'ai préféré récupérer les noms entiers des contrôles des colonnes A et C, au cas où vous auriez un jour la bonne idée de les rendre mnémoniques.
 

Pièces jointes

  • ClasseTBxBonoboas.xls
    184.5 KB · Affichages: 78
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 275
Messages
2 086 707
Membres
103 377
dernier inscrit
fredy45