我正在从功能区 *.xlam (file1) 运行查找功能,该功能打开一个包含所有项目宏 (file2) 的远程 *.xlsm 文件,该文件又在远程数据库 (file3) 上运行查找代码。
File2 创建一个变量“Confirm”字符串,当显示为 Msgbox 时效果很好 - 但 msgbox 是模态的并会停止代码。这意味着当 file2 保持打开状态时,其他用户将无法对 file3 进行写访问。
为了解决这个问题,我在 file1 上创建了一个用户表单来模仿 file2 中的 msgbox。 一切正常,文件 2 和 3 按预期打开和关闭,但文件 2 的变量“确认”未传递到文件 1 的用户表单标签。
下面是精简代码。 非常感谢任何帮助!
文件1 *.xlam 代码:
Public Confirm As String
Sub ViewSUB(control As IRibbonControl)
Dim Sub_Macros As String, strFileExistsA As String, strFileExistsB As String
Dim currentWorkbook As Workbook
strFileExistsA = Dir(Sub_Macros_L)
strFileExistsB = Dir(Sub_Macros_R)
If strFileExistsA <> "" Then
Sub_Macros = Sub_Macros_L
ElseIf strFileExistsB <> "" Then
Sub_Macros = Sub_Macros_R
Else
MsgBox "Macro File is missing", vbCritical, "Macro File Missing"
Exit Sub
End If
Application.ScreenUpdating = False
Application.Calculation = xlManual
Set currentWorkbook = Application.ActiveWorkbook
Workbooks.Open Sub_Macros, ReadOnly:=True
currentWorkbook.Activate
Application.Run ("'Macros.xlsm'!ViewSUB")
ViewSub_Details.Show vbModeless
Workbooks("Macros.xlsm").Close SaveChanges:=False
Application.Calculation = xlAutomatic
Application.ScreenUpdating = True
End Sub
File2 只是创建字符串,我可以证明它可以与 msgbox 一起使用。 这只是该代码的一部分:
Public Confirm As String
For i = 3 To LastrowDBase
If DBase.Cells(i, 2) = SUBPN And DBase.Cells(i, 5) = "SomeText" Then
Confirm = Confirm & " - " & DBase.Cells(i, 3) & " - Flag: " & DBase.Cells(i, 7) & " - " & DBase.Cells(i, 6) & vbCrLf
End If
Next i
MsgBox Confirm
然后回到 File1 用户表单代码:
Option Explicit
Private Sub UserForm_Initialize()
Label1.Caption = Confirm
End Sub
Private Sub CommandButton01_Click()
Unload ViewSub_Details
End Sub
这些引述来自 Excel 帮助文件
公共 使用 Public 语句声明的变量对于所有应用程序中所有模块中的所有过程都是可见的,除非 Option Private Module 有效。在这种情况下,变量仅在它们所在的项目内是公共的。
参考项目 您直接从当前正在处理的项目创建链接的项目。被当前项目的直接引用项目之一引用的项目称为间接引用项目。当前项目无法访问其公共变量,除非通过其项目名称进行限定。项目之间直接和间接引用的任何组合都是有效的,只要它们不会形成完整的周期。
参考项目 目前的项目。如何创建项目链接取决于主机应用程序。例如,要直接引用 Microsoft Excel 中的项目,请从 Tools 菜单的 References 对话框中选择该项目。直接引用项目中的公共变量对直接引用项目可见,但直接引用项目中的公共变量对直接引用项目不可见。
定义公共模块级范围 如果将模块级变量声明为公共变量,则该变量可供项目中的所有过程使用。在下面的示例中,字符串变量
strMsg
可以被项目中任何模块中的任何过程使用。
包含在模块的声明部分。
公共 strMsg 作为字符串
默认情况下,除事件过程外,所有过程都是公共的。当 Visual Basic 创建事件过程时,Private 关键字会自动插入到过程声明之前。对于所有其他过程,如果您不希望其公开,则必须使用 Private 关键字显式声明该过程。
您可以通过引用项目使用标准模块或类模块中定义的公共过程、变量和常量。但是,您必须首先设置对定义它们的项目的引用。
在标准或类模块之外定义的公共过程、变量和常量,例如 form 模块或报告模块,对于引用项目来说不可用,因为这些模块对于它们所在的项目来说是私有的。