j’ai un user form sous excel avec une liste deroulante(list_name) qui est liée à une base de données et avec une zone (free_text).
j’aimerai que dès que les deux champs sont remplis, avec le bouton OK il les insèrent les données dans les cellules concernées, puis en cliquand sur un bouton (nouveau) qui doit être inactif, je puisse saisir les nouvelles données.
1 - j’aimerai savoir comment justement programmer le bouton (ok), pour qu’ils les inserent que seulement si les données list_name et free_text sont rentrées.
2- puis dès que les données sont intégrées, le bouton (nouveau) soit actif, si vous savez comment le rendre inactif, ce serait vraiment gentil.
3- dès que le bouton (nouveau) est cliqué, il faut que les futures données que je vais incorporer (list_name et free_text) soient prises en compte pour que la copie se fasse dans une nouvelle ligne.
si je résume, j’aimerai juste avoir les fonctions pour
ajouter lignes si condition
copie données
fonction pour mette le bouton nouveau actif et inactif selon condtion
Là tu vas avoir du mal ; si tu rends le bouton inactif, c’est justement pour ne pas pouvoir cliquer dessus
Il suffit de vérifier dans la fonction OK_Click que les champs sont correctement remplis. Exemple pour le champ texte :
If Me.free_text = "" Then
MsgBox "Vous devez fournir une valeur pour free_text", vbCritical + vbOKOnly, "Erreur de saisie"
Exit Sub
End If
.... ici la suite de la fonction .....
Pour rendre un bouton actif ou inactif, c’est la fonction Enable()
Me.Nouveau.Enable = False
Pour l’écriture des valeurs, tu as la réponse dans ton message de la semaine dernière, mais si tu n’y arrives pas, on peut développer un peu plus
j’ai essayé ici et la de faire un script en regardant et en essayant
ca prend forme mais j’ai des erreurs
jte montre un peu a quoi cela devra ressembler, j’ai fait des test pcq les données n’allaient pas ou je voulais, qui plus est j’ai demande un formatage dd-hh-yy mais comme tu vois dans la colonne date, on peut tjs mettre n’importe quoi.
j’avais une formule de recherche dans les fonction et agence, mais les formules sont effacées quand on appuie sur OK
est ce que y’a possibilité de ne pas effacer la cellule ou peux ton l’inclure dans le script vba stp?
toutes mes données sont dans DATABASE du classeur et s’apparentent comme la feuille modele
je t’ai mis le script que j’ai essaye de comprendre
le bouton cmdcancel il comprend pas, moi non plus lol car j’ai essayé de comprendre la fonction fmsaisie.hide mais je ne sais pas à quoi elle correspond
il me met erreur 424 en surbrillant le fmsaisie.hide
voici le script
Private Sub cmdCancel_Click()
frmSaisie.Hide
End Sub
Private Sub UserForm_Initialize()
Dim ValSour As Range
List_NAME.ListIndex = 0
Free_TEXT.Text = ""
DateBox.Text = Format(Now, "dd/mm/yy")
End Sub
Private Sub DateBox_Change()
End Sub
Private Sub UserForm_Click()
End Sub
Private Sub Free_TEXT_Change()
End Sub
Private Sub List_NAME_Change()
End Sub
Private Sub Button_NEW_Click()
End Sub
Private Sub Button_OK_Click()
If Free_TEXT.Text = "" Then
MsgBox "Veuillez saisir la description du problème"
Free_TEXT.SetFocus
Exit Sub
End If
If List_NAME = "" Then
MsgBox "Veuillez choisir une personne"
List_NAME.SetFocus
Exit Sub
End If
Range(“B5”).Select
ActiveCell.EntireRow.Insert
ActiveCell.Value = List_NAME.Value
ActiveCell.Offset(0, 3).Value = Free_TEXT
ActiveCell.Offset(0, -1).Value = Format(Val(DateBox), _
“dd-mm-yy”)
ActiveCell.Offset(0, -1).Value = DateBox
ActiveCell.Offset(0, 3).Value = “Non”
Dim Rep As Integer
Rep = MsgBox(“Les données ont été stockées” & Chr(13) _
& “Voulez-vous saisir d’autres données”, _
vbInformation + vbYesNo)
If Rep = vbNo Then
frmSaisie.Hide
Else
List_NAME.ListIndex = 0
Free_TEXT.Text = “”
DateBox.Text = Format(Now, “dd/mm/yy”)
List_NAME.SetFocus
End If
Après un premier examen rapide :
Pour la date, il n’y a pas de masque de saisie, donc normal qu’on puisse mettre n’importe quelle chaine de caractères. C’est à toi d’effectuer le contrôle après saisie sur le modèle de ce que tu as fait pour les deux autres champs ; par ex
If Not IsDate(DateBox) Then
MsgBox "Veuillez entrer une date correcte"
DateBox.SetFocus
Exit Sub
End If
Par contre, Format() retourne toujours une chaine de caractères ; donc ce que tu mets dans ta cellule, ce n’est pas une date, mais un texte formaté comme une date.
La bonne syntaxe est
ActiveCell.Offset(0, -1).Value = CDate(DateBox)
Pour le reste, il faut que tu affines un peu, en distinguant les mises à jour des “NEW”
Dans le premier cas, il n’y a pas d’insert à faire, juste te recaler sur la bonne ligne en fonction de la valeur de la listBox
Dans le second, il faut le faire à la fin du tableau ; le mieux est de recopier la ligne précédente, puis de la surcharger avec les valeurs du userform
comment faire pour mon bouton cancel, il ne fonctionne pas
j’ai encore deux trois trucs pour que mon script soit enfin comme je veux…désolé si je suis chiant
j’aimerai que ma macro soit activée dès que j’ouvre la feuille excel(il faudrait un gros bouton pour l’activer dans excel) mais je sais pas comment l’activer…et surtout je ne veux pas qu’elle soit sur l’une des 3 autres feuilles ou mes données sont présentes.
sinon comment faire pour que la grille excel se formate de facon a ce que des qu’a chaque fois que fasse ok, les colonnes s’agrandissent si le nom est trop long
merci a toi gcc, t es archi cool; il faudrait que j’achete un livre sur vba, car les exemples sur internet c est chaud quand tu connais pas
Pas de pb ; ceux qui sont chiants, c’est ceux qui veulent du tout cuit sans chercher ; mais on n’est pas dans ce cas là.
Il faut choisir ou elle s’ouvre avec le classeur, ou elle s’ouvre quand tu cliques sur un bouton.
Pour une ouverture automatique, dans VBA tu doublecliques ThisWorkbook et tu choisis la fonction workbook open. Il suffit de mettre
Private Sub Workbook_Open()
frmsaisie.Show
End Sub
Pour une ouverture à partir d’un bouton, il faut écrire une macro, donc créer un module de la même manière de tu as créé ton userform.
Dans ton modules, tu crées ta macro
Sub OuvrirUserForm() ' ou n'importe quel autre nom de ton choix
frmsaisie.Show
End Sub
puis dans ta feuille de calcul, à partir de la barre d’outils formulaire, tu insères un bouton et tu lui affectes la macro OuvrirUserForm
Avec ce que tu as ecrit, ton bouton Cancel ferme le UserForm ; ce n’est pas ce que tu veux ?
Il faut procéder expérimentalement :
tu tapes du texte (trop long pour la cellule ) dans la cellule d’une feuille (vierge, c’est mieux)
tu fais outils->Macros->Nouvelle Macro
tu notes bien le nom de macro et de module pour les retrouver ensuite
tu redimensionnes ta colonne comme tu le fais d’habitude
tu arrêtes la macro (outils->macro->arrêter)
Tu vas voir le code généré et tu t’en inspires pour ton problème
je teste ca de suite et je te tiens au courant, je dois comprendre les formules et je suis content car je comprends bien le mécanisme alors que ce sont mes premiers pas. je ne te remercierai jamais assez.
pour le bouton cancel, j ai toujours rien
j ai bien un bouton cancel mais j’ai rien mis comme code
et quand je vois l erreur au debogage, ca vient du frmsaisie.hide qui me met en surbrillance.
par contre une derniere chose, et apres je t embete plus j espere
j aimerai que la feuille soit exploitable en partagé (sur un reseau local , max 15 personnes) ce qui signifie que plusieurs personnes peuvent y acceder en meme temps et enregistrer en mm tps sans que ca se chevauche en enregistrant.
merci par avance,
par contre comme je te suis reconnaissant, je souhaite t envoyer qqch pour ton aide
pas possible de travailler en simultané sur une feuille excel ;
tout simplement parce que chaque utilisateur charge la totalité du programme en mémoire et donc le dernier écrase tout ce qui aurait pu être mis entre temps.
Pas de solution facile à ton problème mais quelques pistes :
Soit tu obliges les gens à travailler un seul à la fois, en verrouillant ton fichier, mais on s’aperçoit à l’usage que ce n’est pas trop vivable
Soit chaque utilisateur travaille sur une copie, qu’il enregistre sous un noueu nom, et ensuite un administrateur ou un fichier batch se charge du recollement dans le fichier principal.
Soit tu t’orientes vers une application client-serveur, avec base de données pour stocker tes données. C’est certainement la meilleure solution, mais c’est aussi une autre histoire …
La dernière ligne doit bien te donner la date courante, mais seulement la première fois
Si tu la veux à chaque fois que tu rentres dans ton formulaire, utilise UserForm_Activate() à la place de UserForm_Initialize()
Par contre si tu pouvais me dire comment tu a résolu le problème des multiutilisateurs, je suis intéressé.
tu te rappelles de mon bouton FORMULAIRE que j’ai integré dans ma feuille excel
le bouton il fct il n y pas de probleme, par contre il me laisse les anciennes données enregistrées quand je l active de nouveau(en fait si je reste dans la feuille sans en sortir), est ce qu il y a un moyen de tout soit vierge stp sauf la date bien sur.
je vais etre chiant encore, j’ai essayé de créer une macro via l enregistrement mais c’est pas top car ca ne donne pas ce que j’essaie vraiment de lui dire à excel puisqu’il n’est pas devin.
en fait je lui avais fait enregistrer une macro pour faire un tri, j’ai décortiqué ce qu’il m’a fait, j’ai à peu près piger ce la macro sauf que…(he oui…)
ce que je voudrais faire, c est creer un formulaire et un bouton sur la feuille excel(ca je sais maintenant le faire grace à tes conseils)
sur le formulaire il y aura les 3 memes listes deroulantes qui correspondent au titre de mes colonnes , ces tris seront par préférence le 1er, puis le 2eme et enfin le 3eme comme sur excel en fait.
puis apres je le genererai l impression via un bouton print que je vais tenter de chercher moi meme(il ne faut pas exagerer non plus lol)
en tout cas depuis que j’ai poste sur ce probleme j’pige bien les fonctions, maintenant il faut toutes les apprendre. je pense que je vais m acheter un livre dessus. est ce que tu connais un livre facile d acces pour apprendre les fonctions vba stp?