Convertir zone texte en nombre (VBA vers excel)
Bonsoir,
Je suis désolée d'ouvrir un énième topic à ce sujet, mais je n'ai pas trouvé comment résoudre mon problème (que ce soit sur ce forum ou sur internet). Ou en tout cas, je n'ai pas réussi à le résoudre...
En fait, j'ai créé un formulaire via VBA qui ajoute des brebis sur un tableau Excel. L'information la plus importante est le numéro de la brebis, or sur VBA, je suis passée par une TextBox. Donc quand je valide mon formulaire, Excel m'affiche un message d'erreur "le nombre est au format texte". Je peux éventuellement corriger ce problème manuellement, mais ce n'est pas ce que je cherche. J'aimerais une formule VBA qui me permette de changer en format nombre les colonnes A, B, P et Q sachant que les premiers vrais nombres s'affichent en A3, B3 (A1 étant un titre et A2 une entête...).
Quelqu'un aurait-il une solution à mon problème ?
Voici mon fichier (en cours de création) : https://www.cjoint.com/c/ECgvglX6tdW
Bonsoir CleCle,
Tu peux essayer la fonction Val ?
feuille.Range("A3").Value = Val(.txtNumTravail)
Bonsoir,
Merci de votre réponse rapide.
Où dois-je insérer ce code ? J'ai essayé dans ce qui me semblait le plus logique mais ça me met une erreur de compilation...
Private Sub cmdValider_Click()
Dim feuille As Worksheet
Dim I As Long
Application.ScreenUpdating = False
Set feuille = Application.ActiveWorkbook.Sheets("Inventaire")
feuille.Range("A3").Value = Val(.txtNumTravail)
Sheets("Inventaire").Select
For I = 3 To 65536
If Cells(I, 1) = "" Then
Cells(I, 1).Select
Exit For
End If
Next I
'Rows("3:3").Select
'Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 'insère une nouvelle ligne
With frmDonnées
ActiveCell.Value = .txtNumTravail 'reporte les valeurs du formulaire dans l'inventaire des clients
ActiveCell.Offset(0, 1).Value = .txtNumOfficiel
ActiveCell.Offset(0, 2).Value = .txtNaissance1
ActiveCell.Offset(0, 3).Value = .txtSortie1
ActiveCell.Offset(0, 4).Value = .zlmCauseSortie
ActiveCell.Offset(0, 5).Value = .txtSortieAutre
ActiveCell.Offset(0, 6).Value = .zlmOrigine
ActiveCell.Offset(0, 7).Value = .txtOrigineAutre
ActiveCell.Offset(0, 8).Value = .zlmCouleur
ActiveCell.Offset(0, 9).Value = .txtCouleurAutre
ActiveCell.Offset(0, 10).Value = .zlmConfoMammaire
ActiveCell.Offset(0, 11).Value = .txtDéfautMammaire
ActiveCell.Offset(0, 12).Value = .zlmComportement
ActiveCell.Offset(0, 13).Value = .txtDéfautComportement
ActiveCell.Offset(0, 14).Value = .txtNumTravailMère
End With
With frmDonnées
.txtNumTravail = ""
.txtNumOfficiel = ""
.txtNaissance1 = ""
.txtSortie1 = ""
.zlmCauseSortie = ""
.txtSortieAutre = ""
.zlmOrigine = ""
.txtOrigineAutre = ""
.zlmCouleur = ""
.txtCouleurAutre = ""
.zlmConfoMammaire = ""
.txtDéfautMammaire = ""
.zlmComportement = ""
.txtDéfautComportement = ""
.txtNumTravailMère = ""
End With
Application.ScreenUpdating = True
End Sub
si j'ai bien compris le problème, c'est au moment de l'import des données depuis le userform vers l'onglet excel, j'ai corrigé cette ligne-ci surlignée en vert :
Private Sub cmdValider_Click()
Dim feuille As Worksheet
Set feuille = Application.ActiveWorkbook.Sheets("Inventaire")
Sheets("Inventaire").Select
Rows("3:3").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 'insère une nouvelle ligne
With frmDonnées
feuille.Range("A3").Value = Val(.txtNumTravail) 'report les valeurs du formulaire dans l'inventaire des clients
feuille.Range("B3").Value = .txtNumOfficiel
feuille.Range("C3").Value = .txtNaissance1
feuille.Range("E3").Value = .txtSortie1
feuille.Range("F3").Value = .zlmCauseSortie
......................
J'utilise plutôt le code que j'ai donné dans mon second post, qui me permet d'ajouter de nouvelles lignes par le bas, et non pas celui qui est dans le fichier que je vous ai donné, qui lui rajoute une nouvelle ligne par le haut et me gêne dans ma progression.
A partir de ce code, comment puis-je régler mon problème ?
Pareil, utilises la fonction Val
ActiveCell.Value = Val(.txtNumTravail)
au lieu de ActiveCell.Value = .txtNumTravail
Bonsoir,
Cela ne fonctionne pas : le numéro reste à gauche dans la cellule et un message d'erreur m'indique toujours la même chose...
Bonsoir,
En fait, je me suis rendu compte (il était temps...) que même si mon nombre est stocké sous forme de texte, il est toujours considéré comme un nombre : en effet, lorsque je prends une cellule de la colonne A, et que je fait une formule quelqu'un, elle fonctionne. L'idée serait alors de redonner son joli petit minois de nombre en le remettant du côté droit de la cellule (là où est sa place). J'ai donc tenté d'enregistrer une macro en modifiant une cellule de la colonne A et en l'alignant à droite, pour voir ce que me donnait le code macro.
Voici ce qui est ressorti :
Sub Droite()
'
' Droite Macro
'
'
Range("A16").Select
With Selection
.HorizontalAlignment = xlRight
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
End Sub
Sauriez-vous m'aider pour faire en sorte d'étendre ce code aux colonnes A, B, P et Q ? J'ai essayé plusieurs choses, et sans succès...
Bonjour,
Si ça doit être des nombres autant y mettre des nombres plutôt que d'essayer de cacher la poussière sous le tapis.
Tu as à ta disposition plusieurs fonctions de conversion :
val(), mais aussi clng() pour les entiers, cdbl() pour les réels doubles, etc.
Mais en premier lieu il me semble que tu as un problème avec la maj d'office du 09/12.
Tes boutons ne fonctionnent pas, et un est numéroté 21, c'est symptomatique.
Résous déjà ce pb et tu verras ce qui reste ne fonctionnant pas ensuite.
Supprimer fichiers *.exd du disque système. Dans une fenêtre cmd :
Del c:\*.EXD /s
Si besoin (et c'est souvent) désinstaller :
Mise à jour de sécurité pour Microsoft Office 2007 ( KB2596927 )
Mise à jour de sécurité pour Microsoft Office 2010 ( KB2553154 )
Mise à jour de sécurité pour Microsoft Office 2013 ( KB2726958 )
eric
Bonjour,
Ce sont bien des nombres puisque je peux faire tous les calculs que je veux... Il sont juste stockés à gauche "sous forme de texte".
J'ai essayé plusieurs de ces fonctions, mais cela ne fonctionne pas : soit j'ai un message d'erreur, soit il n'y a pas de message d'erreur, mais pas de résultat non plus.
Pour ce qui est de maj du 09/12, j'ai office 2013... Une maj en 2012 ?
Je ne vois pas comment procéder à ce petit nettoyage... Je ne touche pas trop à ce genre de choses, j'ai toujours peur de faire quelque chose que je ne devrais pas...
J'ai été choqué en lisant ton tableau (voir image) Que de vilaines choses !
Plus sérieusement je te renvoie ton fichier excel (j'ai réduit à une centaine des lignes tes 3 tableaux pour réduire la taille de ton fichier sinon il ne passait pas).
J'ai fais en sorte que ton userform renvoie dorénavant des données en nombre et non en texte. Est-ce bien ce que tu souhaitais, ou voulais tu quelques lignes de programme pour corriger les valeurs qui sont déjà en texte dans le fichier excel ?
Re !
Je peux me justifier : ce n'est pas moi qui ai rempli les lignes (ça paraît peu crédible, comme excuse, mais c'est vrai...
Je viens de me rendre compte que le fichier n'était plus du tout le bon. Je l'ai pas mal modifié entre temps, et notamment cette formule VBA (car elle me permettait d'ajouter une ligne par le haut, et non en partant du bas et en trouvant la première ligne vide comme je le souhaitais). Ma formule actuelle est la suivante :
Private Sub cmdValider_Click()
Dim feuille As Worksheet
Dim i As Long
Application.ScreenUpdating = False
Set feuille = Application.ActiveWorkbook.Sheets("Inventaire")
Sheets("Inventaire").Select
For i = 3 To 65536
If Cells(i, 1) = "" Then
Cells(i, 1).Select
Exit For
End If
Next i
'Rows("3:3").Select
'Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 'insère une nouvelle ligne
With frmDonnées
ActiveCell.Value = .txtNumTravail 'reporte les valeurs du formulaire dans l'inventaire des clients
ActiveCell.Offset(0, 1).Value = .txtNumOfficiel
ActiveCell.Offset(0, 2).Value = .txtNaissance1
'ActiveCell.Offset(0, 4).Value = .txtSortie1
'ActiveCell.Offset(0, 5).Value = .zlmCauseSortie
'ActiveCell.Offset(0, 6).Value = .txtSortieAutre
ActiveCell.Offset(0, 7).Value = .zlmOrigine
ActiveCell.Offset(0, 8).Value = .txtOrigineAutre
ActiveCell.Offset(0, 9).Value = .zlmCouleur
ActiveCell.Offset(0, 10).Value = .txtCouleurAutre
ActiveCell.Offset(0, 11).Value = .zlmConfoMammaire
ActiveCell.Offset(0, 12).Value = .txtDéfautMammaire
ActiveCell.Offset(0, 13).Value = .zlmComportement
ActiveCell.Offset(0, 14).Value = .txtDéfautComportement
ActiveCell.Offset(0, 15).Value = .txtNumTravailMère
End With
With frmDonnées
.txtNumTravail = ""
.txtNumOfficiel = ""
.txtNaissance1 = ""
.txtSortie1 = ""
.zlmCauseSortie = ""
.txtSortieAutre = ""
.zlmOrigine = ""
.txtOrigineAutre = ""
.zlmCouleur = ""
.txtCouleurAutre = ""
.zlmConfoMammaire = ""
.txtDéfautMammaire = ""
.zlmComportement = ""
.txtDéfautComportement = ""
.txtNumTravailMère = ""
End With
Application.ScreenUpdating = True
End Sub
Sachant que
'ActiveCell.Offset(0, 4).Value = .txtSortie1
'ActiveCell.Offset(0, 5).Value = .zlmCauseSortie
'ActiveCell.Offset(0, 6).Value = .txtSortieAutre
On une ' car je vais recréer un formulaire pour ceux là.
En fait, je souhaite en plus faire en sorte que le propriétaire puisse modifier la brebis (ajouter date, cause de sortie...) et faire en sorte que, lorsqu'il rentre une date de sortie, toute la ligne concernant la brebis (qui est morte, c'est très joyeux...) se grise et passe à la fin du tableau, sous les autres brebis qui sont encore vivantes. Je suppose qu'il doit y avoir une manière de faire avec VBA, j'ai fait quelques recherches non fructueuses.
Je travail sur ton fichier et je te renvoie une version ce soir
Attendez, mieux vaut alors que je poste le fichier le plus récent.
Je vous le mets de suite...
Edit : voici le fichier le plus récent :
Bah....
bon bah je recommence....
Un premier jet,
Je te demande juste à l'avenir de laisser disponible la dernière version de ton fichier, je pense que tu comprendras
Tu me dit ce que tu en penses ?
Evite les tableau pré-fabriqués par excel, ils ont beau être sympathiques avec leurs alternance de couleurs bleu/blanc ils sont extrêmement gourmands en terme de mémoire, j'ai du réduire tous ceux que tu avais, j'ai même dû supprimer celui qui figurait dans l'onglet Inventaire.
Bien cordialement
Bonjour,
J'ai regardé un petit peu le code et l'ai trouvé plutôt (très?) compliqué. J'ai essayé de faire un test.
Si je comprends bien (à partir de mes tentatives), vous avez rajouté l'option "modifier une brebis existante" qui me permet de rajouter des infos (par exemple si elle a été reformée) ET en plus, si cette brebis a été réformée, vous avez ajouté le code qui crise toute la ligne correspondante et l'ajoute sous toutes les autres brebis, c'est bien cela ?
Pourriez-vous m'expliquer avec le code en parallèle, comment avez-vous procédé (si ce n'est pas trop "chronophage" pour vous), afin que je comprenne bien sans laisser cela de façon bête et méchante ?
Merci en tout cas, pour le travail. Cela semble parfaitement convenir à mes espérances.
Bonjour,
J'ai rajouté qq bonus dans ton userform du genre, le bouton valider par défaut, donc dès que tu ouvres ton userform en faisant ENTREE au clavier tu valide sans avoir à le selectionner. Par défaut aussi, si tu fait ECHAP sur ton userform, tu active le bouton Fermer sans avoir à selectionner celui-ci.
Dans les grandes lignes
première partie du code:
test = Application.Match(Val(txtNumTravail.Value), Columns(1), 0)
test donne le numero de la ligne du num de travail dans ta base.
Si le num de travail est trouvé le programme te demande si tu veux faire une mise à jour. Alors il corrige toutes les données
Si le num n'est pas retrouvé il te propose de créer une nouvelle ligne
Ensuite tu as un Do While Loop
une boucle qui teste la couleur de chacunes des lignes depuis la 3e, si la ligne est grisée RGB(117,113,113)
alors il place la nouvelle brebis juste au-dessus afin que les lignes grisées soient toutes à la fin.
'Nouvelle ou déjà enregistrée ?
If IsError(test) = True Then
reponse = MsgBox("Le numéro de travail n'a pas été trouvé dans la base" & Chr(10) & "Souhaitez-vous la rajouter ?", 3)
l = 3
Do
If Cells(l, 1).Interior.Color = RGB(117, 113, 113) Then
Rows(l).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Exit Do
Else
l = l + 1
End If
Loop While IsEmpty(Cells(l, 1).Value) = False
Else
reponse = MsgBox("Le numéro de travail existe dans la base" & Chr(10) & "Souhaitez-vous faire une mise-à-jour ?", 3)
l = test
End If
Select Case reponse
Case 2, 7: Exit Sub
End Select
Dans cette partie du code les données numeric sont bien importées dans ce format grace à la commande Val()
.
'intégration des données
With frmDonnées
Cells(l, 1).Value = Val(.txtNumTravail) 'reporte les valeurs du formulaire dans l'inventaire des clients
Cells(l, 2).Value = Val(.txtNumOfficiel)
Partie du programme où la ligne qui vient d'être modifiée ou créée est testée afin de savoir si elle doit ou non être grisée.
Si la cellule en colonne 6 est renseignée alors la couleur grise est appliquée et la ligne est coupée/collée en fin de tableau.
Si la cellule en colonne 6 n'est pas renseignée le programme vérifie s'il y a des cellules au dessus qui son grisées afin de faire remonter la ligne dans le cas éventuel ou une mise à jour aurait retirée le mode de sortie. Une brebis qui finalement ne serait pas sortie etc.... la ligne redevient alors blanche par défaut .Interior.Color = xlNone
'test sortie
With Range(Cells(l, 1), Cells(l, 17))
If Cells(l, 6).Value <> "" Then
.Interior.Color = RGB(117, 113, 113)
l_fin = 3
Do While IsEmpty(Cells(l_fin, 1).Value) = False: l_fin = l_fin + 1: Loop
Rows(l).Cut Range("A" & l_fin)
Rows(l).Delete Shift:=xlUp
Else
If Cells(l - 1, 1).Interior.Color = RGB(117, 113, 113) Then
Rows(l).Cut
Do: l = l - 1: Loop While Cells(l - 1, 1).Interior.Color = RGB(117, 113, 113)
Rows(l).Insert Shift:=xlDown
End If
.Interior.Color = xlNone
End If
End With
Tu as le bouton RECHERCHE qui test le numero de travail et te permet de rappeler toutes les infos sinon s'il le num est inconnu une msgbox t'est renvoyée.
Sub recherche(num_travail&)
Dim l&, test As Variant
With Sheets("Inventaire")
test = Application.Match(num_travail, .Columns(1), 0)
If IsError(test) = True Then
MsgBox "Numero inconnu"
Else
l = test
frmDonnées.txtNumTravail = .Cells(l, 1).Value
frmDonnées.txtNumOfficiel = .Cells(l, 2).Value
frmDonnées.txtNaissance1 = .Cells(l, 3).Value
frmDonnées.txtSor
Difficile de tout expliquer
Re-bonjour,
J'ai regardé encore plus en détail, fait des essais. Le soucis, c'est que si on modifie une brebis, cela supprime l'ensemble des données qui étaient rentrées précédemment. Et si c'est une brebis rentrée il y a 5 ans... C'est peut-être compliqué de retrouver les données pour les retaper de nouveau... Peut-on faire quelque chose pour modifier cela ?
D'autre part, je me rends compte que ça complique tout de mettre la brebis grisée en dessous du tableau. Le fait de la griser est très intéressant. La mettre en dessous aussi, le problème c'est que le reste de mes feuilles ne suit pas...
Edit : je lis votre réponse, qui me semble plutôt bien détaillée !
Bonjour,
Je n'ai pas trouvé dans votre fichier Excel la partie
"Sub recherche(num_travail&)
Dim l&, test As Variant
With Sheets("Inventaire")
test = Application.Match(num_travail, .Columns(1), 0)
If IsError(test) = True Then
MsgBox "Numero inconnu"
Else
l = test
frmDonnées.txtNumTravail = .Cells(l, 1).Value
frmDonnées.txtNumOfficiel = .Cells(l, 2).Value
frmDonnées.txtNaissance1 = .Cells(l, 3).Value
frmDonnées.txtSor" (qui est d'ailleurs coupée dans votre message).
Cependant, cette fonctionnalité m'intéresse beaucoup et j'aimerais l'ajouter à mon fichier. En outre, lorsque je teste votre fichier et le bouton recherche, un message d'erreur apparaît : Erreur exécution "13" incompatibilité.
D'autre part, pourriez-vous m'aider à modifier le code précédent de façon à ce que les brebis "mortes" se grisent mais qu'elles n'aillent pas au fond du tableau comme c'est le cas avec le code actuel ?
Merci d'avance.