关闭工作簿会破坏变量吗?

时间:2018-05-18 13:08:48

标签: vba excel-vba excel

我定义了一个名为“cSettings”的类。然后我创建了一个名为“info”的cSettings对象。 info对象有一个方法从用户选择的工作簿中读取数据,然后将它们存储在其成员变量中。成员变量是对象类型。更具体地说,“嵌套字典”类型。

我观察到的是 - 在关闭工作簿之前,info对象中的所有数据都很好。关闭工作簿后,访问其中一个成员变量时,我是“需要对象”的消息。因此,似乎关闭工作簿会以某种方式破坏部分数据。但是怎么样?这是我的代码:

' Class module cSettings

Option Explicit
Public obj1 As Object
Public obj2 As Object

' ----------

Public Sub ReadFrom(wb As Workbook)
    Set obj1 = CreateObject("Scripting.Dictionary")
    Set obj2 = CreateObject("Scripting.Dictionary")

    Set obj1 = Get1(wb, "sheet1")
    Set obj2 = Get2(wb, "sheet2")
End Sub

Private Function Get1(wb As Workbook, sh As String) As Dictionary
    Dim a_obj as object
    Set a_obj = CreateObject("Scripting.Dictionary")

    ' Read from workbook

    ' Add data to outer dictionary, creating inner dictionary
    a_obj.add "key1", CreateObject("Scripting.Dictionary")

    ' Add data to inner dictionary
    a_obj("key1").add "key11", "Value11"

    Set Get1 = a_obj
End Function

Private Function Get2(wb As Workbook, sh As String) As Dictionary
    Dim a_obj as object
    Set a_obj = CreateObject("Scripting.Dictionary")

    ' Read from workbook

    ' Add data to outer dictionary, creating inner dictionary
    a_obj.add "key2", CreateObject("Scripting.Dictionary")

    ' Add data to inner dictionary
    a_obj("key2").add "key21", "Value21"

    Set Get2 = a_obj
End Function

这是主程序:

Sub Main()
    Dim myFile As Variant
    Dim wb As Workbook
    Dim info As New cSettings

    myFile = Application.GetOpenFilename()
    Set wb = Workbooks.Open(myFile, False, True)

    info.ReadFrom wb

    Debug.Print info.Items("key1")("key11").count '<-- OK
    Debug.Print info.Items("key2")("key21").count '<-- OK

    wb.Close

    Debug.Print info.Items("key1")("key11").count '<-- OK
    Debug.Print info.Items("key2")("key21").count '<-- Error "Object Required"
End Sub

注意:以上不是原始代码,因为原始代码是两个很长的粘贴。但我试图理解为什么关闭工作簿会对变量产生影响。变量是否可能以某种方式成为工作簿的“指针”?因此,当工作簿关闭时,变量中的实际数据也消失了?谢谢!

2 个答案:

答案 0 :(得分:0)

您发布的代码未编译。通过一些修改使其运行,我无法重现错误:

Sub Main()
    Dim myFile As Variant
    Dim wb As Workbook
    Dim info As New cSettings

    myFile = Application.GetOpenFilename()
    Set wb = Workbooks.Open(myFile, False, True)

    info.ReadFrom wb

    Debug.Print info.obj1("key1")("key11") '<-- OK
    Debug.Print info.obj2("key2")("key21") '<-- OK

    wb.Close

    Debug.Print info.obj1("key1")("key11") '<-- OK
    Debug.Print info.obj2("key2")("key21") '<-- OK
End Sub

希望有所帮助。

答案 1 :(得分:0)

好的,我明白了。

在我的代码中,我使用dictionary.Add方法添加单元格的内容。原始代码类似于myDic.Add "key", ws.cells(r,c),其中ws指的是已打开工作簿的工作表。作为一个新手,我认为它需要单元格的值,只需在字典中添加key, value对。

实际上做的是添加指向该单元格的指针。当工作簿关闭时,当然该单元格将不再存在。因此字典的内容被破坏了。我更改了下面的代码,它按预期工作:

val = ws.cells(r,c)
myDic.Add "key", val

新手问题:我怎么告诉VB使用值而不是引用?谢谢!