Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1904to1908
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Range aus einer Collection

Range aus einer Collection
02.11.2022 09:11:33
Günther
Hallo
hier ein Makro, das wegen einer Fehlermeldung nicht läuft, inklusive Weg herum (work around), der funktioniert. Doch ich verstehe nicht, warum der direkte Weg nicht geht.
Es geht um die Rückgabe eines Ranges aus einer Collection.
Vielleicht gibt es da ein Prinzip oder eine Regel, die ich übersehen habe.

Sub Test()
Dim Sammlung As New Collection
Dim Bilder As New Collection
Bilder.Add Range("A2:A5"), "Titel"
Sammlung.Add Bilder, "Landschaften"
Dim AdrTemp As Range
Set AdrTemp = Sammlung("Landschaften")("Titel")
'Funktioniert:
Debug.Print Sammlung("Landschaften")("Titel").Address   'Druckt: "$A$2:$A$5"
Debug.Print AdresseErmitteln(AdrTemp)                   'Druckt: "$A$2:$A$5"
'Liefert Fehlermeldung: "Argumenttyp ByRef unverträglich"
Debug.Print AdresseErmitteln(Sammlung("Landschaften")("Titel"))
End Sub
Function AdresseErmitteln(Bereich As Range) As String
AdresseErmitteln = Bereich.Address
End Function
Kann man die Fehlerzeile so umgestalten, dass es funktioniert, aber ohne Zwischenspeichern?
LG, Günther

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Range aus einer Collection
02.11.2022 09:32:18
Oberschlumpf
Hi Günther,
nur 1 Idee:
anstelle von...

Function AdresseErmitteln(Bereich As Range)
...versuch mal...

Function AdresseErmitteln(ByVal Bereich As Range)
...wenn das auch nich hilft, weiß ich nix weiter.
Ciao
Thorsten
AW: Range aus einer Collection
02.11.2022 09:32:53
MCO
Moin, Günther!
Deine Funktion erwartet ein RANGE-Object.
Mit "Set AdrTemp = " weist du das zu, deshalb läuft das dann.
Wie du aber mit Debug.print schon festgestellt hast, wird über "Sammlung("Landschaften")("Titel")" nur ein String mit der Adresse ausgegeben, kein Range.
Daher muss der korrekte Aufruf lauten

Debug.Print AdresseErmitteln(Range(Sammlung("Landschaften")("Titel").Address))
Gruß, MCO
Anzeige
AW: Range aus einer Collection
02.11.2022 11:14:58
snb
Die Function scheint mir 100% überflüssig.
Die Sammlung Collection scheint mir 100% überflüssig

Sub M_snb()
Dim Bilder As New Collection
Bilder.Add Range("A2:A5"), "Titel"
Debug.Print Bilder("Titel").Address
Debug.Print Bilder(1).Address
Debug.Print F_Adresse(Bilder(1))
Debug.Print F_Adresse(Bilder("Titel"))
End Sub
Function F_Adresse(it)
F_Adresse = it.Address
End Function
Schau mal: https://www.snb-vba.eu/VBA_Collection_en.html
AW: Range aus einer Collection
02.11.2022 12:08:29
Daniel
Hi
Damit du den Fehler versteht:
Es gibt zwei Methoden, Werte aus Variablen an eine Function oder Sub zu über geben:
a) byRef
Das ist die Standardmethode. Hier bei wird nicht der Wert über geben, sondern es wird mit der Selben Variable unter einen anderen Namen weitergearbeitet.
b) byVal
Das muss man extra angeben. Hierbei wird der Variablenwert an die Function über geben und es wird eine neue Variable angelegt.
Du kannst dir das wie einen großen Schrank mit vielen Fächern vorstellen, jedes Fach ist eine Variable.
Mit der Übergabe byRef verwenden Sub und Function dasselbe Fach.
Mit der Übergabe byVal sind es zwei verschiedene Fächer.
Das Problem mit der Übergabe byRef ist, dass das nur funktioniert, wenn der von der Function angeforderte Variablentyp exakt mit dem Variablentyp übereinstimmt, der von der Sub übergeben wird.
Du forderst ,"Range" an, deine Collection kann aber alles enthalten (das Range drin ist, weiß dir Function zu diesem Zeitpunkt noch nicht)
Ein weiters Problem könnte sein, das mit Übergabe byRef die Variable in der Sub von der Function aus geändert werden kann (das selbe Fach), un da könnte es in Verbindung mit der Collection Probleme geben, weil das keine "normale" Variable ist.
Probiere also mal, wie von Thorsten gezeigt die Übergabe byVal oder deklarieren mal Bereich nicht als Range sondern als Variant.
Gruß Daniel
Anzeige
AW: Range aus einer Collection
02.11.2022 19:03:04
Günther
Danke erst mal für Eure Antworten.
OK, mit byVal kommt zwar keine Fehlermeldung, liefert aber nicht das gewünschte Ergebnis, eben dann, wenn es genau auf die Rückgabe ankommt.
aber mit "Bereich As Variant" gehts.
@Daniel
Kann nicht alles nachvollziehen, was Du geschrieben hast.
Du meinst also, dass das Problem im Variablentyp liegt. Das kann ich im folgendem Beispiel nachzuvollziehen:

Sub xyz()
abc ("klm")
End Sub
Function abc(q As Integer)
End Function
Allerdings kommt der Fehler erst beim Aufruf der Function, in meinem Problemfall jedoch kann ich das Makro nicht einmal starten, also lange bevor der Unterschied im Variablentyp relevant wird. Damit verstehe ich den Zusammenhang Deines Beispiels mit meinem Problemfall nicht. Kannst Du bitte schreiben, wie Du das gemeint hast?
Danach schreibst Du, dass die Collection alles enthalten kann. OK, und was ist hier zu beachten? Ich habe es ausprobiert. In beiden der folgenden Zeilen trifft zu: Die Function weiß noch nicht, dass ein Range übergeben wird.

    Debug.Print AdresseErmitteln(Sammlung("Landschaften")("Titel"))
Debug.Print AdresseErmitteln(Bilder("Titel"))
Trotzdem funktioniert die untere Zeile, die obere aber nicht. Auch hier bitte ich Dich um genauere Erklärung.
Vielen Dank nochmals, Daniel. In Deiner Antwort hast Du viel Nützliches und Interessantes geschrieben. Deshalb schon versuche ich alles zu verstehen, sonst wäre all Deine Mühe umsonst gewesen.
Kannst Du mir auch sagen, warum es funktioniert, Variable als Variant zu deklarieren, dass es keine Fehlermeldung gibt?
Und wie von Thorsten gezeigt, die Übergabe byVal liefert auch keine Fehlermeldung. Allerdings unterbleibt dann die byRef-Übergabe. OK
@snb
Da stimme ich Dir zu, auch ich finde diese Collection-in Collection-Konstruktion ausgesprochen überflüssig, bereitet nur Probleme. Ja, genauso wie Du es darstellt, funktioniert es einwandfrei. Es löst zwar nicht mein Problem, aber es kommt keine Fehlermeldung.
@MCO
Ja, ich habe mit Debug.print festgestellt, dass ein String mit der Adresse ausgegeben wird, allerdings mit der Adresse einer Ranges, und genau diesen übergebe ich an die Function.
"Sammlung("Landschaften")("Titel").Address" ist ein String
"Sammlung("Landschaften")("Titel")" ist der zugehörige Range. Warum dann gerade Dein vorgeschlagener Aufruf
"Range(Sammlung("Landschaften")("Titel").Address)"
korrekt ist, verstehe ich nicht, wo er doch dasselbe Range liefert.
LG,
Günther
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige