Rückgabestring in Excel formatieren

Hallo,

ich habe eine VBA-Funktion die mir Excel-Zellen aus einer Datenbank befüllt.
Diese sollen z.B. entsprechend des Textes gefärbt werden.
z.B. Zelle A1: =getInfo(„T_TEST“) schreibt mir eine Beschreibung zur Tabelle „T_TEST“ in die Zelle. Diese soll z.B. bei Tabellen grün sein, bei Views („V_…“) blau.

Das Problem ist, dass der Rückgabewert der Funktion ja keine Formatierungsinformationen enthält, sondern nur aus einem String besteht. Gibts da einen anderen Datentyp?

Die entsprechende Zelle direkt formatieren funktioniert auch nicht, da die Funktion offensichtlich keinen Bezug zur aufrufenden Zelle hat. ActiveCell funktionert nicht und Application.Caller auch nicht.

Kann mir irgendjemand einen Tip geben wie man sowas realisiert?

Danke

Hallo!

ich habe eine VBA-Funktion die mir Excel-Zellen aus einer
Datenbank befüllt.
Diese sollen z.B. entsprechend des Textes gefärbt werden.
z.B. Zelle A1: =getInfo(„T_TEST“) schreibt mir eine
Beschreibung zur Tabelle „T_TEST“ in die Zelle. Diese soll
z.B. bei Tabellen grün sein, bei Views („V_…“) blau.
Das Problem ist, dass der Rückgabewert der Funktion ja keine
Formatierungsinformationen enthält, sondern nur aus einem
String besteht. Gibts da einen anderen Datentyp?

Nein, brauchst Du auch nicht unbedingt. Da Du ja in einer Excel-Datei rumspielst, kannst Du dort direkt formatieren. Und das am besten mit der bedingten Formatierung, wenn Du Dich auf drei Bedingungen einschränken kannst. Ansonsten musst Du das ganze schon zu Fuß erledigen.

Die entsprechende Zelle direkt formatieren funktioniert auch
nicht, da die Funktion offensichtlich keinen Bezug zur
aufrufenden Zelle hat. ActiveCell funktionert nicht und
Application.Caller auch nicht.

Mit/unter was entwickelst Du denn? Du wirst ja wahrscheinlich Excel in die Verweise eingebunden haben. Dann kannst Du ganz „normal“ mit dem Workbook-, dem Worksheet-, dem Range- und dem Cell-Objekt auf die einzelnen Stellen zugreifen und sie entsprechend formatieren. Z. B., um im obigen Beispiel zu bleiben, so für Zelle A3 (Zeile 3, Spalte 1):

With DeinExcelObjekt.Workbooks("DeineDatei.xls").Worksheets(1).Cells(3, 1)
 .FormatConditions.Delete
 .FormatConditions.Add Type:=xlExpression, Formula1:= \_
 "=(LINKS($A3;2)=""V\_"")"
 .FormatConditions(1).Interior.ColorIndex = 5
 .FormatConditions.Add Type:=xlExpression, Formula1:= \_
 "=(LINKS($A3;2)=""T\_"")"
 .FormatConditions(2).Interior.ColorIndex = 50
End With

Gruß, Manfred

