Aide pour macros Excel: remplir un tableau a partir d'une fenetre

Salut a tous

Bon je sais pas si ce que je demande dans le titre est très explicite, jvais essaier d’expliquer au mieux.

Faut que j’aie une fenetre avec plusieurs champs a remplir, et quand je clique sur Ok, toutes les valeurs des champs se transferent dans un tableau en utilisant quelques formules (par ex: champ1 * champ2 etc).
On m’a conseillé soit les macros d’excel, soit access, mais comme j’ai aucune idée de comment marche ce dernier, j’opterais pour les macros.

Tention aussi, jvous demande pas de me faire tout ça, j’ai envie d’apprendre! Mais juste une ptite mise en piste ou un bon tuto serait le bienvenu, je comprend assez vite quand c’est bien expliqué :slight_smile:

Merci d’avance.
Bye.

Personne a une ptite aide? J’ai regardé des tutos sur le net mais ils conrespondent pas vraiment a ske je veux :confused:

Dsl de reposter mais je croyais qu’on se fesait aider ici, nan? :confused:

Il faudrait que tu expliques un peu mieux ce que tu veux faire
transfert du formulaire dans le tableau
-> toujours dans les memes cellules, changement de ligne à chaque saisie ?
-> possibilité de revenir sur les saisies ?

Comment se fait le transfert ?
-> champ par champ
-> tout le formulaire à la validation du dernier champ ?
-> bouton de confirmation ?

Hmm je sais pas si ça pourra t’aider.

J’ai essaié de resumer en gros avec paint. Quand on remplis les champs a nouveau avec des nouvelles valeurs blabla1 2 3 etc, lors du clic sur OK, le tableau écrit a la ligne suivante.

http://pix.nofrag.com/a/8/e/8ffd07690639ba4d1722643f849b1t.jpg

Pas de problème puisque tu as un bouton pour valider tes entrées.
A l’ouverture de ta feuille (évènement Worksheet_Activate()), il suffit que tu définisses un “Range” en haut à gauche de ton tableau
set R = activesheet.range(“A1”)

Ensuite, dans ton Userform, dans l’évènement click du bouton

R.Value = UserForm1.TextBox1.Value + UserForm1.TextBox2.Value
R.Offset(0, 1).Value = UserForm1.TextBox1.Value - UserForm1.TextBox3.Value

etc…
et quand tes calculs sont tous retranscrits, tu changes de ligne
Set R = R.offset(1)

Oula :o

Oublie pas que j’ai jamais touché au VB de ma vie :slight_smile:

Si je comprend bien, ce que tu m’a écris c’est juste pour changer de ligne? Je galere surtout pour trouver comment afficher une fenetre quand on execute la macro. J’ai essaié “msgbox” mais ça ne me met qu’une fenetre avec seulement un bouton, du style avertissement (enfin tu dois savoir ske ça donne en fait^^).

et,

Textbox3.Value c’est ce qu’on écrit dans la 3eme case
R.Offset, c’est la case dans laquelle on bosse?
UserForm par contre je seche :slight_smile:

Ah oui, je suis peut être allé un peu vite, j’avias cru comprendre que ton formulaire était créé.

Donc il te faut

  • une feuille de calcul. On prendra celle qui se crée par defaut (Feuil1)
    Pour simplifier, au départ, o va créer le tableau à partir de la cellule A1.
  • un UserForm, avec tes champs d’entrée et ton bouton de validation
  • du code VBA

Le code VBA peut s’écrire dans un module (à créer) s’il est général, ou directement dans l’objet où il est utilisé ; pour nous la feuille et le formulaire.

1- Création du formulaire
tu vas dans Visual Basic, et dans la fenêtre de gauche, tu fais un clic droit sur ton projet et tu choisis insérer userform.
Par défaut, il va s’appeler UserForm1
Ensuite, tu le remplis à partir de la boite à Outils avec des champs de saisie (TextBox1, 2 etc) autant que tu as de données à entrer
Puis tu crées un bouton de commande (CommandButton1)

2 Code de la feuille
Pour simplifier le traitement, on va affecter une variable à la cellule A1 de la feuille. Elle sera de type Range
Pour qu’elle se crée automatiquement à l’ouverture on va utiliser l’évènement SurActivation (Worksheet_Activate())
Pour cela, tu doublecliques Feuil1 dans la fenêtre de projet, puis tu choisis Worksheet (à la place de général) et Activate.
Dans le squelette de la fonction, tu tapes ton code
set R = activesheet.range(“A1”)

3 Code du formulaire
C’est la même philosophie, à ceci près que le code se trouve dans le bouton
Tu reviens dans le UserForm et tu doublecliques le bouton ; et tu mets le code dans le squelette de l’évènement click
R.Value = UserForm1.TextBox1.Value + UserForm1.TextBox2.Value
R.Offset(0, 1).Value = UserForm1.TextBox1.Value - UserForm1.TextBox3.Value
etc…
et quand tes calculs sont tous retranscrits, tu changes de ligne
Set R = R.offset(1)

4 Lancement :
Tu crées un bouton sur la feuile de calcul, et dans son evènement click tu mets le code pour aciver le formulaire :
UserForm1.show

Et ca devrait marcher

Merci pour tout ça, j’y vois maintenant beaucoup plus clair. :slight_smile: Malheureusement il y’a encore quelques pepins.

  1. Code du formulaire.

J’entre bien les formules, mais il me sort ceci:

Et le débogueur me surligne ça:

R.Value = (UserForm1.TextBox1.Value / UserForm1.TextBox3.Value) * UserForm1.TextBox5.Value

J’ai essaié “R.Offset(0, 0).Value” a la place de “R.Value”, meme chose.

Et sinon pour l’instant ça me donne ceci:

Private Sub CommandButton1_Click()

R.Value = (UserForm1.TextBox1.Value / UserForm1.TextBox3.Value) * UserForm1.TextBox5.Value
R.Offset(0, 1).Value = UserForm1.TextBox1.Value / 12
R.Offset(0, 2).Value = UserForm1.TextBox4.Value * (UserForm1.TextBox1.Value / 12)


Set R = R.Offset(1)



End Sub

(pas fini pour l’instant)

Jvais aller me coucher moi, ma tete commenec a cramer^^
Edité le 11/03/2008 à 01:22

Ca pourrait être R qui n’est pas défini
1- vérifie ton code dans worksheet_Activate()
2- pour que ce soit pris en compte la première fois, il faut fermer puis rouvrir le classeur.
Si c’est ce 2e défaut, il aura donc disparu spontanément à ta prochaine ouverture

Ah ouep, j’avais mal activé le worksheet. Mais le truc c’est que meme si je l’active, je réouvre le classeur, il me sort toujours le meme truc.

Tien voila comment j’ai configuré tout ça. Y’a surement une ptite erreur la dedans qui fait tout foirer :confused:

http://pix.nofrag.com/6/8/e/862dc471a8be18d017507af0e8eb7t.jpg

Tu as bien fermé / réouvert ton excel depuis ta modif de worksheet_Activate ?
Si oui, le plus simple est de regarder ce qui se passe en pas à pas.
Tu sais te servir des points d’arrêt et de la fenêtre d’exécution immédiate ?

Ouep, fermé et ouvert, j’ai meme testé plusieurs fois.

Et non, ta derniere phrase c’est du charabia pour l’instant :slight_smile:

Cela doit venir de la visibilité de la variable R
Le plus simple va donc être de passer par un module de code

Pour ce faire, tu effectues les modifications suivantes :
1- tu supprimes la fonction Worksheet_Activate()

2- En cliquant sur thisWorkbook dans la fenêtre de projets, tu crées une fonction Workbook_Open()

Private Sub Workbook_Open()
    init
End Sub

En fait, la fonction à laquelle elle fait appel sera développée dans le module de code

3- Dans le UserForm, tu modifes pour la même raison le code associé au clic :

Private Sub CommandButton1_Click()
    calcul
End Sub

4- Par clic droit sur ton projet, tu crées un module, et tu y insères le code suivant :

Public R As Range

Sub init()
    Set R = ActiveSheet.Range("A1")
End Sub


Sub calcul()
    R.Value = (UserForm1.TextBox1.Value / UserForm1.TextBox3.Value) * UserForm1.TextBox5.Value
    R.Offset(0, 1).Value = UserForm1.TextBox1.Value / 12
    R.Offset(0, 2).Value = UserForm1.TextBox4.Value * (UserForm1.TextBox1.Value / 12)
    
    Set R = R.Offset(1)
End Sub

Erf c’est desesperant.

Maintenant il me sort soit “Variable objet ou bloc With non définie” quand je lie le bouton a la macro a

Sub calcul()

UserForm1.Show


End Sub

Ou encore “Incompatibilité de type. Erreur 13” pour le

Public R As Range

Sub init()
 Set R = ActiveSheet.Range("A1")
End Sub


Sub calcul()
 R.Value = (UserForm1.TextBox1.Value / UserForm1.TextBox3.Value) * UserForm1.TextBox5.Value
 R.Offset(0, 1).Value = UserForm1.TextBox1.Value / 12
 R.Offset(0, 2).Value = UserForm1.TextBox4.Value * (UserForm1.TextBox1.Value / 12)
 
 Set R = R.Offset(1)
End Sub

J’espere que jme suis pas enmellé qq part et que ça foire a cause d’un mini truc.

Tu l’a test chez toi voir di ça marche?
Edité le 11/03/2008 à 22:44

Relis bien ce que je t’ai mis plus haut ;
A aucun moment je ne parle de changer les liaisons entre boutons et macros

Bah si j’ai bien compris, je dois lier le bouton a un module avec dedans:

Sub calcul()

UserForm1.Show


End Sub

Mais dans ce cas la il me sort toujours l’erreur 13 en surlignant la meme ligne :confused:
Edité le 12/03/2008 à 13:08

Il doit manquer quelque chose

Fais une copie ici du code associé à tes 4 éléments
(Feuil1, Module1, ThisWorkbook et UserForm1)

Ok msieur, voila:

Feuil1:

Rien. Vu qu’il fallait désactiver worksheet_activate, y reste plus rien.

Module1:

Public R As Range

Sub init()

 Set R = ActiveSheet.Range("A1")
 
End Sub


Sub Calcul()
 R.Value = (UserForm1.TextBox1.Value / UserForm1.TextBox3.Value) * UserForm1.TextBox5.Value
 R.Offset(0, 1).Value = UserForm1.TextBox1.Value / 12
 R.Offset(0, 2).Value = UserForm1.TextBox4.Value * (UserForm1.TextBox1.Value / 12)
 
 Set R = R.Offset(1)
End Sub

ThisWorkbook:

Private Sub Workbook_Open()

init

End Sub

et UserForm1: (bouton OK)

Private Sub CommandButton1_Click()

Calcul

End Sub

Private Sub TextBox3_Change()

End Sub

Private Sub TextBox5_Change()

End Sub

Private Sub UserForm_Click()

End Sub

Et y’a aussi module 2:

Sub Prog()

UserForm1.Show


End Sub


Le bouton donne la dessus.

Je sens que j’ai du m’embrouiller qq part dans tout ça :confused:
Edité le 12/03/2008 à 13:49

En fait, je m’atttendais à y voir l’évènement clic de ton bouton

Private Sub CommandButton1_Click()
 calcul
End Sub

Il y a deux sortes de bouton que tu peux inclure dans la feuille de calcul

  • celui qui se trouve dans la barre d’outils “Boite à Outils contrôle”, que tu vas utiliser avec le code ci dessus
  • celui de la barre d’outils “formulaires”, que tu utilises en lui associant une macro.

Tu as choisi la seconde solution, elle est tout aussi valable
tu peux mettre ta fonction prog() dans le module 1 et supprimer le module 2

Pour le reste, ton code me paraît correct, je ne vois pas d’où peut provenir l’erreur
Est-tu sûr de bien réinitialiser le code entre le message d’erreur et ton essai suivant (Executer > Réinitialiser ou appui sur le petit carré bleu) ?