Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

report calcul dans userform

O

olivierd

Guest
bonjour cher(e ) lecteur (rice ),

j'utilise une boite de dialogue pour reporter des données dans ma feuille Excel
et il m'arrive de saisir des données de type =100-10
et l'information reportée reste =100-10
au lieu du "90" attendu

Pourriez-vous me dire pourquoi et comment y remédier ( si c'est votre jour de bonté, of course )

cordialement
 
O

olivierd

Guest
re-bonjour,

en fait, je vais reformuler ma requête plus simplement:
Pourriez-vous m'indiquer comment reporter sur une cellule, une formule de calcul saisie dans un userform ?

Cordialement
 
Y

Yeahou

Guest
Bonjour Olivier, le forum

Tu peux utiliser un textbox dans un userform ou une inputbox!
La solution différe.

1-Pour une inputbox, le plus simple est d'utiliser la méthode inputbox (ne pas confondre avec la fonction inputbox à la syntaxe trés proche mais ne disposant pas des mêmes capacités).
Application.InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextId, Type) ou type concerne le type de données à entrer:
0 Une formule.
1 Un nombre.
2 Texte (une chaîne).
4 Une valeur logique (True ou False).
8 Une référence de cellule, sous la forme d'un objet Range.
16 Une valeur d'erreur, telle que #N/A.
64 Un tableau de valeurs.

Si c'est la formule proprement dite qui t'interesses, il faut mettre type à 0
Range("A1").FormulaR1C1 = Application.InputBox(Prompt:="Entrez une formule", Title:="Interface", Default:="=", Type:=0)
ne pas oublier le = au début de la formule entrée
si tu entres =100-10, tu auras en A1 la formule =100-10 et la valeur 90.

Si c'est le résultat de l'opération qui t'interesses, il faut passer type à 1
Range("A1").FormulaR1C1 = Application.InputBox(Prompt:="Entrez une formule", Title:="Interface", Default:="=", Type:=1)
ne pas oublier le = au début de la formule entrée
si tu entres =100-10, tu auras en A1 la valeur 90 sans formule.

Lors de l'exécution de l'inputbox, tu peux utiliser les flèches pour sélectionner des adresses de cellules.

2-Pour une textbox dans un userform, il faut entrer pareillement la formule sans oublier le = et mettre à jour la cellule par
-si c'est la formule que tu veux
Range("A1").formular1c1=userform.texbox1.value
-si c'est la valeur que tu veux
Range("A1").formular1c1=userform.texbox1.value
Range("A1").Value = Range("A1").Value

Cordialement, A+
 
O

Olivierd

Guest
bonjour Yeahou,

Il me semble que le champ de l'userform doit être un "textbox"
Il a été renommé "SalaireSDTC"

Ce champ "SalaireSDTC" me permet de reporter mes saisies en "F63"
Les saisies sont des nombres ( là, aucun problème)
=>mais j'aimerais souvent saisir une formule pour obtenir directement la valeur en F63
et dans ce cas, actuellement j'obtiens la formule au lieu d'obtenir la valeur

( peut-on alterner saisie d'un nombre et saisie d'une formule ?... )

Voici ce que j'ai trouvé lié à ce champ:

Private Sub SalaireSDTC_Change()
End Sub

Private Sub btnValidation_Click()
With Sheets("SDTC")
.Range("F63") = SalaireSDTC
End With

Merci pour ton commentaire...

Cordialement

Olivierd
 
Y

Yeahou

Guest
Bonjour olivier

tu peux alterner mais par deux boutons différents (ou un seul bouton si la macro appelée demande la précision à l'utilisateur)

pour le premier qui copiera les formules
Private Sub btnValidation_Click()
With Sheets("SDTC")
.Range("F63").formular1c1 = SalaireSDTC
End With

pour le deuxième qui copiera les valeurs
Private Sub btnValidation2_Click()
With Sheets("SDTC")
.Range("F63").formular1c1 = SalaireSDTC
.Range("F63").value = .Range("F63").value
End With

par contre, les formules appelant des adresses de cellules devront être du type
=R[2]C[2]
celle la signifie que la valeur de la cellule dans laquelle elle est collée est égale à la cellule décalée de 2 vers le bas et 2 vers la droite
modifier des formules avec l'enregistreur activé te montrera les syntaxes à utiliser

Cordialement, A+
 
O

Olivierd

Guest
)
Merci beaucoup, cela marche parfaitement:
j'ai rajouté
.Range("F63").FormulaR1C1 = SalaireSDTC
.Range("F63").Value = .Range("F63").Value
Dans le bouton déjà existant
et soit je saisis "=100-10" pour une valeur 90 soit directement "90" tout fonctionne ( comme toujours avec tes codes...)