DeinExcelObjekt.Workbooks(„DeineDatei.xls“).Worksheets(1).Cells(3,
1)
.FormatConditions.Delete
.FormatConditions.Add Type:=xlExpression, Formula1:= _
„=(LINKS($A3;2)=“„V_“")"
.FormatConditions(1).Interior.ColorIndex = 5
.FormatConditions.Add Type:=xlExpression, Formula1:= _
„=(LINKS($A3;2)=“„T_“")"
.FormatConditions(2).Interior.ColorIndex = 50
End With

Hier brauch ich ja aber auch wieder eine explizite Referenz auf die Zelle (und sogar den Dateinamen und Worksheetnummer?). Gibt es denn keine dynamische Referenz auf die Zelle, die die Funktion aufgerufen hat?
Das Problem ist, dass die Funktion aus x-beliebig vielen Zellen an unterschiedlichsten Positionen im Worksheet aufgerufen werden muss.

Ich dachte da an einen Aufruf der Art:
Application.Caller.Interior.Color = RGB(0,255,0) o.ä.
leider hat der Aufruf keine Auswirkung, obwohl die Adresse der Zelle stimmt, wenn ich mir sie mit msgbox(Application.Caller.Address) ausgeben lasse.

Gruß Martin

Hallo, Martin!

Hier brauch ich ja aber auch wieder eine explizite Referenz
auf die Zelle (und sogar den Dateinamen und Worksheetnummer?).
Gibt es denn keine dynamische Referenz auf die Zelle, die die
Funktion aufgerufen hat?

Wie und wann rufst Du denn die Funktion auf? Du schrubtest was von einer VBA-Funktion, die die Zellen aus der Datenbank heraus füllt. An dieser Stelle sollte dann das Einhaken/Formatieren mit erledigt werden. Und irgendwie wirst Du hier ja Verweise auf das aktuelle Excel-Objekt haben. Oder wie läuft Deine vorhandene VBA-Funktion ab? Das müssten wir schon wissen. Dann geht’s auch en detail weiter…

Gruß, Manfred

Abstrahiert funktioniert das ganze so:

ich habe eine Funktion:

Public Static Function printObject(objectName As String) As String
printObject = objectName
End Function

in der Zelle steht dann:

=printObject(„TEXT“)

Nur soll die Zelle, in der jetzt TEXT steht einen Rahmen bekommen und entsprechend des Textes z.B. rot markiert werden.

Ich experimentiere derzeit mit Ansätzen wie:
Dim Target As Range
Set Target = Application.Caller.Cells(1, 1)
Target.Select
ActiveCell.Interior.Color = RGB(255, 0, 0)

Leider funktioniert keiner meiner bisherigen Versuche, auf die Zelle zuzugreifen, obwohl Application.Caller.Adress korrekt den Zellennamen (z.B. $A$1) ausgibt…

Offensichtlich habe ich mit meinem Java-Verständnis von Objektorientierung schwierigkeiten, die VBA-Objekte und ihre Methoden zu durchschauen…
Intuitiv hätte ich auf eine Zeile wie
Application.Caller.Interior.Color = RGB(255, 0, 0)
getippt. Geht aber leider alles nicht.

Public Static Function printObject(objectName As String) As
String
printObject = objectName
End Function

in der Zelle steht dann:
=printObject(„TEXT“)

Wie kommt dieser Text in die Zelle? Das wäre eine Stelle, an der die Formatierung aufgerufen werden könnte.

Leider funktioniert keiner meiner bisherigen Versuche, auf die
Zelle zuzugreifen, obwohl Application.Caller.Adress korrekt
den Zellennamen (z.B. $A$1) ausgibt…
Offensichtlich habe ich mit meinem Java-Verständnis von
Objektorientierung schwierigkeiten, die VBA-Objekte und ihre
Methoden zu durchschauen…

*Hüstel* Lieg taber wahrscheinlich eher an der „Objektorientierung“ von MS.

Whatsoever: Das sollte Dir weiterhelfen:

Application.Caller.Parent gibt die Tabelle zurück (, wenn der Caller den tatsächlich ein Range ist).

Dann solltest Du Dir ein Range-Objekt, welches die Funktion aufruft, definieren können. Und diesem dann die benötigte Formatierung zuweisen. Läuft das?

Gruß, Manfred

Public Static Function printObject(objectName As String) As
String
printObject = objectName
End Function

in der Zelle steht dann:
=printObject(„TEXT“)

Wie kommt dieser Text in die Zelle? Das wäre eine Stelle, an
der die Formatierung aufgerufen werden könnte.

Der Text in der Zelle ist der Rückgabewert der Funktion, die in der Zelle aufgerufen wird (printObject)

Application.Caller.Parent gibt die Tabelle zurück (, wenn der
Caller den tatsächlich ein Range ist).
Dann solltest Du Dir ein Range-Objekt, welches die Funktion
aufruft, definieren können. Und diesem dann die benötigte
Formatierung zuweisen. Läuft das?

Leider nicht. Offenbar lässt sich eine Zelle überhaupt nicht aus einer Funktion heraus formatieren und ich brauch einen Button oder sowas…
Seltsam. Normaal is dat nich…

Wie kommt dieser Text in die Zelle? Das wäre eine Stelle, an
der die Formatierung aufgerufen werden könnte.

Der Text in der Zelle ist der Rückgabewert der Funktion, die
in der Zelle aufgerufen wird (printObject)

Ich korrigiere mich: Wie kommt die Formel in die Zelle?

Application.Caller.Parent gibt die Tabelle zurück (, wenn der
Caller den tatsächlich ein Range ist).
Dann solltest Du Dir ein Range-Objekt, welches die Funktion
aufruft, definieren können. Und diesem dann die benötigte
Formatierung zuweisen. Läuft das?

Leider nicht. Offenbar lässt sich eine Zelle überhaupt nicht
aus einer Funktion heraus formatieren und ich brauch einen
Button oder sowas…
Seltsam. Normaal is dat nich…

Stümmt. Habe auch mal mit rumgespielt. Scheint echt nicht zu gehen.

Wie kommt dieser Text in die Zelle? Das wäre eine Stelle, an
der die Formatierung aufgerufen werden könnte.

Der Text in der Zelle ist der Rückgabewert der Funktion, die
in der Zelle aufgerufen wird (printObject)

Ich korrigiere mich: Wie kommt die Formel in die Zelle?

manuell.

Der Text in der Zelle ist der Rückgabewert der Funktion, die
in der Zelle aufgerufen wird (printObject)

Ich korrigiere mich: Wie kommt die Formel in die Zelle?

manuell.

Dann kannst Du doch auch manuell die (bedingte) Formatierung auch über die ganze Spalte setzen. Kostet hoch geschätzte zwei Minuten.

Alternativ kannst Du ja auch ein Makro erstellen, welches die gesamte Formatierung übernimmt, und dieses z. B. beim Berechnen des Sheets aufrufen.

Also, irgendwie bin ich ein wenig weg vom eigentlichen Problem: Das setzen der Farbinformation funktioniert offensichtlich nicht innerhalb einer Berechnungsfunktion, die einen Wert zurückliefert. Dann bleibt halt eine der beiden obigen Lösungen.

Gruß, Manfred