Vba word fusion => supprimer le message d'alerte "l'ouverture de ce document exécutera la commande sql suivante...." sous of

Soyez le premier à donner votre avis sur cette source.

Snippet vu 28 903 fois - Téléchargée 27 fois

Contenu du snippet

Bonjour :?)))

Voici le résultat de plusieurs recherches destinées à supprimer l'apparition intempestive d'une alerte à l'ouverture d'un modèle auquel était lié un fichier de donnée·
Cette alerte est la suivante :

"L'ouverture de ce document exécutera la commande SQL suivante :"
"SELECT * FROM C:\?\donnée.txt."
"Des données provenant de votre base de données seront insérées dans le document?Voulez?vous continuer ? "

Cette alerte apparaît sous Office 2002 Pack3 et Office 2003. Pour la désactiver, impossible de faire un displayalert lors de l'ouverture du modèle car la valeur par défaut du message est NON.
Donc, il faut faire appel aux API de windows, et modifier la base de registre (comme l'indique Microsoft : http://support.microsoft.com/?scid=kb;fr;825765
).

Voici le code commentée que j'ai retenue pour désactiver la sécurité au début de la macro et la réactiver à la fin.

Source / Exemple :


'#####################################################
'##### 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.)

Public 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

'-------------------------------------------------------------------------------------------------

'#####################################################
'#################### 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 = "Software\Microsoft\Office\11.0\Word\Options"
Else
    If Application.Version = "10.0" Then
        sCheminCle = "Software\Microsoft\Office\10.0\Word\Options"
    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)
    Else
        Call MsgBox("L'écriture de la valeur SQLSecurityCheck a échoué" & Chr(10) & _
                     "Merci de contacter le service technique", vbCritical)
        RegCloseKey (lngHandle)
    End If
Else
    Call MsgBox("L'ouverure de la clé Options a échoué" & Chr(10) & _
                "Merci de contacter le service technique", vbCritical)
End If

'-------------------------------------------------------------------------------------------------

Code de la macro (Ouverture du modèle auquel est attaché une source de donnée, fusion)

'-------------------------------------------------------------------------------------------------

'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)
    Else
        Call MsgBox("La suppression de la valeur SQLSecurityCheck a échoué" & Chr(10) & _
                     "Merci de contacter le service technique", vbCritical)
        RegCloseKey (lngHandle)
    End If
Else
    Call MsgBox("L'ouverure de la clé Options a échoué" & Chr(10) & _
                "Merci de contacter le service technique", vbCritical)
End If

'-------------------------------------------------------------------------------------------------

Conclusion :


Merci à Anacoluthe pour mes premiers pas dans VBA et à la très utile page de Thomas HAMOU sur la manipulation de la base de registre grâce aux API Windows (http://www.supinfo-projects.com/fr/2004/api%5Fbasederegistre%5F%5Fvb%5Ffr/1/)

Soyez indulgent avec moi, je n'ai que 3 mois de programmation derrière moi.

Christophe

A voir également

Ajouter un commentaire

Commentaires

Messages postés
2
Date d'inscription
lundi 30 juillet 2007
Statut
Membre
Dernière intervention
23 octobre 2009

Merci pour ce source qui m'enlève une grosse épine du pied.
En effet, je faisais en VB6 une fusion publipostage sous word depuis un fichier Excel.
Cela fonctionnait très bien jusqu'à ce qu'on ait Word 2003 et ce message incontournable !!
Messages postés
58
Date d'inscription
mercredi 2 novembre 2005
Statut
Membre
Dernière intervention
22 juillet 2010

Juste au cas où, je me demandais si quelqu'un saurait s'il est possible de modifier un paramètre de Word ou une option pour qu'il n'y ait pas besoin de toucher à la base de registre.
Pour le moment, toutes les recherches que j'ai effectué m'ont ramené là-dessus.
Merci par avance
Messages postés
3
Date d'inscription
lundi 13 février 2006
Statut
Membre
Dernière intervention
15 mars 2006

Bonjour,

Je viens d'utiliser votre code dans ma Macro, j'ai d'ailleurs été très heureuse de le trouver, mais lors de la compilation j'ai le message d'erreur suivant :
Erreur de compilation:
Seuls les commentaires peuvent apparaitre après End Sub, End Fonction, ou End Property

Voici ma macro sans votre code :
Sub fusionner()
'Début de la macro.

docname = ActiveDocument.Name
With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.MailAsAttachment = False
.MailAddressFieldName = ""
.MailSubject = ""
.SuppressBlankLines = True
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Execute Pause:=True
End With
' fermeture
Documents(docname).Close SaveChanges:=wdDoNotSaveChanges

'Fin de la macro.
End Sub

J'ai insérer votre code avant et après les commentaires "Debut de la macro" et "Fin de la macro"
J'ai essayer d'ajouter le code morceau par morceau, mais j'obtiens d'autres erreurs.
J'ai cherché sur internet ce message d'erreur mais je n'obtiens rien de bien concluant.
Je n'ai jamais developpé en VB (si si !!), c'est pourquoi je vous demande de l'aide, car celle de Microsoft ne m'a pas aidé du tout.

Merci.
Messages postés
5
Date d'inscription
vendredi 23 janvier 2004
Statut
Membre
Dernière intervention
15 janvier 2008

Merci Christophe pour avoir mentionné mon nom pour ta documentation :)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
21
Désolé mais pas encore parfait (he oui...).
RegCloseKey est à appeler si tu réussis RegOpenKeyEx et non si tu réussis le RegDeleteValue, faut donc changer de place le RegCloseKey.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.