Problème dans Formulaire VBA qui efface formules dans mon classeur Excel

Bonjour et merci de votre aide par avance,
J'ai créé un formulaire pour rechercher, modifier ou créer dans une base de données. J'arrive à rapatrier mes données mais lorsque je créé ou lorsque je modifie grâce à un bouton de commande, la sauvegarde se fait dans ma base de données mais efface la formule de ma cellule. Résultat les valeurs remontées par la suite par mon formulaire sont erronées car la formule =SI(CL259>0;NBVAL(CP259;CZ259;DJ259;DT259;ED259;EN259);"0") se transforme en chiffre 1,2,3,4,5 et 6 en valeurs numériques.
Comment peut on faire pour empêcher l'écriture de ma textBox qui rapatrie la donnée de la cellule dans ma base de données ? Ou comment peut on inscrire dans une textBox en code vba cette formule ?

Ci joint mon code entier (je sais c'est un peu le bordel mais je débute ...)
Merci de l'attention que vous porterez à mon problème et surtout m'aider à le résoudre....
21fichier-test.xlsm (138.51 Ko)

Bonsoir,

si votre valeur d'un ComboBox ou TextBox ou d'autre chose vient remplir une cellule de votre feuille source, c'est tout simplement qu'il y a une ligne de code qui dit que cette cellule est égale à la valeur de la ComboBox.

Si votre USF récupère une donnée de le cellule C13 par exemple, et que cette donnée est le résultat d'une formule se trouvant en C13, alors la texte box ne contient que le résultat de cette formule. Lors de l'enregistrement si vous avez une ligne du style Range("C13").Value = ComboBox1.Value, alors c'est bien la valeur du ComboBox qui est copiée dans la cellule et non pas la formule "d'origine" ! Il suffit donc de supprimer cette ligne de code du code VBA, la formule restera donc en place en cellule C13 et elle fera ce qu'elle doit faire pour afficher la valeur voulue.

@ bientôt

LouReeD

Merci de votre réponse,

Le Hic c'est que je n'arrive pas à isoler la textbox qui renvoie la donnée...

Voila mes codes qui modifie ou valide un contact ...

Private Sub CommandButton1_Click()
Dim L As Integer
Dim CTRL As Control

If MsgBox("Confirmez-vous l’insertion de ce nouveau contact ?", vbYesNo, "Demande de confirmation d’ajout") = vbYes Then
L = WS.Cells(Application.Rows.Count, 1).End(xlUp).Row + 1
For Each CTRL In Me.Controls
If CTRL.Tag <> "" Then WS.Cells(L, CByte(CTRL.Tag)).Value = CTRL.Value
If TypeOf CTRL Is MSForms.CheckBox Then WS.Cells(L, CByte(CTRL.Tag)).Value = IIf(CTRL.Value = True, "X", "")
Next CTRL
End If
Unload Me
'UserForm1 Show
End Sub

Private Sub CommandButton2_Click()
Dim Ligne As Long
Dim I As Integer

If MsgBox("Confirmez-vous la modification de ce contact ?", vbYesNo, "Demande de confirmation de modification") = vbYes Then
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox1.ListIndex + 2
WS.Cells(Ligne, "B") = ComboBox2
WS.Cells(Ligne, "N") = ComboBox3
WS.Cells(Ligne, "J") = ComboBox4
WS.Cells(Ligne, "O") = ComboBox5
WS.Cells(Ligne, "P") = ComboBox6
WS.Cells(Ligne, "W") = ComboBox7
WS.Cells(Ligne, "X") = ComboBox8
WS.Cells(Ligne, "AB") = ComboBox9
WS.Cells(Ligne, "AG") = ComboBox10
WS.Cells(Ligne, "AL") = ComboBox11
WS.Cells(Ligne, "AQ") = ComboBox12
WS.Cells(Ligne, "AV") = ComboBox13
WS.Cells(Ligne, "BA") = ComboBox14
WS.Cells(Ligne, "BE") = ComboBox15
WS.Cells(Ligne, "BF") = ComboBox16
WS.Cells(Ligne, "BG") = ComboBox17
WS.Cells(Ligne, "BI") = ComboBox18
WS.Cells(Ligne, "BJ") = ComboBox19
WS.Cells(Ligne, "BK") = ComboBox20
WS.Cells(Ligne, "BM") = ComboBox21
WS.Cells(Ligne, "BN") = ComboBox22
WS.Cells(Ligne, "BO") = ComboBox23
WS.Cells(Ligne, "CL") = ComboBox24
WS.Cells(Ligne, "BW") = ComboBox25
WS.Cells(Ligne, "BX") = ComboBox26
WS.Cells(Ligne, "CC") = ComboBox27
WS.Cells(Ligne, "CD") = ComboBox28
WS.Cells(Ligne, "CE") = ComboBox29
WS.Cells(Ligne, "CU") = ComboBox30
WS.Cells(Ligne, "CX") = ComboBox31
WS.Cells(Ligne, "DE") = ComboBox32
WS.Cells(Ligne, "DH") = ComboBox33
WS.Cells(Ligne, "DO") = ComboBox34
WS.Cells(Ligne, "DR") = ComboBox35
WS.Cells(Ligne, "DY") = ComboBox36
WS.Cells(Ligne, "EB") = ComboBox37
WS.Cells(Ligne, "EI") = ComboBox38
WS.Cells(Ligne, "EL") = ComboBox39
WS.Cells(Ligne, "ES") = ComboBox40
WS.Cells(Ligne, "EV") = ComboBox41
For Each CTRL In Me.Controls
If CTRL.Tag <> "" Then WS.Cells(Ligne, CByte(CTRL.Tag)).Value = CTRL.Value
If TypeOf CTRL Is MSForms.CheckBox Then WS.Cells(Ligne, CByte(CTRL.Tag)).Value = IIf(CTRL.Value = True, "X", "")
Next CTRL
End If

End Sub

Private Sub CommandButton3_Click()
Unload Me
End Sub

Comment puis je définir un code dedans qui exclu l'enregistrement de cette textbox46 ?

Dans quelle colonne se trouve vos formule sur la feuille Excel ? Si c'est la colonne "AB" alors c'est la ligne : WS.Cells(Ligne, "AB") = ComboBox9 qu'il faut neutraliser en mettant un apostrophe en début de ligne afin de la transformer en commentaire.

@ bientôt

LouReeD

Le problème c'est que c'est une TextBox qui affiche ma colonne "CM" qui contient une formule dans chaque ligne ("CM2" "CM3" .....). Dans mon code pour modifier ou entrer un contact, je ne vois pas ou je peux exclure la validation de données.

Casse tête depuis 2 jours pour trouver un moyen de contourner ce problème ....

Vous pouvez le voir dans mon tableau.

Colonne CM=91ième colonne en numérique, du coup dans votre code d'enregistrement vous neutralisez l'enregistrement si la colonne est égale à 91 :

Private Sub CommandButton1_Click()
Dim L As Integer
Dim CTRL As Control

If MsgBox("Confirmez-vous l’insertion de ce nouveau contact ?", vbYesNo, "Demande de confirmation d’ajout") = vbYes Then
        L = WS.Cells(Application.Rows.Count, 1).End(xlUp).Row + 1
    For Each CTRL In Me.Controls
        If CTRL.Tag <> "" and CByte(CTRL.Tag)<>91 Then WS.Cells(L, CByte(CTRL.Tag)).Value = CTRL.Value
        If TypeOf CTRL Is MSForms.CheckBox Then WS.Cells(L, CByte(CTRL.Tag)).Value = IIf(CTRL.Value = True, "X", "")
    Next CTRL
End If
Unload Me
'UserForm1 Show
End Sub

Voyez la neutralisation de la colonne 91 par CByte(CTRL.Tag)<>91, donc on modifie toutes les colonnes tant que leur numéro n'est pas égale à 91.

@ bientôt

LouReeD

Je ne vous cache pas que votre code est un peu "barbare" !

@ bientôt

LouReeD

Bon bah ... Incompatibilité de type lors de la modification sur la ligne If CTRL.Tag <> "" And CByte(CTRL.Tag) <> 91 Then

Mais peut on mettre If CTRL. Tag ..... et And CByte(CTRL.Tag) <> 91 pour à la fin valider le tout avec .....= CTRL.Value ??

Dans ce que je comprends, on demande de valider tous les contrôles et en plus contrôle tag 91 ... Je me trompe peut être du haut de mon petit niveau en vba

Bonjour ismagapi, LouReed et le forum,

Pourquoi garder les formules sur la feuille on peut faire les calculs sur l'userform et transfert tout sur la feuille,

Ma contribution

bonne continuation Ferdinand

19fichier-test.xlsm (115.00 Ko)

Bonjour Ferdinand, LouReed et le forum,
Merci de vous attarder sur mon formulaire, et de m'aider,
Ferdinand, ton idée de faire les calculs dans VBA au lieu d'Excel est très intéressante et tu as répondu en partie à ma difficulté pour automatiser les calculs dans le formulaire.
Merci à toi...
Il me reste un calcul à réaliser dans Private Sub TextBox46_Change()
C'est la formule qui permet de vérifier:

SI
il y a du texte dans (TextBox112) alors la valeur de TextBox46 = 6
SI il y a du texte dans (TextBox104) alors la valeur de TextBox46 = 5
SI il y a du texte dans (TextBox96) alors la valeur de TextBox46 = 4
SI il y a du texte dans (TextBox88) alors la valeur de TextBox46 = 3
SI il y a du texte dans (TextBox80) alors la valeur de TextBox46 = 2
SI il y a du texte dans (TextBox72) alors la valeur de TextBox46 = 1
SI il n'y a PAS de texte dans (TextBox72) (TextBox80) (TextBox88) (TextBox96) (TextBox104) (TextBox112) alors la valeur de TextBox46 = 0

Et en fonction du chiffre cela affiche ou non les Onglets Accueil 1 , Accueil 2 , Accueil 3 , Accueil 4 , Accueil 5 , Accueil 6 que j'ai déjà presque défini dans la procédure.
Comme cela lors de la modification par les CommandButton 9,8,7,6,5,4 les Onglets s'affichent ou pas.

Merci de l'attention que vous porterez à mes difficultés. Vos réponses telles qu'elles soient renforce mon apprentissage du Code VBA.

'Calculs dans Onglet Agrément / Places Libres
Private Sub ComboBox24_Change()
Me.TextBox47 = Val(ComboBox24.Value) - Val(TextBox46.Value)
End Sub

Private Sub TextBox47_Change()
If TextBox47.Value < 0 Then
TextBox47.BackColor = &HFF&
Else
TextBox47.BackColor = &HFF00&
End If
End Sub

'Affichage ONGLETS
Private Sub TextBox46_Change()

' Calcul ??????

If TextBox46.Value = "6" Then
UserForm1.MultiPage1.Page5.Visible = True
UserForm1.MultiPage1.Page6.Visible = True
UserForm1.MultiPage1.Page7.Visible = True
UserForm1.MultiPage1.Page8.Visible = True
UserForm1.MultiPage1.Page9.Visible = True
UserForm1.MultiPage1.Page10.Visible = True
Else
If TextBox46.Value = "5" Then
UserForm1.MultiPage1.Page5.Visible = True
UserForm1.MultiPage1.Page6.Visible = True
UserForm1.MultiPage1.Page7.Visible = True
UserForm1.MultiPage1.Page8.Visible = True
UserForm1.MultiPage1.Page9.Visible = True
UserForm1.MultiPage1.Page10.Visible = False
Else
If TextBox46.Value = "4" Then
UserForm1.MultiPage1.Page5.Visible = True
UserForm1.MultiPage1.Page6.Visible = True
UserForm1.MultiPage1.Page7.Visible = True
UserForm1.MultiPage1.Page8.Visible = True
UserForm1.MultiPage1.Page9.Visible = False
UserForm1.MultiPage1.Page10.Visible = False
Else
If TextBox46.Value = "3" Then
UserForm1.MultiPage1.Page5.Visible = True
UserForm1.MultiPage1.Page6.Visible = True
UserForm1.MultiPage1.Page7.Visible = True
UserForm1.MultiPage1.Page8.Visible = False
UserForm1.MultiPage1.Page9.Visible = False
UserForm1.MultiPage1.Page10.Visible = False
Else
If TextBox46.Value = "2" Then
UserForm1.MultiPage1.Page5.Visible = True
UserForm1.MultiPage1.Page6.Visible = True
UserForm1.MultiPage1.Page7.Visible = False
UserForm1.MultiPage1.Page8.Visible = False
UserForm1.MultiPage1.Page9.Visible = False
UserForm1.MultiPage1.Page10.Visible = False
Else
If TextBox46.Value = "1" Then
UserForm1.MultiPage1.Page5.Visible = True
UserForm1.MultiPage1.Page6.Visible = False
UserForm1.MultiPage1.Page7.Visible = False
UserForm1.MultiPage1.Page8.Visible = False
UserForm1.MultiPage1.Page9.Visible = False
UserForm1.MultiPage1.Page10.Visible = False
Else
If TextBox46.Value = "0" Then
UserForm1.MultiPage1.Page5.Visible = True
UserForm1.MultiPage1.Page6.Visible = False
UserForm1.MultiPage1.Page7.Visible = False
UserForm1.MultiPage1.Page8.Visible = False
UserForm1.MultiPage1.Page9.Visible = False
UserForm1.MultiPage1.Page10.Visible = False
End If
End If
End If
End If
End If
End If
End If
End Sub

11fichier-test.xlsm (123.70 Ko)

Pardon, il faut lire pour la formule demandée:

SI il y a du texte dans (TextBox112) et du texte dans (TextBox104) et du texte dans (TextBox96) et du texte dans (TextBox88) et du texte dans (TextBox80) et du texte dans (TextBox72) alors la valeur de TextBox46 = 6

SI il y a PAS du texte dans (TextBox112) et du texte dans (TextBox104) et du texte dans (TextBox96) et du texte dans (TextBox88) et du texte dans (TextBox80) et du texte dans (TextBox72) alors la valeur de TextBox46 = 5

SI il y a PAS du texte dans (TextBox112) et PAS du texte dans (TextBox104) et du texte dans (TextBox96) et du texte dans (TextBox88) et du texte dans (TextBox80) et du texte dans (TextBox72) alors la valeur de TextBox46 = 4

SI il y a PAS du texte dans (TextBox112) et PAS du texte dans (TextBox104) et PAS du texte dans (TextBox96) et du texte dans (TextBox88) et du texte dans (TextBox80) et du texte dans (TextBox72) alors la valeur de TextBox46 = 3

SI il y a PAS du texte dans (TextBox112) et PAS du texte dans (TextBox104) et PAS du texte dans (TextBox96) et PAS du texte dans (TextBox88) et du texte dans (TextBox80) et du texte dans (TextBox72) alors la valeur de TextBox46 = 2

SI il y a PAS du texte dans (TextBox112) et PAS du texte dans (TextBox104) et PAS du texte dans (TextBox96) et PAS du texte dans (TextBox88) et PAS du texte dans (TextBox80) et du texte dans (TextBox72) alors la valeur de TextBox46 = 1

SI il y a PAS du texte dans (TextBox112) et PAS du texte dans (TextBox104) et PAS du texte dans (TextBox96) et PAS du texte dans (TextBox88) et PAS du texte dans (TextBox80) et PAS du texte dans (TextBox72) alors la valeur de TextBox46 = 0

Merci ,

Cordialement

Rechercher des sujets similaires à "probleme formulaire vba qui efface formules mon classeur"