Zugriff auf Excel-Zelle in einer Function

Guten Tag,

ich möchte die Attribute (Färbung, Schriftart usw.) in einer VBA-Function abhängig von Parametern ändern.

Wie mache ich das?

Range, Offset u.a. funktioniert nicht.

Danke
Laika

Hallo Laika,

zeichne doch einfach mal ein Makro auf, während du die Farbe/Schriftart usw. einer Zelle änderst. Dann siehst du im Code, wie das geht.

Gruß, Andreas

Hallo Andreas,

zeichne doch einfach mal ein Makro auf, während du die
Farbe/Schriftart usw. einer Zelle änderst. Dann siehst du im
Code, wie das geht.

Natürlich, mache ich immer, um auf einfache Weise den VBA-Code zu ermitteln. Nur, wie adressiere ich die Zelle?
Einfach mit „Range(„H16“).xxx“ funktioniert nicht.

Laika

Hallo Laika,

was funktioniert denn nicht?
Das hier z.B. geht problemlos:

Sub tt()
 Sheets("Tabelle1").Cells(1, 1).Font.FontStyle = "Kursiv"
 Sheets("Tabelle1").Cells(1, 1).Interior.ColorIndex = 3
End Sub

Gruß, Andreas

N’abend Andreas,

was funktioniert denn nicht?
Das hier z.B. geht problemlos:

Sub tt()
Sheets(„Tabelle1“).Cells(1, 1).Font.FontStyle = „Kursiv“
Sheets(„Tabelle1“).Cells(1, 1).Interior.ColorIndex = 3
End Sub

Geht bei mir nicht. Ich habe übrigens eine Function, keine Sub!

Laika

Geht bei mir nicht. Ich habe übrigens eine Function, keine
Sub!

Hallo Laika,

mir noch unklar was du möchtest, meinst du es so:

Sub test()
Call tt(Range("A5:A10"))
End Sub

Function tt(Zellenbereich As Range)
Zellenbereich.Font.FontStyle = "Kursiv"
Zellenbereich.Interior.ColorIndex = 3
End Function

Gruß
Reinhard

Grüezi Laika

ich möchte die Attribute (Färbung, Schriftart usw.) in einer
VBA-Function abhängig von Parametern ändern.

Wie mache ich das?

Range, Offset u.a. funktioniert nicht.

Das funktioniert sowohl mit einer Sub wie mit einer Function - bei letzterer aber nur dann, wenn diese nicht aus einer Zelle im Tabellenblatt aus aufgerufen wird.
In diesem Falle darf eine Sub ‚nur‘ einen Rückgabewert an die aufrufende Zelle zurück geben, nicht aber selbige (oder andere) beschreiben oder Formate zuweisen. Das wird von Excel zuverlässig unterbunden, da ansonsten der Berechnungsbaum inkonsistent werden könnte.

Hier noch ein interessanter Artikel aus der MS-KB zu diesem Thema:

http://support.microsoft.com/kb/170787/en-us

Verwende daher die Bedingte Formatierung um Zellen in Abhängigkeiten einzufärben oder programmiere das Ganze mit dem Change()-Event des Tabellenblattes.

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Grüezi wohl Thomas,

Das funktioniert sowohl mit einer Sub wie mit einer Function -
bei letzterer aber nur dann, wenn diese nicht aus einer Zelle
im Tabellenblatt aus aufgerufen wird.

Genau das will ich aber machen. Hier mein ausführliches Problem:
steht in einer Zelle, kann positiv oder negativ sein.
soll in der Zelle daneben stehen und soll abhängig vom Wert - pos. oder neg. - blau oder rot gefärbt werden (die Schrift oder der Zellhintergrund).
Dazu habe ich in die Zelle den Function-Aufruf „= textattribut(„G16“)“ geschrieben, mit G16 die Zelle, in der steht.

kann natürlich mit der Formatierung rot oder blau gemacht werden. Nur für die Anpassung der Zelle daneben habe ich noch nichts gefunden. Den Text selbst kann ich ja mit der WENN-Funktion ändern. Ginge das auch für die Attribute?
Habe bisher nichts gefunden und daher eine Function geschrieben:

Function textattribut(zahlenwert)

 If zahlenwert\> 0 Then
 textattribut = "text\_1"
 Sheets("Übersicht").Cells(8, 17).Font.ColorIndex = 52
 Else
 If zahlenwert = 0 Then
 textattribut = ""
 Else
 textattribut = "text\_2"
 Sheets("Übersicht").Cells(8, 17).Font.ColorIndex = 49
 End If
 End If

End Function

Ganz simple Sache also, nur 'ne kleine Spielerei.
Die Zeilen

Sheets("Übersicht").Cells(8, 17).Font.ColorIndex = 52

habe ich mal testweise rein geschrieben, bewirken aber nichts, was zu deiner obigen Aussage passt.

Gruss
Laika

Moin Reinhard,

schau mal in meine Antwort an Thomas, da ist’s genau beschrieben.

Laika

Hallo Laika,

Das funktioniert sowohl mit einer Sub wie mit einer Function -
bei letzterer aber nur dann, wenn diese nicht aus einer Zelle
im Tabellenblatt aus aufgerufen wird.

Genau das will ich aber machen.

*sehr grins* Ähem, nur so, völlig grundlos *lüch*

Nochmal, eine Funktion die in einer Zelle steht/aufgerufen wird, kann keine anderen Zellen ändern.

In Vba gestartet kann eine Funktion dies, siehe nachstehenden Code.

Mit bed. Formatierung kannst du auf Inhalte beliebiger Zellen „reagieren“.

Wenn „Zahl“ in D5 steht und je nach D5 (pos/neg) soll X5 anders farblich aussehen, nimmst du für X% die bed. Formatierung. mit zwei Bedingungen
Formel1: =D5>=0
Formel2: =D5Sub Test()
Dim N
N = ZelleAendern
End Sub

Function ZelleAendern()
Range(„C16“).Value = „Huhu“
End Function

Hallo,

*sehr grins* Ähem, nur so, völlig grundlos *lüch*

???

Nochmal, eine Funktion die in einer Zelle steht/aufgerufen
wird, kann keine anderen Zellen ändern.

Will ich auch nicht. Ich will die Attribute der Zelle ändern, aus der heraus die Function aufgerufen wird.

Sub Test()
Dim N
N = ZelleAendern
End Sub

Function ZelleAendern()
Range(„C16“).Value = „Huhu“
End Function

Value ändern … kein Problem, aber die Attribute wie z.B. Hintergrundfarbe. Und ich will nicht absolut adressieren. Kann doch nicht so schwer sein. Sonst würde meine (noch) gute Meinung über Excel und VBA doch arg ramponiert.

Laika

Grüezi Laika,

Das funktioniert sowohl mit einer Sub wie mit einer Function -
bei letzterer aber nur dann, wenn diese nicht aus einer Zelle
im Tabellenblatt aus aufgerufen wird.

Genau das will ich aber machen.

Ja, ich weiss, dass Du das machen willst - aber eben genau das geht nicht.

Daran können wir nichts ändern, das ist in Excel so festgelegt.
Lies dir bitte den vorhin genannten KB-Artikel in aller Ruhe durch; dann können/werden wir uns über Alternativen zu deinem Wunsch unterhalten.

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Was ganz krummes als Denkanstoß
Hallo Laika,

ich habe hier mal was gebastelt:

Public Function farbe(f As Integer) As Integer
 Dim i As Integer

 SendKeys "^1"
 SendKeys "m"
 SendKeys "{TAB}"
 For i = 1 To f
 SendKeys ("{RIGHT}")
 Next i
 SendKeys " "
 SendKeys "{ENTER}"
 farbe = f
End Function

Bei mir (Excel97) färbt die Funktion die Zelle ein. f ist dabei die „Nummer“ der Farbe, die du haben möchtest. „Nummer“ heißt hier: Wenn du im Format-Dialog für Zellen den Reiter „Muster“ aufrufst, und die Farbkästchen durchzählst. Ich weiß, dass ist jetzt blöd ausgedrückt, aber ich weiß momentan nicht, wie ich das besser erklären soll.

Weitere Bedingung, damit es funktioniert ist, dass die Markierung nach dem Drücken der Eingabetaste nicht verschoben wird (Extas - Optionen - Bearbeiten).
Wie gesagt, das ist nur ein schneller Versuch gewesen. Vielleicht kannst du ja was damit anfangen.

Gruß, Andreas

Danke Andreas, …
… interessante Sache, aber da werden die Attribute der ActiveCell geändert. Und die kann irgendwo sein, ist nie dort, wo die Function aufgerufen wird. Aber genau diese aufrufende Zelle will ich ändern …

Morgentlichen Gruß
Laika

Hallo Laika,

ich dachte du wolltest die Attribute der Zelle ändern, in die du die Formel eingibst. Und das ist doch die ActiveCell.
Wenn du eine andere Zellen ändern willst, müsstest du vorher noch über weitere SendKeys die gewünschte Zelle ansteuern, irgendwie so (nicht getestet):

SendKeys "^g"
SendKeys "B17{ENTER}"

Gruß, Andreas

Public Function farbe(f As Integer) As Integer
Dim i As Integer
SendKeys „^1“
SendKeys „m“
SendKeys „{TAB}“
For i = 1 To f
SendKeys ("{RIGHT}")
Next i
SendKeys " "
SendKeys „{ENTER}“
farbe = f
End Function

Hallo Andreas,

gute idee, aber ich nehme an, wie immer wegen SendKeys, nicht stabil genug.
Schreib mal in A1
=farbe(zeile())
und kopiere es runter bis A56.
Dann kommt da eine Einheitsfarbe heraus.

Übrigens klappt dein Code auch in XL2000.

Gruß
Reinhard

Hallo Reinhard,

ich weiß, du hast Recht. SendKeys ist immer eine heikle Sache. Es war auch nur so eine Schnapsidee von mir. Wollte nur mal sehen, ob man die Excel-Einschränkungen damit austricksen könnte. Es sollte ja auch nur „Was ganz krummes als Denkanstoß“ sein.

Gruß, Andreas