我定义了一个名为“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
注意:以上不是原始代码,因为原始代码是两个很长的粘贴。但我试图理解为什么关闭工作簿会对变量产生影响。变量是否可能以某种方式成为工作簿的“指针”?因此,当工作簿关闭时,变量中的实际数据也消失了?谢谢!
答案 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使用值而不是引用?谢谢!