excel 在.xlam和.xlsm文件之间传递公共变量

yizd12fk  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(148)

我正在Ribbon *.xlam(file 1)中运行一个查找函数,该函数打开一个包含所有项目宏的远程 *.xlsm文件(file 2),然后在远程数据库(file 3)上运行查找代码。
File 2创建了一个变量“Confirm”字符串,当显示为Msgbox时效果很好-但msgbox是模态的,会停止代码。这意味着当file 2保持打开时,其他用户将无法对file 3进行写访问。
为了解决这个问题,我在file 1上创建了一个Userform来模仿file 2中的msgbox。一切正常,file 2和3按预期打开和关闭,但file 2的变量“Confirm”没有传递到file 1的Userform标签。
压缩代码如下。任何帮助是非常感谢!
File 1 *.xlam代码:

Public Confirm As String

个字符
File 2只是简单地创建字符串,我可以证明它与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

的字符串
然后回到File 1,Userform代码:

Option Explicit

Private Sub UserForm_Initialize()

    Label1.Caption = Confirm
    
End Sub

Private Sub CommandButton01_Click()

    Unload ViewSub_Details

End Sub

41ik7eoe

41ik7eoe1#

你不能直接从不同的工作簿中读取一个变量,而不引用相应的工作簿,并且工作簿中没有相同的变量。但是你可以不引用工作簿,即使讨论中的变量被声明为Private,调用一个Public函数返回相应的变量:
1.在需要读取变量的工作簿的一个标准模块中,复制下一段代码:

Option Explicit

Private myVar As String 'the variable to be returned in another workbook...

Sub GiveMyVarValue()
   myVar = "test variable"
End Sub

Public Function GetMyvar() As String 'PUBLIC function!
   GetMyvar = myVar
End Function

字符串
然后运行GiveMyVarValue,为相应的变量给予一个值(当然,您可以使用现有的过程/变量,但要注意将其作为GetMyvar函数的返回值。
1.使用活动工作簿中的下一个代码,从其他工作簿中读取变量:

Sub ReadVariableFromDifferentWB()
  Dim wb As Workbook: Set wb = Workbooks("Personal.xlsb") 'use here the real workbook name where from you need to return the variable
  Dim x As String
  
  x = Application.Run("'" & wb.name & "'!GetMyVar")
  MsgBox x
End Sub


请在测试上述建议的解决方案后发送一些反馈,我在需要时使用了很多次。

cyej8jka

cyej8jka2#

您不能访问项目外部的变量(项目基本上是您的Excel文件)。您的confirm变量是不同的变量,file1不能访问file2的confirm。关键字public意味着该变量在file2的整个项目中是全局的(因此file2的所有模块都可以访问它),但对任何其他运行的JavaScript代码都不是公共的。
但是,您可以做的是提供confirm字符串作为函数的结果:

Public Function GetConfirmString
    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
    GetConfirmString = Confirm
End Function

字符串
你可以使用Application.Run调用这个函数:

Private Sub UserForm_Initialize()
    Label1.Caption = Application.Run ("'Macros.xlsm'!GetConfirmString")
End Sub

aamkag61

aamkag613#

这些引用来自Excel帮助文件
使用Public语句声明的Public变量对所有应用程序中所有模块中的所有过程可见,除非Option Private Module生效。在这种情况下,变量仅在其所在的项目中是公共的。
referenced project从正在处理的当前项目中直接创建链接的项目。由当前项目的直接引用项目之一引用的项目称为间接引用项目。当前项目无法访问其公共变量,除非通过其项目名称进行限定。项目之间的直接和间接引用的任何组合都是有效的,只要它们不导致一个完整的循环。
referencing project当前项目。创建项目链接的方式取决于宿主应用程序。例如,要直接引用Microsoft Excel中的项目,请从工具菜单的引用对话框中选择项目。直接引用项目中的公共变量对直接引用项目可见,但直接引用项目中的公共变量对直接引用的项目不可见。
定义公共模块级作用域如果将模块级变量声明为public,则该变量可用于项目中的所有过程。
strMsg
可以由项目中任何模块中的任何过程使用。
包括在模块的声明部分中。
公共strMsg作为字符串
默认情况下,除事件过程外,所有过程都是公共的。当Visual Basic创建事件过程时,Private关键字将自动插入到过程声明之前。对于所有其他过程,如果不希望过程是公共的,则必须使用Private关键字显式声明该过程。
您可以从引用项目中使用标准模块或类模块中定义的公共过程、变量和常量。但是,您必须首先设置对定义它们的项目的引用
在标准或类模块(如表单模块或报表模块)之外的其他模块中定义的公共过程、变量和常量对于引用项目来说是不可用的,因为这些模块对于它们所在的项目来说是私有的。

相关问题