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 ?

01

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

67projet-3-1.xlsm (101.22 Ko)

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.

Rechercher des sujets similaires à "convertir zone texte nombre vba"