簡體   English   中英

關閉工作簿會破壞變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM