Word VBA - Как я могу хранить строковые значения в модуле? - PullRequest
3 голосов
/ 27 июля 2010

название может быть неуместным, потому что я не знаю, как мне это выразить.У меня есть шаблон, где у меня есть модуль «Module1» и код «ThisDocument».Модуль 1 содержит следующий код для получения значений из реестра.Я выбираю эти значения из кода ThisDocument.

Я хочу переместить код из ThisDocument в его собственный модуль.И возможность получить доступ к значениям из всех других модулей или подпрограмм.

Прямо сейчас, ThisDocument имеет код, который выглядит примерно так:

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")

Итак, вместо того, чтобы иметь этот код в ThisDocument, я хотел бы иметь этот код в отдельном модуле ивозможность доступа к значениям из ThisDocument напрямую.Таким образом, я могу забрать значения, скажем, из формы.Заполните текстовые поля значениями и т. Д.

Как мне это сделать?

Module1 выглядит так:

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

Ответы [ 2 ]

3 голосов
/ 27 июля 2010

Сделать функции переменных.Вы в основном хотите, чтобы глобальные переменные были доступны везде.Способ сделать это состоит в том, чтобы капсулировать переменные.

В Module1 (или новом модуле) добавьте:

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

Надеюсь, это поможет.

Если вы хотите стать еще более изощренным, вы можете работать с объектами.

2 голосов
/ 27 июля 2010

Во-первых, я бы порекомендовал вам избавиться от вызовов API и просто использовать встроенные функции реестра в VBA GetSetting, SaveSetting, GetAllSettings и DeleteSetting. Подробнее о них вы можете узнать здесь: Ведение пользовательских настроек с использованием реестра Windows . Одним из непосредственных преимуществ этого, помимо того, что это легко, является то, что если вы в конечном итоге работаете с Word 2010 x64, вам не нужно поддерживать два набора вызовов API, один для x64 и один для x86.

Теперь к вашему вопросу. Это зависит от того, будет ли ваш код выполняться в глобальном шаблоне или сам по себе. Если это глобальный шаблон, вы можете использовать подпрограмму в любом модуле (например, Module1) с именем AutoExec - вы можете поместить в подпрограмму все, что захотите, например, инициализацию глобальных переменных. Если это не глобальный шаблон (т. Е. Вы просто собираетесь его иногда открывать и не хотите, чтобы он всегда открывался при запуске Word), то вместо этого вы должны использовать AutoOpen. Любой код в AutoOpen будет запускаться автоматически (при условии, что вы обработали параметры безопасности) при открытии документа с поддержкой макросов.

Так что вы можете получить что-то подобное в 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
...