A bientôt

cordialement
Olivierd
 
O

Olivierd

Guest
bonjour,

Cela marche parfaitement quand je teste des saisies uniquement ce champ...

mais quand je valide l'userform ( qui contient env. 30 champs différents ), j'ai un blocage sur
.Range("F63").Value = .Range("F63").Value

mais ( très bizarre ) ce n'est pas systématique et je n'arrive pas toujours à reproduire le blocage avec les mêmes saisies...

C'est grave Herr doctor ?

Cordialement

Olivierd
 
Y

Yeahou

Guest
Bonjour olivier, le forum

Trop peu d'info pour te répondre, seule une erreur dans la formule entrée pourrait provoquer cela.Il faudrait donc intégrer une routine de gestion d'erreurs car ce n'est pas la formule en elle même qui provoque l'erreur (car elle peut être comprise comme une chaine texte et ne pas provoquer d'erreur) mais le fait qu'excel essaie de la traduire en valeur lors de la copie. Je ne peux te faire une routine appropriée sans le code complet du bouton alors essaie:

On error resume next
.Range("F63").Value = .Range("F63").Value
On error goto 0

cela permettra d'éviter l'erreur mais ne corrigera pas la formule.

Cordialement, A+
 
O

Olivierd

Guest
bonjour,

merci pour ta réponse

en fait la formule entrée est "=1501,23-158,14" ( jamais plus compliquée )

Je vais essayer de rajouter
On error resume next
.Range("F63").Value = .Range("F63").Value
On error goto 0

A+
 
Y

Yeahou

Guest
Re bonjour Olivier

C'est tout de suite plus compréhensible, VBA est en anglais, le séparateur est le point, non la virgule.
remplace par:
=1501.23-158.14
et cela fonctionnera correctement

Cordialement, A+
 
Y

Yeahou

Guest
Bonjour Olivier, le forum

voici un code qui remplacera les , par des points si une erreur est rencontrée.

On Error GoTo Gere_Erreurs
.Range("F63").Value = .Range("F63").Value
On Error GoTo 0

et à la fin du code (a la place de end sub)

Exit Sub
Gere_Erreurs:
UserForm1.TextBox1 = Replace(UserForm1.TextBox1, ",", ".")
MsgBox "Erreur numéro " & Err & " interceptée !" & Chr$(10) & "Type d'erreur : " & Error(Err) & Chr$(10) & "Correction de formule pour les virgules", vbOKOnly + vbInformation, Title:="Erreur détectée"
End Sub

Cordialement, A+
 
O

Olivierd

Guest
bonjour Yeahou, le forum,

bonsangmaisc'estbiensur... un point et pas de virgule !
Merci beaucoup

le code de remplacement est parfait car il est difficile de faire toutes les saisies de champs avec des virgules et de penser à mettre des points dans le cas d'une formule...

Penses-tu qu'il serait judicieux de prévoir un changement automatique ( de la virgule en point) sans passer par la boite de dialogue ( où cela pourrait entrainer d'autres incidents) ?

Très cordialement

Olivierd
 
Y

Yeahou

Guest
Bonjour olivier

pas de problème, il suffit de supprimer le msgbox. Par contre, si tu as une erreur d'un autre type (oubli d'une parenthèse ou autre), cela rendra ton bouton inactif sans te dire que tu as une erreur de formule.

tu peux aussi lier
UserForm1.TextBox1 = Replace(UserForm1.TextBox1, ",", ".")
à l'événement change de ton textbox1 pour avoir une correction à la volée
ou à l'événement afterupdate pour avoir une correction en fin de saisie
et garder la gestion des erreurs pour les autres types d'erreurs en modifiant le message (avec suppression du remplacement devenu inutile)

Cordialement, A+
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…