问题
I am getting some unexpected results from typename and am stumped. Hopefully some can point me in the right direction.
Private Sub T()
Dim d As Word.Document
Dim s As String
Dim c As Collection
Dim i As Long
Dim o As Object
Set d = ActiveDocument
s = "X"
Set c = New Collection
Debug.Print "d is a " & TypeName(d)
Debug.Print "s is a " & TypeName(s)
Debug.Print "c is a " & TypeName(c)
c.Add (d)
c.Add (s)
For i = 1 To c.count
Debug.Print "Item " & i & " of the collection is a " & " " & TypeName(c.Item(i))
Next i
End Sub
From which I get the following output:
d is a Document
s is a String
c is a Collection
Item 1 of the collection is a String
Item 2 of the collection is a String
What I expected to get was:
d is a Document
s is a String
c is a Collection
Item 1 of the collection is a Document
Item 2 of the collection is a String
Any ideas why I get "String" instead of "Document" for the first item in the collection?
回答1:
c.Add (d)
is not the same as
c.Add d
In the first, by wrapping d
in parentheses you're causing it to be evaluated as an expression and the result of that expression (in this case a String) gets added to the collection. In the second, the d
object itself is added.
Try comparing directly in the Immediate window:
? TypeName(ActiveDocument) '>> Document
and
? TypeName( (ActiveDocument) ) '>> String
来源:https://stackoverflow.com/questions/22186853/unexpected-results-from-typename