[英]Closing workbook destroys variable?
我定義了一個名為“ cSettings”的類。 然后,我創建了一個名為“ info”的cSettings對象。 信息對象具有從用戶選擇的工作簿中讀取數據,然后將其存儲在其成員變量中的方法。 成員變量是對象類型。 更具體地說,是“嵌套詞典”類型。
我觀察到的是-在關閉工作簿之前,信息對象中的所有數據都很好。 關閉工作簿后,訪問成員變量之一時出現“對象必需”消息。 因此,似乎關閉工作簿已以某種方式破壞了部分數據。 但是如何? 這是我的代碼:
' 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
注意:以上不是原始代碼,因為原始代碼要粘貼兩個很長的時間。 但是我試圖理解為什么關閉工作簿會對變量產生影響。 變量是否可能以某種方式成為工作簿的“指針”? 因此,當關閉工作簿時,變量中的實際數據也消失了嗎? 謝謝!
您發布的代碼無法編譯。 經過一些修改才能運行,我無法重現錯誤:
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
希望能有所幫助。
好,我知道了。
在我的代碼中,我使用dictionary.Add
方法添加單元格的內容。 原始代碼就像myDic.Add "key", ws.cells(r,c)
,其中ws
指的是打開的工作簿的工作表。 作為一個新手,我認為它將采用單元格的值,並只需向字典中添加key, value
對即可。
它實際上所做的是添加指向該單元格的指針。 當工作簿關閉時,該單元格當然將不再存在。 因此,詞典的內容已損壞。 我更改了代碼,如下所示,並且按預期方式工作:
val = ws.cells(r,c)
myDic.Add "key", val
新手問題:如何告訴VB使用值而不是引用? 謝謝!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.