Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Word > VBA Word
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/05/2007, 13h29   #1
Membre actif
 
Avatar de Yolak
 
Inscription : mars 2007
Messages : 333
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Vosges (Lorraine)

Informations forums :
Inscription : mars 2007
Messages : 333
Points : 180
Points : 180
Bonjour, pour ne pas polluer un post avec la balise "Résolu", je recréé un message!!

Premièrement, je vous invite à lire le post suivant où j'expose mon problème:

http://www.developpez.net/forums/sho...d.php?t=296621

Pour que vous puissiez mieux comprendre pourquoi je n'arrive pas à faire ce que je veux, voici la tête de mon code:

Code de ma UserForm(Avec un bouton OK):
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
Private Sub BoutonOK_Click()
 
 
    '#######DEBUT DE CODE EFFECTUANT UNE MANIP DANS EXCEL#####
	'Code qui permet de modifier le contenu de plusieurs cellules    
    '########## Fin du code de manip dans excel #########
 
 
    Dim WordApp As Word.Application
    Dim WordDoc As Word.Document
 
    Set WordApp = CreateObject("Word.Application")
    WordApp.Visible = True
    Set WordDoc = WordApp.Documents.Open _
    ("C:\Documents and Settings\QUALITE3\Bureau\Etiquettes\EtiquettesManuest.doc")
 
 
 
    '#################### CODE ############################
 
 
    Dim lngHandle As Long 'Manipulation de la bdr
    Dim sCheminCle As String 'Chemin dans la bdr de la clé à ouvrir et à fermer
    'Remarques:
    'Un handle est une valeur de type Long qui définit un objet de l'environnement Windows. _
    'Lorsque nous ouvrirons une clé, elle possèdera donc son propre handle qui est renvoyé par la fonction. _
    'Ce handle nous servira lors de la manipulation de cette clé.
    '-------------------------------------------------------------------------------------------------
 
    'Détermine le chemin de la clé dans la bdr en fonction de la version d'Office.
    If Application.Version = "11.0" Then
        sCheminCle = "SoftwareMicrosoftOffice11.0WordOptions"
    Else
        If Application.Version = "10.0" Then
            sCheminCle = "SoftwareMicrosoftOffice10.0WordOptions"
        End If
    End If
 
    'Désactive le message d'alerte : "L'ouverture de ce document exécutera la commande SQL suivante...." => Office 2002 et 2003
    'Ouvre la clé, affecte lui la donnée "SQLSecurityCheck" dont la valeur est = 0, ferme la clé
    If RegOpenKeyEx(HKEY_CURRENT_USER, sCheminCle, 0, KEY_ALL_ACCESS, lngHandle) = 0 Then
        If RegSetValueExLong(lngHandle, "SQLSecurityCheck", 0&, REG_DWORD, 0, 4) = 0 Then
            RegCloseKey (lngHandle)
        End If
    End If
 
        With WordDoc.MailMerge
            'Spécifie la fusion vers l'imprimante
            .Destination = wdSendToPrinter
            .SuppressBlankLines = True
                'Prend en compte l'ensemble des enregistrements
                With .DataSource
                    .FirstRecord = wdDefaultFirstRecord
                    .LastRecord = wdDefaultLastRecord
                End With
            'Exécute l'opération de publipostage
            .Execute Pause:=False
        End With
 
        Application.ScreenUpdating = True
 
        'Fermeture du document Word
        WordDoc.Close False
        WordApp.Quit
 
    'Ouvre la clé, supprime la valeur "SQLSecurityCheck" , ferme la clé (Retour à la normal)
    If RegOpenKeyEx(HKEY_CURRENT_USER, sCheminCle, 0, KEY_ALL_ACCESS, lngHandle) = 0 Then
        If RegDeleteValue(lngHandle, "SQLSecurityCheck") = 0 Then
            RegCloseKey (lngHandle)
        End If
    End If
 
