2010-07-27 23 views
2

le titre peut ne pas être approprié parce que je ne sais pas vraiment comment je devrais mettre ceci. J'ai un template où j'ai un module "Module1" et un code "ThisDocument". Module1 contient le code suivant pour récupérer les valeurs du registre. Je prends ces valeurs du code ThisDocument.Word vba - Comment puis-je stocker des valeurs de chaîne dans un module?

Ce que je veux, c'est déplacer le code de ThisDocument vers son propre module. Et être capable d'accéder aux valeurs de tous les autres modules ou sous-marins.

En ce moment, ThisDocument a un code qui ressemble un peu à ceci:

regPath = ReadIni(File, "Registry", "Path") 
regString = ReadIni(File, "Registry", "String") 
regStrFirstname = ReadIni(File, "Fields", "Firstname") 
regStrLastname = ReadIni(File, "Fields", "Lastname") 
regStrInitials = ReadIni(File, "Fields", "Initials") 
regStrFullname = ReadIni(File, "Fields", "Fullname") 

Ainsi, au lieu d'avoir ce code dans ThisDocument, je voudrais avoir ce code dans un module distinct et d'être en mesure d'accéder les valeurs de ThisDocument directement. De cette façon, je peux prendre les valeurs de, disons un formulaire aussi. Remplir les zones de texte avec les valeurs, etc.

Comment est-ce que je devrais faire ceci?

Module1 ressemble à ceci:

Private Declare Function GetPrivateProfileSection Lib "kernel32" Alias _ 
"GetPrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpReturnedString As String, _ 
ByVal nSize As Long, ByVal lpFileName As String) As Long 

Private Declare Function GetPrivateProfileString Lib "kernel32" Alias _ 
"GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, _ 
ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, _ 
ByVal lpFileName As String) As Long 

Private Declare Function WritePrivateProfileSection Lib "kernel32" Alias _ 
"WritePrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpString As String, _ 
ByVal lpFileName As String) As Long 

Private Declare Function WritePrivateProfileString Lib "kernel32" Alias _ 
"WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, _ 
ByVal lpString As Any, ByVal lpFileName As String) As Long 

'// INI CONTROLLING PROCEDURES 
'reads an Ini string 
Public Function ReadIni(Filename As String, Section As String, Key As String) As String 
Dim RetVal As String * 255, v As Long 
v = GetPrivateProfileString(Section, Key, "", RetVal, 255, Filename) 
ReadIni = Left(RetVal, v + 0) 
End Function 

'reads an Ini section 
Public Function ReadIniSection(Filename As String, Section As String) As String 
Dim RetVal As String * 255, v As Long 
v = GetPrivateProfileSection(Section, RetVal, 255, Filename) 
ReadIniSection = Left(RetVal, v + 0) 
End Function 

Répondre

3

Faire les fonctions variables. Vous voulez essentiellement des variables globales accessibles partout. Le moyen de le faire est de capsuler les variables.

En Module1 (ou un nouveau module) ajouter:

Function regPath() 
     regPath = ReadIni(File, "Registry", "Path") 
End Function 

Hope it helps.

Si vous voulez être encore plus sophistiqué, vous pouvez travailler avec des objets.

+0

Donc, cela signifie que je dois déclarer une fonction pour chacune des valeurs de registre? regPath, regFirstName, regLastName etc? –

+0

Oui, une fonction pour chaque valeur de registre. – hol

+0

Est-il impossible de créer une fonction avec un paramètre? De cette façon, vous pourriez juste passer les variables de registre et de chemin en tant que paramètres à cette Funtion .... – froeschli

2

Tout d'abord, je vous recommande de vous débarrasser des appels API et il suffit d'utiliser les fonctions de registre intégrées dans VBA de GetSetting, SaveSetting, GetAllSettings et DeleteSetting. Vous pouvez en apprendre plus à leur sujet ici: Maintain Custom Settings Using the Windows Registry. L'un des avantages immédiats de cela, outre le fait que c'est facile, est que si vous finissez par utiliser Word 2010 x64, vous n'avez pas à gérer deux ensembles d'appels d'API, un pour x64 et un pour x86.

Maintenant à votre question. Cela dépend si votre code va s'exécuter dans un modèle global ou par lui-même. Si c'est dans un template global, vous utiliserez une sous-routine dans n'importe quel module (comme Module1) appelé AutoExec - vous pouvez mettre tout ce que vous voulez dans ce sous-programme, comme l'initialisation des variables globales. Si ce n'est pas un modèle global (c'est-à-dire que vous allez l'ouvrir parfois et que vous ne voulez pas qu'il s'ouvre toujours lorsque vous démarrez Word), vous utiliserez à la place AutoOpen. Tout code dans AutoOpen s'exécutera automatiquement (en supposant que vous avez géré les paramètres de sécurité) lorsque votre document à extension macro est ouvert.

Vous pourriez avoir quelque chose comme ça dans Module1:

''# Put this at the top of the module 
Public regPath As String 
Public regString As String 
Public regStrFirstname As String 
Public regStrLastname As String 
Public regStrInitials As String 
Public regStrFullname As String 

Sub AutoOpen() 
    ''# Use your current API calls to the registry or the VBA calls to the registry (above) 
    regPath = ReadIni(File, "Registry", "Path") 
    regString = ReadIni(File, "Registry", "String") 
    regStrFirstname = ReadIni(File, "Fields", "Firstname") 
    regStrLastname = ReadIni(File, "Fields", "Lastname") 
    regStrInitials = ReadIni(File, "Fields", "Initials") 
    regStrFullname = ReadIni(File, "Fields", "Fullname") 
End Sub 
+0

J'ai un fichier INI où les chemins de registre sont écrits. Ce code ReadIni lit ceci et le passe à un objShell.RegRead. Connaissez-vous objShell.RegRead? Est-ce ce que je devrais remplacer? En outre, en quoi est-il différent de AutoOpen que Document_New? Cela semble faire le travail jusqu'ici. AutoOpen() doit probablement être mis dans ThisDocument? Ca ne fera probablement rien si je le laisse dans un module? –

+0

@Kenny Bones: Le 'GetSetting' et d'autres fonctions peuvent être utilisées à la fois pour le registre Windows et/ou les fichiers INI, c'est l'une des grandes choses à leur sujet. Peut-être que j'ai parlé trop tôt sur ce sujet car votre vraie question portait sur la façon d'initialiser les variables globales à partir d'un module standard. 'AutoOpen()' est différent de 'Document_New() 'en ce sens qu'un nouveau document n'a pas besoin d'être ouvert pour le déclencher. Si le vôtre est un modèle, il se déclenchera lorsque ce modèle s'ouvrira. Il peut aller dans un module de n'importe quel nom (comme * Module3 *, par exemple), pas dans * ThisDocument *. –

+0

Mais y at-il des avantages à utiliser GetSetting pour les fichiers ini et le registre? Pourriez-vous fournir un code indiquant comment lire les fichiers ini? J'ai juste essayé d'ajouter un simple SubO AutoOpen privé() avec seulement une boîte de message dedans et l'ai placé dans Module1. ThisDocument() ne contient rien pour le moment. Mais cela ne déclenche pas et je ne vois pas de boîte de message. Seulement quand j'ouvre le modèle, pas quand je double clique sur le modèle (nouveau document) Ceci est Word 2007. Il a déjà été défini pour quelque 2000 utilisateurs et je n'ai aucunement l'intention de vraiment modifier ce paramètre. La zone du modèle a été ajoutée aux emplacements approuvés. –