Discussion:
Bereich (Range) als Referenz an Funktion übergeben
(zu alt für eine Antwort)
Georg M.
2006-04-17 09:19:02 UTC
Permalink
Hi Newsgroup,

es gelingt mir nicht, einen Bereich (ich meine einen Range, mehrere Zellen
eines Arbeitsblattes) als Referenz an eine Funktion zu übergeben, so dass ich
die Zellen des Arbeitsblattes aus der Funktion heraus bearbeiten kann. Wie
muss ich das machen? Das Beispiel unten funktioniert leider nicht:

Function RangeChange(ByRef rFeld As Range) as String
For Each rZ In rFeld
rZ.Value = 8
...

Aufruf mit ...
=RangeChange(C9:F13)


Was mache ich falsch? Danke für jede Hilfe,
Georg
Alexander Wolff
2006-04-17 09:51:52 UTC
Permalink
Post by Georg M.
Hi Newsgroup,
es gelingt mir nicht, einen Bereich (ich meine einen Range, mehrere
Zellen eines Arbeitsblattes) als Referenz an eine Funktion zu
übergeben, so dass ich die Zellen des Arbeitsblattes aus der Funktion
heraus bearbeiten kann. Wie muss ich das machen? Das Beispiel unten
Function RangeChange(ByRef rFeld As Range) as String
For Each rZ In rFeld
rZ.Value = 8
...
Aufruf mit ...
=RangeChange(C9:F13)
Googeln:

http://groups.google.de/group/microsoft.public.de.excel/search?group=microsoft.public.de.excel&q=%22as+Range%29%22&qt_g=1&searchnow=Diese+Gruppe+durchsuchen

z.B.:

http://groups.google.de/group/microsoft.public.de.excel/browse_thread/thread/18f664c5971e4114/ebd34aed31452bf5?q=%22as+Range)%22&rnum=6#ebd34aed31452bf5

Gruss Alexander
Thomas Ramel
2006-04-17 10:25:48 UTC
Permalink
Grüezi Georg

Georg M. schrieb am 17.04.2006
Post by Georg M.
es gelingt mir nicht, einen Bereich (ich meine einen Range, mehrere Zellen
eines Arbeitsblattes) als Referenz an eine Funktion zu übergeben, so dass ich
die Zellen des Arbeitsblattes aus der Funktion heraus bearbeiten kann. Wie
Function RangeChange(ByRef rFeld As Range) as String
For Each rZ In rFeld
rZ.Value = 8
...
Die Übergabe des Ranges scheint mir OK zu sein, solange die Function aus
VBA heraus aufgerufen wird.
Post by Georg M.
Aufruf mit ...
=RangeChange(C9:F13)
Was mache ich falsch?
Was willst Du denn mit der Function machen?

So wie es für mich aussieht willst Du im angegebenen Bereich überall den
Wert '8' setzen?

Das kannst Du mit einer Funktion die aus einer Tabellenzelle heraus
aufgerufen wird nicht tun.
Solche Funktionen dürfen (von einigen ganz wenigen Ausnahmen mal abgesehen)
nur einen Rückgabewert an die aufrufende Zelle liefern, nicht aber andere
Zellen und/oder deren Formate verändern. Das liefe auf eine klassische
Endlos-Schleife hinaus.


Mit freundlichen Grüssen
Thomas Ramel (@Laptop)
--
- MVP für Microsoft-Excel -
[Win XP Pro SP-2 / xl2000 SP-3]
Georg M.
2006-04-17 11:39:01 UTC
Permalink
Hi Thomas,

das Beispiel ist ein Dummy-Beispiel. Im wirklichen Leben möchte ich nicht
den Inhalt aller Zellen des als Argument übergebenen Bereiches auf 8 setzen.
Ich habe z.B. mehrere Tabellen in denen in verschiedenen Bereichen erwartete
Wachstumsraten stehen (für verschiedene Produkte, Regionen, Zeiträume etc.).
Ich möchte dann eine VBA-Funktion oder Prozedur haben, mit der ich die
verschiedenen Wachstumsraten verändern kann (in Abhängigkeit verschiedener
Eingangsgrößen - wie das geschieht spielt hier glaube ich keine wesentliche
Rolle) und die alten Wachstumsraten in einem Bereich von Zellen überschreiben
kann.

Mir ist schon klar, wie ich das hinbekomme, wenn ich den Bereich, in den die
Ergebnisse geschrieben / überschrieben werden sollen, fest in einer Prozedur
hinterlege.

Im Wesentlichen suche ich die Flexibilität den Bereich des Tabellenblattes,
in den die Ergebnisse geschrieben werden sollen, mit als Argument in den
Aufruf einer VBA-Funktion oder -Prozedur zu geben. Ich dachte eine Funktion
wäre dazu ein eleganter 'Work Around' verstehe aber Deinen Hinweis, dass das
Ziel einer Funktion eigentlich ein anderes ist.

Any help?

Gruß
Georg

P.S. Ich wüßte auch nicht, wie ich das mit einer Sub-Prozedur lösen soll.
Zumal die Ausführung automatisch erfolgen soll, wenn sich die Daten in einem
bestimmten (als Argument verwendeten) Eingabebereich des Worksheets ändern.
Post by Thomas Ramel
Grüezi Georg
Georg M. schrieb am 17.04.2006
Post by Georg M.
es gelingt mir nicht, einen Bereich (ich meine einen Range, mehrere Zellen
eines Arbeitsblattes) als Referenz an eine Funktion zu übergeben, so dass ich
die Zellen des Arbeitsblattes aus der Funktion heraus bearbeiten kann. Wie
Function RangeChange(ByRef rFeld As Range) as String
For Each rZ In rFeld
rZ.Value = 8
...
Die Übergabe des Ranges scheint mir OK zu sein, solange die Function aus
VBA heraus aufgerufen wird.
Post by Georg M.
Aufruf mit ...
=RangeChange(C9:F13)
Was mache ich falsch?
Was willst Du denn mit der Function machen?
So wie es für mich aussieht willst Du im angegebenen Bereich überall den
Wert '8' setzen?
Das kannst Du mit einer Funktion die aus einer Tabellenzelle heraus
aufgerufen wird nicht tun.
Solche Funktionen dürfen (von einigen ganz wenigen Ausnahmen mal abgesehen)
nur einen Rückgabewert an die aufrufende Zelle liefern, nicht aber andere
Zellen und/oder deren Formate verändern. Das liefe auf eine klassische
Endlos-Schleife hinaus.
Mit freundlichen Grüssen
--
- MVP für Microsoft-Excel -
[Win XP Pro SP-2 / xl2000 SP-3]
Eike Bimczok
2006-04-17 12:42:04 UTC
Permalink
Post by Georg M.
P.S. Ich wüßte auch nicht, wie ich das mit einer Sub-Prozedur lösen soll.
Zumal die Ausführung automatisch erfolgen soll, wenn sich die Daten in einem
bestimmten (als Argument verwendeten) Eingabebereich des Worksheets ändern.
Hallo Georg,

folgender Code in das Klassenmodul deiner Tabelle (Rechtsklick auf den
Tabellenreiter - Code anzeigen):

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.AddressLocal(False, False) = "B5" Then
Application.EnableEvents = False
Range(Target.Value).Value = "test"
Application.EnableEvents = True
End If
End Sub


In B5 steht einfach der Bereich, z.B. A1:A5

Eine Fehlerbehandlung ist noch nicht eingebaut.

Gruß und schöne Ostern
Eike
Georg M.
2006-04-17 13:17:01 UTC
Permalink
Woww, Danke, Georg
Post by Eike Bimczok
Post by Georg M.
P.S. Ich wüßte auch nicht, wie ich das mit einer Sub-Prozedur lösen soll.
Zumal die Ausführung automatisch erfolgen soll, wenn sich die Daten in einem
bestimmten (als Argument verwendeten) Eingabebereich des Worksheets ändern.
Hallo Georg,
folgender Code in das Klassenmodul deiner Tabelle (Rechtsklick auf den
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.AddressLocal(False, False) = "B5" Then
Application.EnableEvents = False
Range(Target.Value).Value = "test"
Application.EnableEvents = True
End If
End Sub
In B5 steht einfach der Bereich, z.B. A1:A5
Eine Fehlerbehandlung ist noch nicht eingebaut.
Gruß und schöne Ostern
Eike
Eike Bimczok
2006-04-17 13:37:14 UTC
Permalink
Post by Georg M.
Woww, Danke, Georg
Bitte gerne!

Gruß
Eike

Loading...