noch ein Versuch
04.08.2014 11:34:32
Erich G.
Hi,
da ich vermute, dass mein Dictionary-Vorschlag durchaus praktisch bei deiner derzeitigen Aufgabe wäre,
habe ich mal Thorstens und meinen Code analog zusammengestellt:
Sub sbNames() ' von Thorsten
Dim lnaNames As Name, larArr(), liIdx As Integer, lstrMsg As String
' On Error Resume Next nicht nötig, möglichst vermeiden
For Each lnaNames In ActiveWorkbook.Names
With lnaNames
' Hier sollte geprüft werden, ob ein Bezug zu einer
' einzelnen existierenden Zelle besteht:
If InStr(.RefersTo, ":") + InStr(.RefersTo, "#") = 0 Then
ReDim Preserve larArr(2, liIdx)
larArr(0, liIdx) = .Index
larArr(1, liIdx) = .Name
'Ein Name ohne Bezug erzeugte hier einen Fehler:
larArr(2, liIdx) = .RefersToRange.Text
liIdx = liIdx + 1
End If
End With
Next
For liIdx = 0 To UBound(larArr, 2)
lstrMsg = "Index: " & larArr(0, liIdx) & vbCrLf
lstrMsg = lstrMsg & "Zellname: " & larArr(1, liIdx) & vbCrLf
lstrMsg = lstrMsg & "Zellwert: " & larArr(2, liIdx)
Sheets(3).Cells(liIdx + 1, 2) = lstrMsg
Next
End Sub
Sub sbNames2() ' von Erich
Dim oDic As Object, oNam As Name, ii As Long, arrNamen
Set oDic = CreateObject("Scripting.Dictionary")
' Sammeln von Namen und Werten in oDic
For Each oNam In ActiveWorkbook.Names
With oNam
If InStr(.RefersTo, ":") + InStr(.RefersTo, "#") = 0 Then _
oDic.Add .Name, .RefersToRange
End With
Next
' Ausgabe in 2 Spalten in Blatt 3
arrNamen = oDic.Keys ' Namen aller Namen
For ii = 0 To UBound(arrNamen)
Sheets(3).Cells(ii + 1, 4) = arrNamen(ii) ' Name des Namens
Sheets(3).Cells(ii + 1, 5) = oDic(arrNamen(ii)) ' Wert der benamten Zelle
Next ii
End Sub
Da kannst du die beiden leichter miteinander vergleichen.
Zu deiner Frage bzgl. "Object" versus "Name":
Wenn du deklarierst
Dim myNam as Name
dann sagst du VBA damit, dass myNam ein Name sein soll.
Damit ist auch bekannt, welche Eigenschaften und Methoden zu myNam gehören,
z. B. die Eigenschaft "RefersTo".
Wenn du schreibst
Dim myNam as Object
ist das nicht falsch. Jeder Name ist auch ein Objekt. Aber VBA weiß nicht, zu welcher Art/Klasse/Typ myNam gehört.
myNam kann z. B. auch ein Workbook oder eine Pivottable sein.
Über Eigenschaften und Methoden weiß man hier nichts.
Je genauer man deklarieren kann, umso besser. Such mal nach "IntelliSense".
Wenn du in de angehängten Mappe in der Prozedur aTest unter dem Dim tippst:
xxxx.
dann dut sich nichts, wenn du aber
yyyy.
tippst, wird dir alles angeboten, was zu dem Namen yyyy passt.
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich