Excel, boite de dialogue, fichiers¯o
RésoluIpalgo Messages postés 53 Statut Membre -
Voici une demande un peu ambitieuse...
J'ai vu sous excel que l'on pouvait créer des boite de dialogues. Serait-il possible de créer ce style :
1/ Entré la référence du produit
2/ le nom du client
3/ la date
4/ la référence en interne
5/ une dizaine de case à cocher
Ensuite :
chaque case coché ferait référence à une ou deux feuilles de calcul excel situées dans un dossier quelconque. Il faudrait que ce modèle excel soit modifié en fonction des paramètre saisi en 1/ 2/ 3/ 4/ puis imprimé.
Merci aux plus courageux !
19 réponses
La problématique consiste à créer une interface Excel (UserForm) permettant d’entrer référence produit, nom client, date et référence interne, puis d’exploiter des cases à cocher pour modifier des feuilles et imprimer un modèle.
Plusieurs approches suggèrent d’utiliser VBA avec des contrôles textbox, combobox et checkbox, et d’automatiser des enregistrements entre Excel et Word selon les cases cochées.
Des exemples évoquent la gestion de Word via WordApp et WordDoc, la libération de mémoire (WordApp.Quit, Set WordApp = Nothing) et la difficulté d’adapter le flux lorsque chaque checkbox cible un fichier distinct.
En pratique, certains abordent l’usage de bibliothèques Microsoft Word 12.0 Object Library et l’idée d’imprimer à partir de modèles Excel (.xlt) ou de diriger le flux vers des destinations variées.
-
Salut,
Cette boite de dialogue comme tu dis est une Userform avec des contrôles Textbox, Combobox, case à cocher etc ...et cela se traite en VBA (visual basic). Vu ton post tu ne connais pas et dans ce cas ce sera très difficile. Le but d'un forum est de donner quelques conseils mais pas d'écrire un programme surtout par post cela prendrait beaucoup trop de temps et nous sommes bénévoles.
A+
Mike-31
Une période d'échec est un moment rêvé pour semer les graines du savoir.-
-
Bonjour,
Tout à fait d'accord avec Mike
Pour apprendre:
https://silkyroad.developpez.com/VBA/UserForm/
https://silkyroad.developpez.com/VBA/ControlesUserForm/ -
-
-
Bonjour à tous,
Bonjour Mike-31 et bonjour michel_m,
On apprend vite quand on est booster par les bons sites. Je vous remercie.
J'ai encore quelques difficultés. Voici le bout de code que j'ai pour transferer les données saisies dans les textbox 1/2/3/4/ vers des liens placés dans un tableau word.
Private Sub CommandButton3_Click() If CheckBox1 = True Then Dim WordApp As Word.Application Dim WordDoc As Word.Document Set WordApp = CreateObject("word.application") 'ouvre session word et le fichier voulu Set WordDoc = WordApp.Documents.Open("C:\lien") 'ouvre document Word WordApp.Visible = False 'word masqué pendant l'operation 'dans le document word, il faut avoir placé des signets aux endroits qu'on veut remplir 'à l'endroit de chaque signet qui se trouve dans le fichier word on va inscrire le contenu des cellules WordDoc.Bookmarks("RappEss").Range.Text = Cells(1, A) WordDoc.Bookmarks("Client").Range.Text = Cells(2, A) WordDoc.Bookmarks("Ref").Range.Text = Cells(3, A) WordDoc.Bookmarks("Date").Range.Text = Cells(4, A) WordApp.Visible = True 'affiche le document Word 'WordDoc.PrintOut 'si on veut imprimer 'WordDoc.Close True 'si on veut fermer le document word en sauvegardant les données 'WordApp.Quit 'ferme la session Word End If Unload Me End Sub
Le problème est queDim WordApp As Word.Application
n'est pas reconnu, une boite de dialogue apparait et il est écris "Erreur de compilation: type définit par l'utilisateur non défini".
J'ai pourtant vérifié sous word, la référence "Microsoft Word xx.x Object Library" est bien cochée (c'est la "Microsoft Word 12.0 Object Library")
Un coup de pouce svp.-
Salut,
Il ya 2 références à cocher!
Microsoft Word X.y object library
'et Microsoft Visual Basic For Applications Extensibility x.y
xy étant variables svt version office et Win
au passage
A dans cells(1,A), c'est quoi ?
si A est la colonne il faut écrire cells(1,1)
d'autre part j'aurais collecté les valeurs à copier dans Word au départ du code juste après les déclarations stylecopie1=cells(1,1)
car une fois que tu écris set worddoc, le document actif est Word et Word ne connait pas "cells"
doncWordDoc.Bookmarks("RappEss").Range.Text = copie1
enfin-ouf j'aurais marqué le nom du doc WordSet WordDoc = WordApp.Documents.Open("C:\lien\tondoc.doc") -
encore un truc
La méthode "quit" de wordapp risque de ne pas être appréciée par certains antivirus comme Macafee: cocher alors toujours accepter
enfin tu risques aussi d'avoir un bug (vieilles version office ?)au lancement de word
'déclaration à changer dim wordapp as object '.... '.... ' lancement de Word ' gestion de l'erreur "activeX" d'après archives MPFE Laurent Longre On Error Resume Next Set wordapp= CreateObject(class:="Word.Application") On Error GoTo 0 If Cible Is Nothing Then Set wordapp= New Word.Application End If
-
-
J'ai coché "microsoft Visual Basic for App Extensibility 5.3" dans le vba excel et le vba word mais le problème survient tjs.
" Erreur de compilation : Type défini par l'utilisateur non défini "
J'ai aussi essayé de remplacerDim WordApp As Word.Application
par le code que tu m'as fournis mais cela n'a pas marché.
Sinon toutes tes intuitions étaient bonnes :
- Je compile sur une machine qui a word et excel 2007 mais c'est destiné a un poste qui possède la version 2003.
- A était pour la colonne
- faire les copie 1,2,3 etc au préalable est très malin. -
Bonjour tous,
Tu n'a pas coché la bonne bibliothèque, comme le dit Michel_m c'est ...
Microsoft Word 12.0 Object librairy
Aucune autre bibliothèque n'est nécessaire.
J'ai tester et ça fonctionne sous le 2000 et 2007
Et vaudrait mieux ajouter avant ton Unload..WordApp.Quit Set WordApp = Nothing
Pour être certain de libérer la mémoire.
A+
L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)-
-
Merci pour le lien.
La bibliothèque fonctionne c nickel.
Le problème maintenant à l'air d'être une mauvaise cible de signet (Erreur d'execution '5941' le membre de la collection n'existe pas ; et ça surligneWordDoc.Bookmarks("RappEss").Range.Text = copie1)
Je veux pas perdre tout mon crédit alors je vais chercher.
+ -
Comment faire pour que la référence 'Microsoft Visual Basic For Applications Extensibility x.y reste tjs cocher dans tout document ?
Il me semble que c'est à cause de ça que j'ai le message suivant " Variable objet ou variable bloc With non definie" et le debogeur désigne.Selection.TypeText (insert1)
Sinon à quoi sert les points ajouté a chaque début de ligne ?
ex :.Visible = True .ActiveDocument.Save
-
Bonjour,
Hier, j'avais pas mal bidouillé dans mon fichier au cours de nos messages et je t'ai envoyé un truc foireux (ca marchait au départ et j'ai réussi à le planter comme d'hab)
Je t'envoie un autre exemple plus simple
http://www.cijoint.fr/cjlink.php?file=cj201007/cijIijFzsy.zip
le point en début de ligne permet de ne pas répéter le nom de l'objet avec lequel tu travailles
With tonobject
.visible=true
.activedocument.save
end with
ci joint capture d'écran avec les ref installées...
http://www.cijoint.fr/cjlink.php?file=cj201007/cijNktBJGA.doc -
Salut
j'ai aussi essayé un autre truc :Private Sub CommandButton2_Click() If CheckBox1 = True Then Dim WordApp As Word.Application Dim WordDoc As Word.Document Set WordApp = CreateObject("word.application") WordApp.Visible = True 'mettre False pour garder Word masqué Set WordDoc = WordApp.Documents.Open("C:\..\*.docx") WordDoc.Tables(1).Columns(2).Cells(1).Range.Text = Range("A1") WordDoc.Tables(1).Columns(4).Cells(1).Range.Text = Range("A2") WordDoc.Tables(1).Columns(2).Cells(3).Range.Text = Range("A3") WordDoc.Tables(1).Columns(2).Cells(2).Range.Text = Range("A4") WordDoc.Tables(1).Columns(4).Cells(2).Range.Text = Range("A5") ActiveDocument.PrintPreview 'WordDoc.Close True 'ferme le document Word en enregistrant les modifications 'WordApp.Quit 'ferme l'application Word End If MsgBox "fini" End Sub
c'est assez simple et pour l'instant ca marche.
C'est étrange aussi, pcq m sans faire les copies au préalable word reconnait Range("A1")
Comme à la fin je vise env une 30 aine de checkbox il faut que le fichier word et le fichier excel attaché à une checkbox se modifient vite et et que le dossier s'imprime rapidement.
( Il faut que je rajoute dedansWordApp.Quit Set WordApp = Nothing
et le code archives MPFE Laurent Longre)
Je commence a bidouiller des boucles sur les checkbox mais je pense pas que ce soit la solution vu que chaque checkbox est attaché a un fichier propre.
Sinon j'essaye de remplacer le tableau par une localisation signets.
Je voudrais aussi (c'est encore loin) avoir un aperçu général du futur dossier imprimer.
Si checkbox 1,2,6 etc.. cochés alors apercu de 1,2,6 etc à la suite.
Seulement les illusions s'arretent vite vu qu'il s'agit de fichiers complètement séparés..
J'y réfléchirais plus tard.
Merci à toi en tout cas d'être aussi présent ça boost à fond !
-
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Re,
Essaye d'envoyer un MP à argixu, voir s'il à encore l'exemple ou qu'il puisse te le réexpliquer.
A+ -
Bon, avant de terminer mon programme il faut que je passe par autre chose.
J'ai une liste de fichier MODELE EXCEL dans lesquels je dois modifier des lettres etc et ensuite les réenregistrer en tant que modèle excel.
Ca donne ca :
Dim Fich As String Const chemin = "C:\Documents and Settings\Pierre-Amaury\Bureau\Masques communs IFTH\" Fich = Dir(chemin & "*.xlt") Do While Fich <> "" Workbooks.Open chemin & Fich 'là c'est le code saisi à la souris Workbooks(Fich).Close True Fich = Dir Loop End Sub
Ce code marche très bien pour des fichiers xls (déjà essayé) mais quand je veux l'appliquer à des .xlt ça affiche " erreur d'éxécution '9': L'indice n'appartient pas à la séléction. " etWorkbooks(Fich).Close True
est surligné.
Inspiration divine ?.. -
Bonjour à tous,
j'espère avoir une reponse assez rapide m par ce chaud moi de juillet.
Je suis toujours occupé avec mes checkbox, j'ai réussi a avoir un code qui fonctionne pour 1 checkbox.
détail : 1/je rentre des infos dans 5 textbox
2/ je coche 1 checkbox sur 20
3/ comme elle est cochée au moment ou je clique sur ok le texte qui a été saisi dans les 5 textbox se recopie à 5 signet respectifs. C'est signets se trouvent dans un fichier word.
4/ le fichier s'imprime
5/ le fichier se ferme sans enregistrer les modifs.
Le problème est le suivant, quand je copie colle ce code sous les autres checkbox un message d'erreur apparait :
"Erreur de compilation : déclaration existante dans la portée en cours"
et cette ligne est surlignée :Dim WordApp As Word.Application
Voici le code en question :If CheckBox1 = True Then Dim WordApp As Word.Application Dim WordDoc As Word.Document Dim i As Byte Set WordApp = CreateObject("word.application") 'ouvre une session Word Set WordDoc = WordApp.Documents.Open("C:\cible\doc_Word_du_checkbox1.doc") 'ouvre le document Word WordApp.Visible = False 'Word est masqué pendant l'opération For i = 1 To 5 'les signets du document Word sont nommés Signet1 à Signet5 ActiveDocument.Bookmarks("Signet" & i).Range.Select WordDoc.Bookmarks("Signet" & i).Range.Text = Cells(i, 1) 'copie des cellules A1 à A5 (c'est à dire le texte des textbox) à l'emplacement des signets word Next i WordApp.Visible = True 'affiche le document Word 'WordDoc.Close False 'ferme le document word sans sauvegarder 'WordApp.Quit 'ferme la session Word End If If CheckBox2 = True Then Dim WordApp As Word.Application Dim WordDoc As Word.Document Dim i As Byte Set WordApp = CreateObject("word.application") Set WordDoc = WordApp.Documents.Open("C:\cible\doc_Word_du_checkbox2.doc") WordApp.Visible = False 'Word est masqué pendant l'opération For i = 1 To 5 ActiveDocument.Bookmarks("Signet" & i).Range.Select WordDoc.Bookmarks("Signet" & i).Range.Text = Cells(i, 1) Next i WordApp.Visible = True 'affiche le document Word 'WordDoc.Close False 'ferme le document word sans sauvegarder 'WordApp.Quit 'ferme la session Word End If Et ainsi de suite avec les autres checkbox
merci de me faire partager vos intuitions -
Bonjour
essaies plutôt
Dim WordApp As object
puisque un peu plus loin tu as
Set WordApp = CreateObject("word.application")
-
En modifiant avec Dim WordApp As Object cela marche pour Une chexbox mais dès que je souhaite en cocher 2 le problème persiste :
"Erreur de compilation : déclaration existante dans la portée en cours"
et cette ligne est surlignée :Dim WordApp As Object
J'ai essayé de modifier le nom comme ceci :Dim WordApp2 As Object Dim WordDoc2 As Word.Document
et l'erreur se reproduit juste à la ligne en dessous :
"Erreur de compilation : déclaration existante dans la portée en cours" et surligne :For i = 1 To 5
En fait c'est comme si j'avais fait 2 déclaration de variables donc une en trop mais je vois pas comment en faire qu'une. -
Tes déclarations ne sont à faire qu'une seule foisdans la procédure! généralement, on les saisit juste sous le titre de la macro
d'autre part es tu sûr qu'il faille quitter wordapp à chaque checkbox ?
a la fin de chaque checkbox tu libères seulement worddoc par
set worddoc=nothing après avoir sauvegardé ton transfert
-
-
Bonjour,
Peut-être une exemple ??Sub VVV() Dim WordApp As Word.Application Dim WordDoc As Word.Document Dim i As Byte Set WordApp = CreateObject("word.application") 'ouvre une session Word Set WordDoc = WordApp.Documents.Open("C:\cible\doc_Word_du_checkbox1.doc") WordApp.Visible = False 'Word est masqué pendant l'opération'ouvre le document Word If CheckBox1 = True Then For i = 1 To 5 'les signets du document Word sont nommés Signet1 à Signet5 ActiveDocument.Bookmarks("Signet" & i).Range.Select WordDoc.Bookmarks("Signet" & i).Range.Text = Cells(i, 1) 'copie des cellules A1 à A5 (c'est à dire le texte des textbox) à l'emplacement des signets word Next i End If If CheckBox2 = True Then For i = 1 To 5 ActiveDocument.Bookmarks("Signet" & i).Range.Select WordDoc.Bookmarks("Signet" & i).Range.Text = Cells(i, 1) Next i End If 'Et ainsi de suite avec les autres checkbox WordDoc.Close False 'ferme le document word sans sauvegarder WordApp.Quit 'ferme la session Word Set WordDoc = Nothing Set WordApp = Nothing End Sub
A+-
En fait comme il existe un document word et un excel bien spécifique à chaque chekbox je ne peux pas en ouvrir qu'un seul et le modifier en fonction des 20 checkbox.
Par contre je peux ouvrir l'application word et excel et les fermer qu'a la fin.
cette partie du code se répète à chaque chexbox, y a t il un moyen de faire un raccourci ?For i = 1 To 5 ActiveDocument.Bookmarks("Signet" & i).Range.Select WordDoc.Bookmarks("Signet" & i).Range.Text = Cells(i, 1) Next i
-
-
Tu veux raccourcir ?
Remplace tout le code de l'userform parOption Explicit Dim Check As Collection Private Sub Appliquer_Click() Dim WordApp As Word.Application Dim WordDoc As Word.Document Dim i As Byte Dim e As Integer Set WordApp = CreateObject("word.application") 'ouvre une session Word WordApp.Visible = False 'Word est masqué pendant l'opération'ouvre le document Word For e = 1 To Check.Count If Check(CStr(e)) Then Set WordDoc = WordApp.Documents.Open("C:\cible\doc_Word_du_checkbox" & e & ".doc") For i = 1 To 5 'les signets du document Word sont nommés Signet1 à Signet5 ActiveDocument.Bookmarks("Signet" & i).Range.Select WordDoc.Bookmarks("Signet" & i).Range.Text = Cells(i, 1) 'copie des cellules A1 à A5 (c'est à dire le texte des textbox) à l'emplacement des signets word Next i WordDoc.Close False ' à vérifier .. End If Next e WordApp.Quit 'ferme la session Word Set WordDoc = Nothing Set WordApp = Nothing End Sub Private Sub UserForm_Initialize() Dim Chk As Control Set Check = New Collection For Each Chk In Me.Controls If TypeOf Chk Is MSForms.CheckBox Then Check.Add Chk, CStr(Chk.Tag) End If Next Chk End Sub
Seule obligation, mettre les numéro de checkbox dans la propriété Tag des CheckBox
J'ai pas su vraiment tester je n'ai pas tes documents Word
L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)-
-
Ok alors là je suis impressionné, je digère pas encore toutes les commandes mais ca pourrait m etre très utile par la suite. Merci.
Le seul hic c'est que c'est toute la cible qui change à chaque fois pour une checkbox et non pas juste "checkbox xx"
ex :
"C:\cible1\doc_Word_du_checkbox1" .
"C:\cible2\doc_Word_du_checkbox2"
Pour y parvenir faudrait utiliser la recherche automatique de windows ce qui élève la difficulté (et en tout cas pour l'instant je ne m'en occupe pas).
Sinon une question bcp plus simple mais qui m'a deja fait chercher pendant plus de 2 heures :
j'ai 3 checkbox, je voudrais que 2 se décochent quand je coche la 3ème mais en "direct" sur l'UF.
Dans cet exemple les checkbox 1 et 2 sont décoché qu'après avoir cliquer sur commandbutton1 et non pas au moment ou checkbox3 est coché. Comment faire ?Private Sub CommandButton1_Click() If CheckBox3 = True Then CheckBox1 = False CheckBox2 = False MsgBox ("bien joué") End If If CheckBox1 = True Then MsgBox ("affiche le 1") If CheckBox2 = True Then MsgBox ("affiche le 2") End Sub
Bonne apétit -
-
-
Private Sub CheckBox3_Click() If CheckBox3 Then CheckBox2 = False: CheckBox1 = False End Sub Private Sub CommandButton1_Click() If CheckBox3 = True Then MsgBox ("bien joué") Else If CheckBox1 = True Then MsgBox ("affiche le 1") If CheckBox2 = True Then MsgBox ("affiche le 2") End If End Sub
-
Concernant...
Le seul hic c'est que c'est toute la cible qui change à chaque fois pour une checkbox et non pas juste "checkbox xx"
Tu peu mettre les chemins complet (répertoirs etc.. dans une colonne d'une feuille quelconque, tu dis la feuille et la colonne et la 1ère cellulle renseignée et je te modifie le code précedant pour que ça fonctionne.
Par ex:
Feuil3
A1 = C:\cible1\doc_Word_du_checkbox1
A2 = C:\cible2\doc_Word_du_checkbox2
Etc..
A+
L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)-
Ca serait vraiment chic. j essaye de te preparer ca.
En attendant comment faire en sorte que si "signet5" n'existe pas dans le document word, le programme continue sans coller la valeur copié ?
Aussi, y a t il un moyen de rassembler des lignes de code sous un "plus" comme dans l'explorateur window ?
Merci à toi
-
-
question 1 : suffit de mettre un <On Error Resume Next>
Question 2 : pas compris
-
Je dois rentrer chez moi et je n'ai pas de connexion internet. je retravail ca demain.
La deuxième question c'est en fait :
quand tu ouvre l'explorateur window standard, a gauche dans l'arborescence il y a des petits "+" dans un carré, quand on clique dessus ca déroule tous les sous dossiers.
est il possible de faire la même chose au sein d'un texte VBA ? Regrouper plusieur lignes sous une pour éclaircir un peu.
A demain -
-
-
-
-
Désolé mais il n'y avait plus de feedback sur les réponses.. (CCM qui rame depuis...)
Et je ne vais pas faire toute ron appli... !!
1/ on rentre les infos dans les 5 textbox (remarque : il s'agit de la date du jour dans le textbox4, possible de remplir en automatique? De laisser encore la saisie manuelle si l'on veut rentrer la date de demain?)
Mettre dansPrivate Sub UserForm_Initialize() TextBox4 = Date End Sub
Tu pourras toujours changer la date.
2°) Il n'y a RIEN dans l'UF tu n'a même pas commencer, voir les liens ou code donner pour déjà faire la collection de tes checkbox, sinon ça va devenir intenable..
La suite.. je verrais quand tu aurras avancé.
-
Wouaaw, mais c'est pas là que tu doit mettre tes codes. :(
Le plus simple, tu va dans l'éditeur (Alt+F11)
tu affiche l'UserForm (celui où tu a mis tes textBox et boutons.
tu double clic sur un bouton et tu tombe sur le module où tu dois mettre les macro. -
En fait normalement le code je le place dans l'usf en faisant clic droit puis code de l'usf dans l'explorateur de projet. Seulement là je voulais pas y mettre des chose inutiles c'est pour ça que je t'ai envoyé un usf vierge et mis le code en feuille 2.
Hormis ce quiproquo le code en question marche très bien mais c'est vrai qu'il devient intenable. Surtout quand on me demande s'il sera facile de modifier pour des gens qui n'ont jamais vu de vba excel le nombre de checkbox.
c'est pour ca que j'ai été séduit par ta colonne de cible dans une feuille et la collection.
Le problème c'est que j'ai beau étudier tes anciens posts et tes astuces j'ai encore du mal avec la collection d'objet checkbox. je continu de potasser quoi.
A+ -
en reprenant le code de cette réponse, le UF_Initialize, si tu exécute ce code c'est comme si tu n'avais qu'un seul checkbox que tu peu tester sauf qu'il a un index, en d'autre terme tu aurais le nom des CheckBox qui serait..
Chk(1)
Chk(2)
Chk(3)
etc..
Et qu'à partir de là tu peu tester tout tes checkbox avec 3
lignesFor i = 1 to Unbound(Chk) 'Le dernier checkBox If Chk(i).Value = True then 'tu exécute ce que tu veux comme si c'était le checkBox que tu teste End if Next i
Oublie pas qu'il faut mettre les numéros dans les propriétés Tag des CheckBox, le nom n'a pas d'importance
-
La vrai gène c'est que je traite et des fichiers word et des fichierx excel. Suivant le type de fichier soit je pilote word soit je pilote excel.
il faudrait 2 paragraphes bien distinct qui fait l'un ou l'autre. Puis en fonction de la checkbox coché ( ie en fonction du type de ficher qui lui est attaché) le traitement se fait en paragraphe1 ou 2. -
Salut Lermitte 222,
Jvoulais te prévenir que je serais un peu moin présent à partir de maintenant étant donn" que j'ai finis mon stage. Je continu le pgm plus pour le désir d'avoir une chose bien terminé que par obligation seulement je serais un peu moin réactif.
Merci bcp pour l'aide que tu m'as donné. Porte toi bien !