Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Variant-Funktion - Rückgabewert Text oder Objekt

Variant-Funktion - Rückgabewert Text oder Objekt
Daniel
Hallo
ich möchte eine Funktion schreiben, die mir als Ergebnis entweder ein Objekt, oder einen Hinweistext liefert, falls das Objekt nicht erstellt/gefunden werden konnte. Dieser Text soll dann die Information enthalten, was jetzt die Ursache für den Fehler war.
Das ist soweit alles kein Problem, scheitert aber an der Tatsache, daß man Objekte immer mit Set zuweisen muss.
dh wenn ich
xxx = MeineFunktion()
schreibe, bekomme ich einen Fehler, wenn die Funktion das Objekt zurückgibt
wenn ich
Set xxx = MeineFunktion()
schreibe, bekomme ich den Fehler, wenn die Funktion den Hinweistext zurückgibt.
Kennt jemand hierfür eine elgante Lösung?
vielen Dank, Daniel
AW: Variant-Funktion - Rückgabewert Text oder Objekt
16.09.2011 13:07:05
Martin
Hallo Daniel,
dann entferne den Hinweistext aus deiner Function und nehme die Variante

Set xxx = MeineFunktion()
Falls das Objekt nicht gefunden wurde:

    If xxx Is Nothing Then
MsgBox "Kein Objekt gefunden"
Exit Sub
End If
Viele Grüße
Martin
AW: Variant-Funktion - Rückgabewert Text oder Objekt
16.09.2011 13:21:22
Daniel
HI
nein, das ist zu einfach.
ich will dem Anwender schon mitteilen, warum die Funktion gescheitert ist, bzw welcher der eingebenen Parameter für das Scheitern verantwortlich ist.
Das kann ich während dem Funktionlauf ganz gut ermitteln und möchte dies natürlich nutzen, ohne daß ich die Funktion 2x laufen lassen muss.
Gruß, Daniel
Anzeige
AW: Variant-Funktion - Rückgabewert Text oder Objekt
16.09.2011 13:30:42
Martin
Hallo Daniel,
mit "VarType(VarName)" kannst du den Untertyp einer Variablen abfragen.
Viele Grüße
Martin
AW: Variant-Funktion - Rückgabewert Text oder Objekt
16.09.2011 13:54:03
Daniel
HI
ja, aber ich müsste ja hierfür den VarType kennen, bevor ich die Variable überhaupt befülle, deswegen geht das nicht.
Gruß, Daniel
AW: Variant-Funktion - Rückgabewert Text oder Objekt
16.09.2011 14:24:48
Martin
Hallo Daniel,
nein, der VarType wird doch automatisch erkannt:

Sub test()
MsgBox VarType(7)
MsgBox VarType("Hinweistest")
End Sub
Gruß,
Martin
AW: Variant-Funktion - Rückgabewert Text oder Objekt
16.09.2011 15:22:05
Daniel
Hi
das würde dann höchsten so funktionieren:

dim Ergebnis as Variant
if Vartype(MeineFunktion(...)) = 9 then
Set Ergebnis = Meine(Funktion(...)
Else
Ergebnis = MeineFunktion(...)
Ende if

das hat aber den Nachteil, daß ich die Funktion 2x laufen lassen muss, das erste mal, um den Typ ihres Rückgabewerts zu ermitteln und das 2. Mal, um das Ergebnis zu berechnen.
Das möchte ich vermeiden, da die Funktion etwas länger zum berechnen braucht.
Gruß, Daniel
Anzeige
Keine Funktion, aber Sub für Text oder Objekt
17.09.2011 17:14:27
Erich
Hi Daniel,
wenn man nicht darauf besteht, dass eine Funktion verwendet werden soll, geht das eigentlich ganz einfach
mit einer Sub-Prozedur mit einem Parameter:

Sub myTest()
Dim varE ' as variant
mySub varE                             ' ein Aufruf
If VarType(varE) = 9 Then
MsgBox "Objekt: " & varE.Name
Else
MsgBox "Hinweis:" & vbLf & varE
End If
End Sub
Sub mySub(vErg)
If Second(Now) Mod 10 > 4 Then
Set vErg = Sheets(1)       ' manchmal ein Objekt
Else
vErg = "Falsche Zeit - kein Objekt" ' sonst Text
End If
End Sub
Die Prozedur für die Objektermittlung muss nur einmal aufgerufen werden.
Im Parameter steht nachher ein Objekt oder ein Text, was sich mit VarType prüfen lässt.
Hier sorgt VBA für die Parameterübergabe und übergibt den jeweils gewünschten Wert.
Bei der Funktion war das Problem, dass man beim Aufruf noch nicht weiß,
ob man das Fkt-Ergebnis ohne oder mit "Set" in eine Variable schreiben soll.
Besser finde natürlich auch ich Franz' Vorschlag mit zwei Parametern - einem Objekt (im Erfolgsfall)
und einem String (für den Hinweis).
Vor längerer Zeit waren sogenannte ReturnCodes (RCs) Standard bei der Programmierung...
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Keine Funktion, aber Sub für Text oder Objekt
17.09.2011 23:09:41
Daniel
Hi
Stimmt natürlich, wenn man die ByRef-Funktionalität nutzt, um einen Eingabeparameter direkt als Rückgabewert zu verwenden, dann braucht man im prinzip auch keine Funktion mehr, da ist das natürlich nur konsequent.
Trotzdem bleibt wohl die Erkenntnis, das eine Variant-Funktion aufgrund der Set-Problematik nur eingeschränkt "variant" ist, nämlich entweder als normale Variable oder als Objekt. Beides gleichzeitig ist wohl nicht möglich.
Gruß, Daniel
oder etwa doch?
18.09.2011 00:05:40
Erich
Hi Daniel,
hier ein Beispiel für eine Fkt., die sowohl ein Objekt als auch einen String zurückgeben kann.
Die Fkt. ist damit "voll" variant - nicht nur eingeschränkt.
Ein Problem ist nur, im aufrufenden Programm den Funktionswert einer Variablen zuzuweisen.
Da sehe ich jetzt nur die Möglichkeit, die Fkt. zweimal aufzurufen:

Sub myTest()
Dim varE ' as variant
On Error Resume Next
varE = myFkt()                           ' Aufruf sonst
Set varE = myFkt()                       ' Aufruf Objekt
On Error GoTo 0
If VarType(varE) = 9 Then
MsgBox "Objekt: " & varE.Name
Else
MsgBox "Hinweis:" & vbLf & varE
End If
End Sub
Function myFkt()
If Second(Now) Mod 10 > 4 Then
Set myFkt = Sheets(1)       ' manchmal ein Objekt
Else
myFkt = "Falsche Zeit - kein Objekt" ' sonst Text
End If
End Function
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
mal ohne Funktion
18.09.2011 00:13:22
Erich
Hi Daniel,
nur um zu zeigen, dass die Variant-liefernde Fkt. nicht das Problem ist,
mal ein Beispiel ohne Fkt.:

Sub myTest()
Dim varQ, varE ' as variant
If Second(Now) Mod 10 > 4 Then
Set varQ = Sheets(1)       ' manchmal ein Objekt
Else
varQ = "Falsche Zeit - kein Objekt" ' sonst Text
End If
On Error Resume Next
varE = varQ                           ' Zuweisung sonst
Set varE = varQ                       ' Zuweisung Objekt
On Error GoTo 0
If VarType(varE) = 9 Then
MsgBox "Objekt: " & varE.Name
Else
MsgBox "Hinweis:" & vbLf & varE
End If
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: mal ohne Funktion
18.09.2011 15:15:54
Daniel
Hi Erich
danke für den Hinweis, aber ich denke soweit war das schon klar, daß nicht die Funktion das Problem ist, sondern die Zuweisung an die Variable.
Gruß, Daniel
AW: Variant-Funktion - Rückgabewert Text oder Objekt
16.09.2011 13:30:42
fcs
Hallo Daniel,
wenn du den Fehler-Text nicht in der Function als Meldung ausgeben willst, dann musst du in der Aufrufenden Prozedur eine entsprechende Variabiable deklarieren. Für die Funktion deklarierst du einen zusätzlichen Parameter, in den der Fehlertext geschrieben wird.
Das ganze packst du in eine Fehlerbehandlung in der Funktion.
Gruß
Franz

Sub MakeObject()
Dim sFehlerText As String, oObject As Object, sTest As String
sTest = "Tabelle12"
Set oObject = fncHoleObject(sTest, sFehlerText)
If oObject Is Nothing Then
MsgBox sFehlerText, vbInformation, "Fehler - fncHoleObject - """ & sTest & """"
Else
MsgBox "Objekt wurde eingerichtet" & vbLf & "Objekt-Name: " & oObject.Name, _
vbInformation, "fncHoleObject"
End If
End Sub
Public Function fncHoleObject(ByVal sObjectName As String, ByRef sText As String) As Object
On Error GoTo Fehler
Set fncHoleObject = ActiveWorkbook.Worksheets(sObjectName)
Fehler:
With Err
Select Case .Number
Case 0 'alles ok
Case Else
sText = "Fehler-Nr.: " & .Number & " in Function ""fncHoleObject""" _
& vbLf & .Description
Set fncHoleObject = Nothing
End Select
End With
End Function

Anzeige
AW: Variant-Funktion - Rückgabewert Text oder Objekt
16.09.2011 13:52:54
Daniel
HI
Ok, verstehe, du verwendest eine zusätzlichen Variable, die über die ByRef-Funktionaliät der Funktion befüllts und wandelst damit einen Eingabeparameter zu einem zweiten Rückgabewert.
nicht schlecht die Idee, guter Workaround.
Gruß, Daniel

16 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige