VBA SOUS EXCEL - aide pour 3 fonctions je suis un newbie

Bonjour,

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

merci beaucoup

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

merci pour ton message

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.

http://img116.imageshack.us/img116/2299/imagewi0.th.jpg

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

End Sub

Après un premier examen rapide :
Il n’y a pas de masque pour la saisie de la

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

Merci pour ton aide

je vais regarder ca ce soir

jte retiens au courant demain, c’est gentil de m’aider car c’est la premiere fois que je fais un script

a demain si j’ai encore du mal hihi

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

Bon courage - Tiens moi au courant

C est gentil a toi de m’aider

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.

la commande bloque "frmsaisie.show"
http://img208.imageshack.us/img208/483/20070219095758cr5.th.jpg

snif

Pourtant tu as bien du code dans ton userform

Private Sub cmdCancel_Click()
    frmsaisie.Hide
End Sub

Il faut que tu vérifies 2 choses

  • que le bouton s’appelle bien cmdCancel (la propriété Nom, pas la propriété Caption)
  • que le userform s’appelle bien frmsaisie

C’est peut être le même pb que ci dessus (nom du Userform)

merci pour tout j ai reussi

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

merci

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 …

coucou g trouve pour le partage
par contre je n’arrive plus a avoir la date d aujourdhui par defaut dans le formulaire
pourtant avant je lavais

ou est ce que je dois marqué la fonction?
tout fct bien sinon
merci bcp

extrait du code que tu as mis plus haut :

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é.

en fait mes collègues m ont dit qu’il devait le programmer en vb externe

sauf que dans excel il existe la solution outil/partage du classeur

activer multiutilisateurs
c est tout simple et lorsqu on cela s insere ca le fait a la suite de l autre

juste une derniere chose,

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.

merci

Ca ne devrait pas être le cas, puisque dans UserForm_Activate() tu as
List_NAME.ListIndex = 0
Free_TEXT.Text = ""

Mets un point d’arrêt sur la ligne
Free_TEXT.Text = “”
et vérifie que tu y repasses à chaque fois

ca à l’air de fonctionner

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?

merci