End Sub
Code de mon module:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
'##### DECLARATION CONSTANTES ET API WINDOWS ######
'-------------------------------------------------------------------------------------------------
Public Const HKEY_CURRENT_USER = &H80000001
Public Const REG_DWORD As Long = 4
Public Const KEY_ALL_ACCESS = &HF003F
'-------------------------------------------------------------------------------------------------
'Fonction permettant d’ouvrir une clé existante de la base de registre
'hKey                     Long        Handle d'une clé déjà ouverte ou constante d'une clé principale.
'lpSubKey              String      Nom de la clé que vous souhaitez ouvrir.
'ulOptions              Long        Paramètre inutilisé: Vaut 0
'samDesired         Long        Droits que vous souhaitez utiliser pour cette clé.
'phkResult          Long        Cette variable prendra le Handle de la clé que vous venez d'ouvrir.
'Valeur renvoyée:   Long        Renvoi 0 (ERROR_SUCCESS)
'(si la fonction réussi.)
'-------------------------------------------------------------------------------------------------
Public Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" _
    (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
'-------------------------------------------------------------------------------------------------
'Fonction permettant de fermer une clé de la base de registre.
'hKey                Long        Handle de la clé que vous souhaitez fermer
'Valeur renvoyée:    Long        Renvoi 0 (ERROR_SUCCESS)
'(si la fonction réussi.)
Public Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long
'-------------------------------------------------------------------------------------------------
'Fonction permettant de déterminer les données d'une valeur.
'hKey           Long    Handle d'une clé déjà ouverte ou constante d'une clé principale.
'lpValueName    String  Nom de la valeur à modifier. Si cette valeur n'existe pas elle est alors créée.
'Reserved      Long    Paramètre inutilisé: Vaut 0
'dwType         Long    Constante définissant le type de valeur à créer ou modifier.
'lpValue         Long    Variable contenant les données de la valeur à créer ou modifier.
'cbData          Long    Vous devez ici mettre une variable qui contient le nombre de caractères que vous avez écrit + 1 (+ caractère de fin de chaîne)
'Valeur renvoyée:           Long    Renvoi 0 (ERROR_SUCCESS)
'(Si la fonction réussie.)
Declare Function RegSetValueExLong Lib "advapi32.dll" Alias "RegSetValueExA" _
    (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpValue As Long, ByVal cbData As Long) As Long
'-------------------------------------------------------------------------------------------------
'Fonction permettant de supprimer une valeur de la base de registre.
'hKey               Long        Handle d'une clé déjà ouverte ou constante d'une clé principale.
'lpValueName        String      Nom de la clé que vous souhaitez supprimer.
'Valeur renvoyée:   Long        Renvoi 0 (ERROR_SUCCESS)
'(Si la fonction réussie.)
Public Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" _
    (ByVal hKey As Long, ByVal lpValueName As String) As Long
'-------------------------------------------------------------------------------------------------
 
Sub ReferencePieceCyclée()
 
 
    MaUserForm.Show
End Sub
Et vous vous en doutez, ça ne marche pas!

L'erreur est la suivante:





Voilà, j'espère que vous pourrez m'aider!!

En fait, en ajoutant manuellement la clé nécessaire dans regedit, ça fonctionne mais il y a toujours une boîte de dialogue qui demande le chemin d'acces de la base de donnée... Il faudrait que je shunte également cette boîte de dialogue...

Ou alors que je demande à mon patron de remettre office 10.0 lol!!
Yolak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 18h37   #2
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Qu'as-tu si tu fais ça
Code :
MsgBox Application.ActivePrinter
?
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2007, 10h31   #3
Membre actif
 
Avatar de Yolak
 
Inscription : mars 2007
Messages : 333
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Vosges (Lorraine)

Informations forums :
Inscription : mars 2007
Messages : 333
Points : 180
Points : 180
Tout d'abord, merci de la réponse!

avec la messagebox ci dessus, il m'indique la bonne imprimante.

Mais c'est logique...Ce n'est pas ça qui ne fonctionne pas. C'est la fusion des documents. Lorsque j'ouvre word dans mon code, il faudrait que je lui indique que le classeur excel ouvert est la source de donnée.

Manuellement, lorsque j'ouvre le document word concerné, il me demande à l'ouverture si je veux selectionner une source données et il me demande le chemin d'accès.
Avec vba lorsqu'on ouvre ce document, la réponse à la boîte de dialogue est "non" par défaut. Le code ci dessus est censé forcer la valeur à "oui" mais la demande du chemin d'accès est toujours là... (Mais là, ça ne marche pas du tout du tout!!)
Ce que je voudrais, c'est que tout se fasse automatiquement:
à l'ouverture de word, pas de boîte de dialogue, le chemin d'accès de la source de donnée serait déjà paramétré, l'impression se ferait automatiquement.

Je ne suis pas sûr d'être suffisemment clair mais posez moi des questions (même vos questions peuvent m'aiguiller ^^)

Encore merci!
Yolak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2007, 13h35   #4
Membre actif
 
Avatar de Yolak
 
Inscription : mars 2007
Messages : 333
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Vosges (Lorraine)

Informations forums :
Inscription : mars 2007
Messages : 333
Points : 180
Points : 180
Bien, en me creusant la tête dans tout les sens, j'ai enfin fini par trouver une solution.

J'ai effacé tout le bout de code censé créer une clé temporaire dans le registre et j'ai créé une macro dans le document word de fusion

Code :
1
2
3
4
5
6
7
8
9
Private Sub Document_Open()
 
     ThisDocument.MailMerge.OpenDataSource _
     Name:="C:/MaSourceDeDonnee.tartampion", _  '*.doc,*.xls,...
        LinkToSource:=False, AddToRecentFiles:=False, _
        Connection:="TABLE Orders"   
 
 
End Sub
Le code s'execute à l'ouverture du document et indique le fichier (et son chemin d'accès) de la source de données. Pour les paramètres de la fonction opendatasource, j'ai pas trop utilisé mais visiblement, on peut faire pas de choses avec ^^
EDIT: J'ai placé le code dans ThisDocument (Microsoft Word Objets)

Enfin bref............. CA MARCHE !!!!!
Yolak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2007, 13h56   #5
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
C'est effectivement la solution que j'ai toujours adoptée... C'est bête, hein ?
Désolé mais quand je t'ai vu citer la FAQ sur la modif de la base de registre, je n'ai pas imaginé un instant que tu voulais simplement réaliser une fusion dans Word
La prochaine fois je poserai des questions
A+
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 09h29   #6
Membre actif
 
Avatar de Yolak
 
Inscription : mars 2007
Messages : 333
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Vosges (Lorraine)

Informations forums :
Inscription : mars 2007
Messages : 333
Points : 180
Points : 180
Arf oui dsl... Ma requête n'était pas très explicite ^^
M'enfin, merci quand même d'avoir un peu réfléchi pour mon problème!
Ce forum est vraiment génial, j'ai déjà résolu pas mal de choses grâce a vous!!
Merci!
Yolak est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h03.


 
 
 
 
Partenaires

Hébergement Web