Enregistrer paramètres USF Word dans feuille Excel

Résolu
sifusalade Messages postés 142 Statut Membre -  
sifusalade Messages postés 142 Statut Membre -
Bonjour,

Je suis en train de créer une application Word dans lequel j'ai créé un USF assez complexe (8 multipages). L'idée est de générer ensuite un document word avec les éléments saisies dans l'USF. Pour ce qui est de générer pas de problème. C'est fait.

En revanche, je voudrait que l'utilisateur, puisse, via un bouton, rappeler l'USF avec ce qu'il a saisie de présent, puis régénérer avec ces modifications.

J'ai donc pensé à insérer un objet (Feuille Excel), dans une page du document Word pour y insérer les paramètres.

Par exemple, sur :
Private Sub OptionButton1_Change()
If Me.OptionButton1.Value = True Then
FameuseFeuilleExcel.Range("A1").Value = "True"  'FameuseFeuilleExcel étant l'objet Feuille Excel
Else
FameuseFeuilleExcel.Range("A1").Value = "False"
End If


puis au clic d'un bouton "Charger" par exemple ou à l'Evénement Initialize de l'USF :
Dim parametre As String

parametre = FameuseFeuilleExcel.Range("A1").Value

USF.OptionButton1.Value = parametre

EDIT : Juste après avoir cliqué envoyé je me suis dis que "Dim parametre As String" c'est bien pour les TextBox, TextArea, ListBox, ComboBox, mais pour les OptionButton ou CheckBox, je devrais initialiser un "Dim parametreBool as Boolean" lol

Le problème est que je sais pas comment écrire dans cette "FameuseFeuilleExcel" en VBA...

J'imagine que certains vont me dire de créer une vrai feuille Excel, je ne suis pas contre mais je ne sais pas non plus comment écrire dedans en VBA lol... De plus, s'il est possible de le faire sur l'objet Feuille Excel, pour des raisons de portabilité, c'est mieux, sinon, l'utilisateur, devra, s'il change l'emplacement de son fichier Word, changer aussi celui d'Excel....

Je vous remercie d'avance d'éclairer ma lanterne.

NB : Je précise, qu'au travail, nous sommes sous Windows XP + Pack Office 2003 pour certains, et Windows 7 + Pack Office 2010 pour les autres. Là je vous écris depuis mon ordi perso qui est un mac, ne faites donc pas attention la configuration que vous voyez juste en dessous.

10 réponses

  1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Bonjour,

    J'ai fait un programme où les paramètre sont sauvegardés dans un fichier texte:

    https://codes-sources.commentcamarche.net/source/53764-parametres-settings-vba

    Fonctionne sous Word et sous Excel
    0
    1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
       
      Bonjour,

      Intéressant, merci

      bye
      0
    2. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
       
      Re,

      merci
      0
  2. sifusalade Messages postés 142 Statut Membre 7
     
    Bonjour,

    Merci à tout les deux.
    Je pense que je vais m'assoir sur la tout-en-1-fichier.

    la méthode de f8944009 me semble bien. voici un test fais en 5 minutes avec :
    Sub ouvrirClasseurExcel()
    Dim appXl As Excel.Application
    Dim Wb As Excel.Workbook
    
    Set appXl = CreateObject("Excel.Application")
    appXl.Visible = False  'L'utilisateur ne doit pas voir ce qu'il se passe
    Set Wb = appXl.Workbooks.Add
    
    Wb.ActiveSheet.Range("A1").Value = UserForm1.TextBox1.Value
    Wb.ActiveSheet.Range("A2").Value = UserForm1.TextBox2.Value
    Wb.ActiveSheet.Range("A3").Value = UserForm1.TextBox3.Value
    'Bien sûr à la place je mettrai le code correspondant à tout mes contrôles
    
    
    Wb.Application.DisplayAlerts = False  'Comme tout doit être transparent pour l'utilisateur, on masque les alertes
    Wb.SaveAs "C:\Users\sifusalade\Desktop\TEST.xls"
    Wb.Application.DisplayAlerts = True 'Nul besoin de dire pourquoi je met ça lol
    appXl.Quit  'Transparence oblige lol
    
    End Sub


    La méthode CS_Le Pivert est très intéressante, elle a le mérite de manger moins de ressources qu'un fichier Excel (et c'est ce qui me plait le plus), cependant, je la trouve plus compliquée à utiliser (oui je sais je suis un peu bizarre comme mec lol), d'autant plus qu'un mec qui bidouille un peu, peut aller modifier certains paramètres, comme par exemple, le contenu d'un textbox limité à 2000 caractères, et en saisir 3000... Le but de cet Userform, et d'empêcher l'utilisateur de faire ce qu'il veut et de générer e document en bonne et due forme (certains collègues ont tendance à faire un peu trop ce qu'ils veulent sans se soucier s'ils sont en règle ou non).

    Je vais donc opter pour la méthode de f8944009 mais je tiens à souligner le travail remarquable de CS_Le Pivert. Bravo ;-)

    Reste plus qu'à tester (pas encore fait), si je peux initialiser l'userform avec les paramètres de ce classeur TEST.xls
    0
  3. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Si tu ne veux pas que l'on ait accès aux paramètres, tu peux te servir de la base de registre pour les sauvegarder. Car ton classeur comme un fichier texte est accessible. Pour la base de registre il faut être initié.

    Donc voici un exemple pour Word:

    Une Userform, un TextBox et 3 Button

    1 pour ecrire dans la base de registre le contenu du TextBox
    2 pour lire
    3 pour supprimer la sous-clé

    Option Explicit
    'ajouter une valeur
    Private Sub CommandButton1_Click()
    SaveSetting appname:="Monappli", Section:="TextBox1", _
                Key:="Valeur", setting:=TextBox1.Value
    SaveSetting "Monappli", "TextBox1", "Valeur", TextBox1.Value
    End Sub
    'supprimer valeur
    Private Sub CommandButton2_Click()
    DeleteSetting "Monappli", "TextBox1"
    End Sub
    'Lire valeur
    Private Sub CommandButton3_Click()
    TextBox1.Value = GetSetting(appname:="Monappli", Section:="TextBox1", _
                           Key:="Valeur")
    End Sub
    'chemin de la clé
    'HKEY_CURRENT_USER\Software\VB and VBA Program Settings\Monappli\TextBox1
    


    Si cela te convient, il te suffira de mettre les codes dans l'ouverture et la fermeture de ton userForm

    Bonne programmation
    0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Voici tout automatisé à l'ouverture et à la fermeture pour un TextBox et 2 Optionbutton:

    Option Explicit
    Dim etatoption As String
    Private Sub UserForm_Initialize()
    lecture
    If etatoption = "Vrai" Then
    OptionButton1.Value = True
    Else
    OptionButton2.Value = True
    End If
    End Sub
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
      ecriture
    End Sub
    Private Sub ecriture()
    'textBox
    SaveSetting appname:="Monappli", Section:="TextBox1", _
                Key:="Valeur", setting:=TextBox1.Value
    SaveSetting "Monappli", "TextBox1", "Valeur", TextBox1.Value
     'optionButton
     If OptionButton1.Value = True Then
    SaveSetting appname:="Monappli", Section:="OptionButton1", _
                Key:="etatoption", setting:="Vrai"
    SaveSetting "Monappli", "OptionButton1", "etatoption", "Vrai"
    Else
    SaveSetting appname:="Monappli", Section:="OptionButton1", _
                Key:="etatoption", setting:="Faux"
    SaveSetting "Monappli", "OptionButton1", "etatoption", "Faux"
    End If
    End Sub
    Private Sub lecture()
    'optionButton
    etatoption = GetSetting(appname:="Monappli", Section:="OptionButton1", _
                           Key:="etatoption")
     'textBox
    TextBox1.Value = GetSetting(appname:="Monappli", Section:="TextBox1", _
                           Key:="Valeur")
    End Sub


    Il ne te reste plus qu'à ajouter des contrôles!
    0
  6. sifusalade Messages postés 142 Statut Membre 7
     
    Merci pour ces réponses.

    Je connaissais effectivement le coup du SaveSetting & GetSetting. Mais je voulais éviter pour les raisons suivantes :

    - Manipuler le registre implique droits Admin, mais nous, on a des admins qui nous foutent des verrous partout de façon trop exagérée, si ça continu on aura même plus le droit de faire des copier coller au rythme où ça va lol

    - Les fichiers se trouvent sur un disque réseau, si Pierre veut ouvrir son fichier depuis l'ordinateur de Paul, je ne suis pas sûr que ça marche.

    - Vu le nombre de dossiers qui sera généré avec cet application, j'ai peur des conflits et d'une surcharge du registre. (Après j'avoue que j'ai tout à apprendre sur le sujet, donc je m'inquiète peut être pour rien).

    Il y a autre choses d'important que je n'ai pas précisé. Moi je crée et met en place le biniou, mais dans quelques mois, ce n'est pas moi qui assurera la maintenance du fichier (en cas d'éventuels problème ou mise à jour à faire), car je vais quitter ce service. La personne qui s'en chargera (celle qui m'a demandé de faire ça), n'a aucune connaissance en VBA et c'est tout juste s'il sait faire un copier/coller (j'exagère un peu quand même lol), de la façon donc je construit le truc, avec des explications, un code bien commenté, et une macro-vision du truc il comprendra. Mais il ne faut pas qu'il ai une tonne de choses à assimiler d'un coup lol...

    Merci encore.
    (je suis gêné, ça m'ennui que tu te sois décarcassé pour une solution que je ne peut pas prendre...Sorry)

    Je suis en train de bosser sur un mode avec enregistrement dans classeur excel (ça sera plus facile pour le collègue), je n'ai pas tout à fait fini et je dois partir, je continuerai demain et posterai ce que j'ai fait dans la foulé.
    0
  7. sifusalade Messages postés 142 Statut Membre 7
     
    Bonjour,

    Voici ce que j'ai fais et qui fonctionne (même si CS_Le Pivert a fait quelque chose de mieux).

    dans ThisDocument :
    Private Sub Document_Open()
    UserForm1.Show   'Pour afficher l'UserForm1 à l'ouverture du fichier
    End Sub
    


    Dans un module (nommé ici : Module1) :
    Sub ouvrirClasseurExcel()
    Dim appXl As Excel.Application
    Dim Wb As Excel.Workbook
    
    Set appXl = CreateObject("Excel.Application")
    appXl.Visible = False  'L'utilisateur ne doit pas voir ce qu'il se passe
    Set Wb = appXl.Workbooks.Add
    
    Wb.ActiveSheet.Range("A1").Value = UserForm1.TextBox1.Value
    Wb.ActiveSheet.Range("A2").Value = UserForm1.TextBox2.Value
    Wb.ActiveSheet.Range("A3").Value = UserForm1.TextBox3.Value
    Wb.ActiveSheet.Range("A4").Value = UserForm1.CheckBox1.Value
    'Bien sûr à la place je mettrai le code correspondant à tout mes contrôles,
    'Ici je fais mais tests depuis un nouveau fichier et USF de test
    
    
    Wb.Application.DisplayAlerts = False  'Comme tout doit être transparent pour l'utilisateur, on masque les alertes
    Wb.SaveAs "C:\Users\sifusalade\Desktop\" & UserForm1.TextBox1.Value & ".xls"  'Enregistrer fichier Excel sous le bureau avec comme nom de fichier le contenu de la TextBox1
    Wb.Application.DisplayAlerts = True 'Nul besoin de dire pourquoi je met ça lol
    appXl.Quit  'Transparence oblige lol
    ThisDocument.SaveAs "C:\Users\sifusalade\Desktop\" & UserForm1.TextBox1.Value & ".doc" 'Enregistrer fichier Word sous le bureau avec comme nom de fichier le contenu de la TextBox1
    End Sub
    


    Dans l'UserForm1 (nommé ici : UserForm1) (Que d'originalité dis donc !! lol)
    Private Sub CommandButton1_Click()
    Call Module1.ouvrirClasseurExcel
    End Sub
    
    Private Sub UserForm_Initialize()
    
    Dim appXl As Excel.Application
    Dim Wb As Excel.Workbook
    
    On Error GoTo arret
    
    Set appXl = CreateObject("Excel.Application")
    appXl.Visible = False  'L'utilisateur ne doit pas voir ce qu'il se passe
    
    Set Wb = appXl.Workbooks.Open(Mid(ThisDocument.Path & "\" & ThisDocument.Name, 1, Len(ThisDocument.Path & "\" & ThisDocument.Name) - 4) & ".xls")
    'on prend le chemin complet à partir du 1er caractère,
    'auquel on extrait l'extention en retirant 4 caractères (.doc) du chemin complet,
    'puis on rajoute la nouvelle extention
    
    Me.TextBox1.Value = Wb.ActiveSheet.Range("A1").Value
    Me.TextBox2.Value = Wb.ActiveSheet.Range("A2").Value
    Me.TextBox3.Value = Wb.ActiveSheet.Range("A3").Value
    Me.CheckBox1.Value = Wb.ActiveSheet.Range("A4").Value
    
    Wb.Application.DisplayAlerts = False  'Comme tout doit être transparent pour l'utilisateur, on masque les alertes
    Wb.Application.DisplayAlerts = True 'Nul besoin de dire pourquoi je met ça lol
    appXl.Quit  'Transparence oblige lol
    
    Exit Sub
    arret:
    MsgBox "L'application n'arrive pas à charger le fichier Excel contenant tout les éléments précédement saisis pour cette publicité." & Chr(10) & Chr(10) & "Le problème vient certainement du fait que le fichier ne se trouve pas à côté de votre document Word" & Chr(10) & Chr(10) & "Pour modifier votre publicité avec les remarques du pouvoir adjudicateur, fermez le présent fichier et ré-ouvrez le une fois que les deux fichiers seront côte à côte dans le dossier : D:/Publicité/" & Year(Date) & Chr(10) & "Sinon, ressaisissez votre publicité depuis le début" & Chr(10) & Chr(10) & "(En cliquant sur OK, les paramètres par défaut seront donc initialisés.)"
    End Sub
    


    Voilà !
    Cela implique que les fichiers Word & Excel soient côtes-à-côtes dans le même dossier. (là pour les tests, j'ai le bureau, mais dans la MsgBox d'erreur j'ai mis le disque D:/ car au final, le dossier prédéfini sera sur le D:/).

    Là j'ai commenté avec des moufles lol... Je pense que tout le monde comprends. Mais si ce n'était pas le cas, n'ésitez pas à me le demander ;-)

    Reste plus qu'à (je pense), mettre un mot de passe pour l'écriture du fichier Excel, au cas où on l'on voudrait modifier directement le fichier Excel pour placer nos 3000 caractères par exemple. Code qu'il faudra placer avant :
    Wb.SaveAs "C:\Users\sifusalade\Desktop\" & UserForm1.TextBox1.Value & ".xls"  'Enregistrer fichier Excel sous le bureau avec comme nom de fichier le contenu de la TextBox1

    de la procédure "ouvrirClasseurExcel".
    0
  8. sifusalade Messages postés 142 Statut Membre 7
     
    Pour protéger le fichier Excel en écriture il suffit donc de placer avant :
    Wb.SaveAs "C:\Users\sifusalade\Desktop\" & UserForm1.TextBox1.Value & ".xls"  'Enregistrer fichier Excel sous le bureau avec comme nom de fichier le contenu de la TextBox1

    de la procédure "ouvrirClasseurExcel", le code suivant :

    Wb.ActiveSheet.Protect "toto"  'toto étant le mot de passe pour ôter la protection


    Tout ceci fonctionne bien chez moi. J'imagine que je peux marquer le sujet comme étant résolu, mais avant, j'attends vos remarques. Il y a sûrement des choses à améliorer la dedans ;-)

    En attendant je tient à vous remercier mille fois.
    0
  9. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Bonjour,

    Joli code, pensez a ajouter la "deprotection" du fichier excel avant de mettre a jour les cellules dans ouvrirClasseurExcel() sinon excel pas d'accord
    0
    1. sifusalade Messages postés 142 Statut Membre 7
       
      Oups ! Juste un oubli... Bien vu !! Merci ;-)
      0
  10. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Je ne vois pas à quoi te sert le classeur Excel sur le Bureau. Le seul utile c'est celui qui est avec ton document Word .
    Donc voici un code plus compact qui fait la même chose:

    Option Explicit
    Private Sub UserForm_Initialize()
    lire
    End Sub
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    ecrire
    End Sub
    Sub ecrire()
    Dim appXl As Excel.Application
    Dim Wb As Excel.Workbook
    Set appXl = CreateObject("Excel.Application")
    appXl.Visible = False 'L'utilisateur ne doit pas voir ce qu'il se passe
    Set Wb = appXl.Workbooks.Open(ThisDocument.Path & "\essai.xls")
    Wb.ActiveSheet.Unprotect "toto"
    Wb.ActiveSheet.Range("A1").Value = UserForm1.TextBox1.Value
    Wb.ActiveSheet.Range("A2").Value = UserForm1.TextBox2.Value
    Wb.ActiveSheet.Range("A3").Value = UserForm1.TextBox3.Value
    Wb.ActiveSheet.Range("A4").Value = UserForm1.CheckBox1.Value 'Bien sûr à la place je mettrai le code correspondant à tout mes contrôles, 'Ici je fais mais tests depuis un nouveau fichier et USF de test
    Wb.ActiveSheet.Protect "toto"
    Wb.Application.DisplayAlerts = False 'Comme tout doit être transparent pour l'utilisateur, on masque les alertes
    Wb.SaveAs ThisDocument.Path & "\essai.xls"
    appXl.Quit
    End Sub
    Sub lire()
    Dim appXl As Excel.Application
    Dim Wb As Excel.Workbook
    Set appXl = CreateObject("Excel.Application")
    appXl.Visible = False 'L'utilisateur ne doit pas voir ce qu'il se passe
    Set Wb = appXl.Workbooks.Open(ThisDocument.Path & "\essai.xls")
    UserForm1.TextBox1.Value = Wb.ActiveSheet.Range("A1").Value
    UserForm1.TextBox2.Value = Wb.ActiveSheet.Range("A2").Value
    UserForm1.TextBox3.Value = Wb.ActiveSheet.Range("A3").Value
    UserForm1.CheckBox1.Value = Wb.ActiveSheet.Range("A4").Value
    Wb.Application.DisplayAlerts = False 'Comme tout doit être transparent pour l'utilisateur, on masque les alertes
    appXl.Quit
    End Sub


    Le fichier Excel se nomme essai
    0
    1. sifusalade Messages postés 142 Statut Membre 7
       
      Le fichier Excel du bureau, c'est pour les tests, pour faire les tests, je mets sur le bureau (étant donnée que sur mon ordi perso je n'ai pas de D:/). Je n'aurai plus qu'à remplacer au travail, l'adresse du bureau, par l'adresse du D:/ (en dur, car le modèle sera sur un disque S:/ donc pas Wb.SaveAs ThisDocument.Path & .... ).

      Ton code est super, il n'y a plus qu'à remplacer ce chemin et à remettre un enregistrement du document Word sur D:/ (portant pour nom, comme pour le fichier excel, la valeur de la TextBox1)

      Merci ;-)
      0
    2. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      Le code du chemin en dur n'est pas recommandé. Si tu l'installes sur plusieurs machines le chemin ne sera pas le même!

      Bonne programmation

      A la prochaine

      @+ Le Pivert
      0
    3. sifusalade Messages postés 142 Statut Membre 7
       
      Justement, on a tous un disque D:/, en codant en dur pour aller dans le D:/ je suis sûr que ça marche pour tout le monde et que c'est pout tout le monde pareil.

      En tout cas j'ai fais un test aujourd'hui au boulot avec quelques collègues. Et cela fonctionne. Merci beaucoup.
      Je crois que je peux marquer le sujet comme résolu.

      Merci encore.
      0