Technorati 標籤: VBA,變數聲明
今天又莫名其妙調過一處。
話說我聲明了一個annatree的動態數組。annatree類裡有個treeview類的成員變數。我想給這個動態數組中的其中一棵樹下加個節點,然後給這個節點的tag賦值。
- Dim objOhterSameATree() As AnnaTree
- Set objOhterNode = objOhterSameATree(i).tree.Nodes.Add(Relative:=m_tree.SelectedItem.Key, Relationship:=tvwChild, Text:=objNewNode.Text, Image:=2)
- objOtherNode.Tag = “”
像上面這樣寫,F8到最後一行的時候,就會報錯,“對象或with塊變數未設定”。而其實監看式視窗顯示objOtherNode是正常的,它的tag也能看到。可是一旦直接監視objOtherNode.Tag,就是,“對象或with塊變數未設定”。後來我改成這樣卻對了:
- Dim objOhterSameATree() As AnnaTree
- Dim treOtherSame As MSComctlLib.TreeView
- Set treOtherSame = objOhterSameATree(i).tree
- Set objOtherNode = treOtherSame.Nodes.Add(Relative:=m_tree.SelectedItem.Key, Relationship:=tvwChild, Text:=objNewNode.Text, Image:=2)
- objOtherNode.Tag = “”
只是,把數組裡的樹請出來,然後倒一下手就沒錯了。我在想,估計VB也有它的BUG,像我這種符合邏輯卻不符合常情的彆扭的超級用法,估計他們的測試員也想不到去測試,SO,我就只好自己吞下這苦果了……類似的,我還遇到一次。看下面:
- strParentKey = m_tree.Nodes.Item(objNode.Key).Parent.Key
運行到上面這行,會說對象或with塊變數未賦值;最後改成
- Set objRelatedNode = m_tree.Nodes.Item(objNode.Key)
- strParentKey = objRelatedNode.Parent.Key
就通過了。感覺也許是太長的引用引起了編譯的歧義。
小結:太長的引用最後藉助一個中間變數周轉一下,要不VBA可能會無法正常理解……