Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
504to508
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
504to508
504to508
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Aufruf einer Funktion

Aufruf einer Funktion
26.10.2004 18:39:32
Barbara
Suche Lösung zu folgendem Problem:
Innerhalb eines Makros soll eine Funktion aufgerufen werden, die aus einem Integer "a" einen Range "Zeitlauf" ermittelt und diesen zurück gibt.
Geht das mit Sub oder Function?
ZB: a = 25
Mit dieser Zahl soll das Sub nun das nächste "Montag" ab der Zeile 25 suchen, und dann den Range von A25 bis zur Fundstelle zurückgeben.
Mein Problem ist nicht das Programmieren dieser Funktion, sondern die richige Übergabe der Daten und der richtige Aufruf der Funktion, da ja kein Range eigegeben wird, aber als Ergebnis rauskommt.
LG, Barbara

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Aufruf einer Funktion
26.10.2004 18:52:43
Josef
Hallo Barbara!
Ich weis nicht ob ich dich richtig verstehe!
Meinst du so was?
Option Explicit

Sub Barbara()
Dim a As Integer
Dim str As String
a = 25
str = "Montag"
MsgBox suchen(a, str)
End Sub

Function suchen(n As Integer, sFind As String) As String
Dim rng As Range
Set rng = Range("A" & n & ":A65536").Find(what:=sFind)
If Not rng Is Nothing Then
suchen = Range("A" & n & ":A" & rng.Row).Address
End If
End Function

Gruß Sepp
Anzeige
AW: Aufruf einer Funktion
Barbara
Ist nicht ganz so, wie ich es wollte, lieber Sepp.
Die Funktion soll nur das a annehmen und einen Range und ein neues a zurückgeben.
Dieser Range wird dann im Hauptprogramm weiter verwendet.
Ausserdem soll, was ich vorher nicht gesagt habe, ein neuer Wert errechnet und zurückgegeben werden. Wie geht das?
Es müßte dann so aussehen, glaub ich:
Function suchen(n as Integer) as Range dim b as Integer ... [Inhalt der Function] n = n+10 b = n+1 End Function
Der Aufruf dieser

Function soll dann so aussehen:
Set Bereich = suchen(25)
Jetzt ist zwar b ausgerechnet worden, bleibt aber bei der Übergabe auf der Strecke.
Zusammenfassend: Eine Funktion soll aus einem Integer mehrere Ergebnisse liefern, die da wären ein Range, ein neues Integer und das Veränderte Eingegebene.
Bitte um Deien Hilfe, Sepp (oder auch wer anderer, natürlich)
Danke, Barbara

Anzeige
AW: Aufruf einer Funktion
26.10.2004 19:23:59
Josef
Hallo Barbara!
Eine Funktion kann, wie Reinhard schon gesagt hat, keinen Range zurückgeben.
Ausserdem kann eine Funktion immer nur einen Rückgabewert haben.
Mann müsste das ganze also auf mehrere Funktionen aufteilen und
den Range über einen String definieren!
Gruß Sepp
AW: Aufruf einer Funktion
26.10.2004 19:47:25
Nepumuk
Servus Sepp,
warum soll das nicht gehen?


Public Sub test()
    Dim myRange As Range, x As Integer, y As Integer, z As Integer
    x = 2
    y = 2
    Set myRange = Bereich(x, y, z)
    MsgBox myRange.Address(0, 0)
    MsgBox z
End Sub
Private Function Bereich(fx As Integer, fy As Integer, fz As IntegerAs Range
    Set Bereich = Range(Cells(1, 1), Cells(fx, fy))
    fz = (fx * fy) + 10
End Function


Gruß
Nepumuk
Anzeige
ui, *staun* Danke, wieder was gelernt o.w,T
Reinhard
wieder was gelernt!
26.10.2004 20:03:10
Josef
Hallo großer Meister ;-)
wieder was von dir gelernt!
Danke!
Gruß Sepp
AW: wieder was gelernt!
26.10.2004 20:38:52
Nepumuk
Hi,
aber ehrlich gesagt nur als Demo, dass es geht. Normalerweise nennt man so eine Konstruktion schweren Funktionsmissbrauch, der mit mindestens 100 Arrayformeln zu ahnden ist.
Gruß
Nepumuk
AW: wieder was gelernt!
Barbara
Hallo Nepomuk,
wie meinst Du das mit Mussbrauch? Ist eine Funktion nicht sinnvoll, wenn man sie von mehreren Stellen aufrufen kann?
Was ist an einer Arrayformel so schlimm? Welche schmerzvolle Wirkung haben sie?
Vielleicht dumme Fragen, aber um kluge Antworten bist Du ja sicher nicht verlegen.
LG, Barbara.
Anzeige
AW: wieder was gelernt!
28.10.2004 12:10:48
Nepumuk
Hi Barbara,
die folgende Aussage beruft sich auf das Beispiel:
Da die Koordinaten des Bereichs schon vor dem Funktionsaufruf feststehen, ist es unsinnig in der Funktion diesen Bereich einer Objektvariablen zu übergeben, die ich wieder einer Objektvariablen übergebe.
Anders wäre es, wenn die Koordinaten des Bereichs erst in der Funktion berechnet werden und diese Funktion mehrfach von verschiedenen Routinen verwendet wird.
Was an Arrayformeln so schlimm ist? Ich habe mal von Boris eine Formel benutzt. Diese stand 20 mal in einer Tabelle. Das öffnen der Mappe mit dieser Tabelle dauerte über 15 Minuten. Die selbe Funktionalität in VBA benötigte dafür ganze 20 Millisekunden. Außerdem verhaue ich mich jedes mal bei der Eingabe so einer Monsterformel, da die Syntax von Formeln anders aufgebaut ist wie die, welche ich von Programmen gewohnt bin.
Gruß
Nepumuk
Anzeige
AW: Aufruf einer Funktion
Barbara
Hallo grosser Nepomuk,
danke, so einfach und so gut, Deine Lösung.
Im Nachhinein ist es ganz klar. Und ich war auch schon nah dran.
Das "Set" hab ich vergessen.
(Und das hat auch schon mein nächstes Problem gelöst. Da hatte ich auch "Set" vergessen.)
Danke nochmals.
LG. Barbara
AW: Aufruf einer Funktion
Reinhard
Hi Barbara,
probiers mal so:

Dim n As Long
Dim b As Long
Sub test()
Set Bereich = Range(suchen(25))
MsgBox Bereich.Address
End Sub
Function suchen(z As Integer) As String
Dim z As Long
n = z + 10
b = n + 1
suchen = "A" & n & ":A" & b
End Function

gruß
Reinhard
Anzeige
AW: Aufruf einer Funktion
Reinhard
Hi Barbara,
in der Hilfe wird nichts erwähnt dass der Rückgabetyp ein range sein darf. Mein nachfolgender Test brachte dann auch prompt fehler 91 beim Funktionsaufruf, wenn ich den Rückgabewert als Range deklariere, wenn wie im nachd´folgenden Code, der typ String ist klappts.
Ohne sicheren Beweis sag ich mal Range geht nicht bei Funktionen.
Gruß
Reinhard

Sub test()
bereich = barbara(5)
MsgBox bereich
End Sub


Function barbara(z As Long) As String 'As Range geht nicht
barbara = Range("A1:A" & z).Address
End Function

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige