Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 可从用户窗体访问的全局字典对象_Vba_Excel_Excel 2013 - Fatal编程技术网

Vba 可从用户窗体访问的全局字典对象

Vba 可从用户窗体访问的全局字典对象,vba,excel,excel-2013,Vba,Excel,Excel 2013,我在常规模块中声明了一个公共全局字典对象,如下所示: Public dicModels As Scripting.Dictionary 'Microsoft Scripting Runtime has been added as a reference Public dicModels As New Scripting.Dictionary 我收到以下回电: Sub CreatePPT_OnAction(control As IRibbonControl) Call Current

我在常规模块中声明了一个公共全局字典对象,如下所示:

Public dicModels As Scripting.Dictionary  'Microsoft Scripting Runtime has been added as a reference
Public dicModels As New Scripting.Dictionary
我收到以下回电:

Sub CreatePPT_OnAction(control As IRibbonControl)
    Call CurrentBooks
    Dim frmPPT_Slide As FPowerPoint
    Set frmPPT_Slide = New FPowerPoint
    frmPPT_Slide.Show
    Set frmPPT_Slide = Nothing
End Sub
下面是调用过程的子程序:

Sub CurrentBooks()
    Dim wks As Excel.Worksheet
    Dim vObject As Variant

    If Not dicModels Is Nothing Then Exit Sub

    Set dicModels = New Dictionary
    For Each wks In ActiveWorkbook.Worksheets
        For Each vObject In wks.ListObjects
            If Left(vObject.Name, 3) = "TM_" Then
            dicModels.Add Key:=vObject.Name, Item:=Right(vObject.Name, Len(vObject.Name) - InStr(1, vObject.Name, "_"))
            End If
        Next vObject
    Next wks

End Sub
以下是Userform中的初始化事件(iCounter是声明为私有的模块级变量):

Private子用户表单_Initialize()
Me.Caption=“主跟踪模型”
Me.lblModel.Caption=“选择要反映在PPT幻灯片上的模型。”
对于iCounter=0到dicModels.Count'的情况,请按如下方式编写:

Public dicModels As Scripting.Dictionary  'Microsoft Scripting Runtime has been added as a reference
Public dicModels As New Scripting.Dictionary
这既声明了变量,又将其初始化为新的
字典


此初始化可以与声明一起完成。如果初始化更复杂,那么最好不要声明变量public,而是使用一个public函数返回变量的值,并在需要时执行任何初始化:

Dim m_dicModels As Scripting.Dictionary

Public Function dicModels() As Scripting.Dictionary
    If m_dicModels Is Nothing Then
        Set m_dicModels = New Scripting.Dictionary
        m_dicModels.CompareMode = TextCompare
    End If
    Set dicModels = m_dicModels
End Function

CurrentBooks
中,您正确地使用了
Set dicModels=New Dictionary
。问题中的代码应该有效,或者至少
dicModels
不应该是
Nothing
。可能是发生了一些我们在这里看不到的事情,这些事情决定了dic。要什么都不做
?还有一个问题:
UserForm\u Initialize
的代码属于
FPowerPoint
对吗?@dee是的,
UserForm\u Initialize
中的代码属于
FPowerPoint
。显然,有什么东西正在将dic对象设置为
Nothing
。否则,我的范围有问题。我会做更多的调试。谢谢你的解决方案,但我无法让它工作。初始化用户表单时,我无法访问
字典
对象的
计数
属性。字典不是
nothing
。因此,为什么我不能从userform initialize事件访问它的任何成员?