PDA

Vollständige Version anzeigen : Array - Namen, der Länge nach absteigend sortieren


Woody
30.09.2009, 15:54
Hallo zusammen,

ich könnte Eure Hilfe bei einem Array Problem gebrauchen.

Folgender Code schreibt alle Namen einer Mappe untereinander in ein Blatt:

Sub NamenReihenfolgeLängeAbsteigend()
Dim nme As name
Dim i As Integer
i = 1
For Each nme In ActiveWorkbook.Names
Cells(i, 1).Value = nme.name
i = i + 1
Next
End Sub

Mir geht es eigentlich um das Ersetzen der Zeile:
For Each nme In ActiveWorkbook.Names

Statt das der Code nach und nach alle Namen abarbeitet, hätte ich gerne, dass der Code mit dem längsten Namen beginnt bis zu den kürzesten Namen. Sprich: statt mit der "For Each" Schleife zu arbeiten, möchte ich alle Namen in einen Array einlesen und dann der Länge absteigend sortieren und dann nacheinander die Namen im Array (als Schleife) abarbeiten lassen. Wie muss der Code hierfür aussehen? Arrays sind nicht so mein Ding.

In meinen eigentlichen Makro ersetze ich die Namen einer Mappe mit dem eigentlichen Zellenbezug, also z.B. "BMonat" durch "Tabelle1!A1". Das klappt auch alles soweit hätte ich nicht noch ähnliche Namen in der Mappe wie "Monat". Das führt derzeit dazu, dass obiger Fundname von "BMonat" beim Ersetzen des Namens "Monat" in "BTabelle1!A1" in der Formel umgewandelt wird, was zu Fehlern führt, da jenes Blatt nicht existiert. Ich denke die Lösung wäre hier mit den Ersetzen von den längsten Namen zu beginnen, denn dann kommt es nicht zu diesen Fehler, da "BMonat" vor "Monat" ersetztwerden würde in den Formeln.

Ich hoffe das war jetzt alles verständlich.

Schönen Gruß
Woody

chris-kaiser
30.09.2009, 16:11
Hallo Woody

versuche es mal so

Sub NamenReihenfolgeLängeAbsteigend()
Dim nme As Name, i As Long, y As Long, temp As String
Dim myarr() As String
Dim CountNames As Long
CountNames = ActiveWorkbook.Names.Count - 1
ReDim myarr(CountNames)
For Each nme In ActiveWorkbook.Names
myarr(i) = nme.Name
i = i + 1
Next
For i = 0 To CountNames - 1
For y = i + 1 To CountNames
If Len(myarr(i)) > Len(myarr(y)) Then
temp = myarr(i)
myarr(i) = myarr(y)
myarr(y) = temp
End If
Next
Next
For i = 0 To CountNames
Cells(i + 1, 1).Value = myarr(i)
Next
End Sub

Woody
30.09.2009, 16:30
Hallo Chris,

schön mal wieder was von dir zu lesen :-)

Mit Umkehrung des Zeichens > in <

If Len(myarr(i)) < Len(myarr(y)) Then

... klappt es wie gewünscht. Vielen Dank.

Nun muss ich das Ganze noch einbauen, was sich derzeit "holprig gestaltet".

Schönen Gruß
Woody

Woody
30.09.2009, 17:18
Hallo,

brauche noch einmal Hilfe.

Mit myarr(i) kann ich nun den Namensstring nutzen. Wie kann ich aber nun den entsprechenden Namen als Objekt ansteuern? (evtl. über eine andere "as name" Variable)

In der Schleife frage ich nämlich bisher mit nme.RefersTo (nme ist ja als name dimensioniert) den Zellenbezug ab.

sNew = nme.RefersTo
sNew = Right(sNew, Len(sNew) - 1) 'aus =Tabelle1!$A$1 wird Tabelle1!$A$1

Ich bekomme es gerade nicht hin mit der Stringinformation (die Namensbezeichnung) den entsprechenden Namen anzusteuern, um mir per .RefersTo die Information abzufragen.

Später gehe ich dann im Code durch die Formeln und ersetze den Namen in den Formeln mit dieser Information(=Zellenbezug)

Danke schon mal.

Schönen Gruß
Woody

chris-kaiser
30.09.2009, 19:49
Hallo Woody

Übrigens nett mal was von Dir zu lesen :)

Sub NamenReihenfolgeLängeAbsteigend()
Dim nme As Name, i As Long, y As Long, temp As String
Dim myarr() As String, rng As Range
Dim CountNames As Long
CountNames = ActiveWorkbook.Names.Count - 1
ReDim myarr(CountNames)
For Each nme In ActiveWorkbook.Names
myarr(i) = nme.Name
i = i + 1
Next
For i = 0 To CountNames - 1
For y = i + 1 To CountNames
If Len(myarr(i)) < Len(myarr(y)) Then
temp = myarr(i)
myarr(i) = myarr(y)
myarr(y) = temp
End If
Next
Next
For i = 0 To CountNames
For Each rng In ActiveSheet.UsedRange.Cells
If rng.HasFormula Then
If InStr(rng.Formula, Names(myarr(i)).Name) > 0 Then
temp = Names(myarr(i)).RefersTo
temp = Right(temp, Len(temp) - 1)
rng.Replace Names(myarr(i)).Name, temp
End If
End If
Next
Names(myarr(i)).Delete
Next
End Sub

Woody
02.10.2009, 13:41
Hallo Chris,

kurze Rückmeldung - es klappt! Super!

Ich plage mich im Moment noch mit Dingen herum, das der Name "Monat" auch in der Formel bei ...[MonatsberichtSept09.xls] umgewandelt wird, was mir die Verknüpfung zerstört. Ich muss also noch die ein oder andere Ausnahmeregel berücksichtigen.

Schönen Gruß
Woody