Word vba - 如何在模块中存储字符串值?

时间:2010-07-27 07:44:46

标签: vba ms-word word-vba

标题可能不合适,因为我真的不知道应该怎么做。 我有一个模板,其中有一个“Module1”模块和一个“ThisDocument”代码。 Module1包含以下代码以从注册表中获取值。 我从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 个答案:

答案 0 :(得分:3)

使变量起作用。您基本上希望全局变量可以访问。这样做的方法是封装变量。

在Module1(或新模块)中添加:

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

希望它有所帮助。

如果您想要更复杂,可以使用对象。

答案 1 :(得分:2)

首先,我建议你摆脱API调用,只使用GetSettingSaveSettingGetAllSettings和{{1}的VBA中的内置注册表功能}。您可以在此处了解有关它们的更多信息:Maintain Custom Settings Using the Windows Registry。除了事实很简单之外,这样做的一个直接好处是,如果您最终使用Word 2010 x64,则不必维护两组API调用,一组用于x64,另一组用于x86。 / p>

现在回答你的问题。这取决于您的代码是在全局模板中运行还是单独运行。如果它在一个全局模板中,你将在名为DeleteSetting的任何模块(如Module1)中使用子例程 - 你可以在该子例程中放置任何你想要的东西,比如启动全局变量。如果它不是一个全局模板(即你只是打算打开它,并且不希望它在你启动Word时总是打开),那么你将使用AutoExec代替。启用启用宏的文档时,AutoOpen中的任何代码都将自动运行(假设您已处理过安全设置)。

所以你可以在Module1中找到类似的东西:

AutoOpen