Forum: PC Hard- und Software Excel VBA: Aus welcher Zelle wurde die Funktion gerufen?


von Uhu U. (uhu)


Lesenswert?

Ich möchte aus einer VBA-Funktion heraus die Hintergrundfarbe derjenigen 
Zelle ändern, in der der Funktionsaufruf steht. Wie muß ich diese Zelle 
in der Funktion ansprechen?

von Uhu U. (uhu)


Lesenswert?

Application.ThisCell

von Karl (Gast)


Lesenswert?

Uhu Uhuhu schrieb:
> Application.ThisCell



Ob das geht?

Zeichne doch einfach ein Makro auf. Es müsste irgendwas mit Selection 
sein.

von Uhu U. (uhu)


Lesenswert?

Karl schrieb:
> Zeichne doch einfach ein Makro auf.

Ich weiß nicht, daß das geht: Die Hintergrundfarbe läßt sich nur 
konstant, oder mit diesem Monstrum "bedingte Formatierung" einstellen. 
Es soll aber von VBA aus passieren.

> Es müsste irgendwas mit Selection sein.

http://msdn.microsoft.com/en-us/library/office/aa215772%28v=office.11%29.aspx

Wenn das gesamte Rechenblatt neu gerechnet wird, kann so eine Funktion 
durch Formeln in vielen Zellen aufgerufen werden - mit der Selection 
wirst du das Ziel, diejenige Zelle bedingt einzufärben, aus der der 
Funktionsaufruf kommt, nicht erreichen.

Zudem habe ich im Moment nur Excel97 - dort funktioniert der ganze Müll 
nicht. Excel ist wirklich zum Abgewöhnen...

von Martin K. (maart)


Lesenswert?

Uhu Uhuhu schrieb:
> Zudem habe ich im Moment nur Excel97 - dort funktioniert der ganze Müll
> nicht. Excel ist wirklich zum Abgewöhnen...

Warum nimmst du nicht etwas freies unter deinem sonst so hochgelobten 
Linux?
Linux war '97 bestimmt auch noch nicht so weit wie heute.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Martin Kreiner schrieb:
> Warum nimmst du nicht etwas freies unter deinem sonst so hochgelobten
> Linux?

Das ist ganz sicher ein ganz doll hilfreicher Hinweis.

OpenOffice/LibreOffice ist sicher eine Alternative zu Excel, allerdings 
ist die Dokumentation noch schlechter.

von Zellbezug (Gast)


Lesenswert?


von Uhu U. (uhu)


Lesenswert?

Martin Kreiner schrieb:
> Warum nimmst du nicht etwas freies unter deinem sonst so hochgelobten
> Linux?

Weil ich ein altes Rechenblatt mit Druck-Layout habe, das von OO leider 
völlig verhunzt wird.

Im Übrigen gibts OO auch für Windows und sonstwas, worauf Java läuft - 
hat also mit Linux nicht die Bohne zu tun.

Martin Kreiner schrieb im Beitrag #3020911:
> Nebenbei war es für den Vogel auch wieder mal passend, einfach die
> Information, dass er eine uralte Version benutzt, ganz geschickt
> wegzulassen.

Nun ja, das spielt auch für meine Frage keine Rolle... Ich besorge mir 
jetzt halt mal eine etwas frischere Office-Version und hoffe, daß der 
Kittel dann geflickt ist.

Rufus Τ. Firefly schrieb:
> OpenOffice/LibreOffice ist sicher eine Alternative zu Excel, allerdings
> ist die Dokumentation noch schlechter.

Ja, das mit den Dokus für MS-Office ist wirklich schrecklich, ich ärgere 
mich jedesmal über dieses langatmige, inhaltsarme Geschwätz.

von Martin K. (maart)


Lesenswert?

Uhu Uhuhu schrieb:
> Martin Kreiner schrieb im Beitrag #3020911:
>> Nebenbei war es für den Vogel auch wieder mal passend, einfach die
>> Information, dass er eine uralte Version benutzt, ganz geschickt
>> wegzulassen.
>
> Nun ja, das spielt auch für meine Frage keine Rolle...

Das ist nicht dein Ernst, oder?
Das Funktionen erst in späteren Softwarefunktionen implementiert sind, 
oder jetzt anders umgesetzt werden, ist für dich undenkbar?

Uhu Uhuhu schrieb:
> Ich besorge mir
> jetzt halt mal eine etwas frischere Office-Version und hoffe, daß der
> Kittel dann geflickt ist.

Warum? Ist die Softwareversion vielleicht doch nicht so ganz unwichtig?
Ein einfaches "oh, ja, habe ich vergessen: Excel 97" aus deinem 
Mund/Tastatur muss wohl ein Ding der Unmöglichkeit sein.

von Karl (Gast)


Lesenswert?

Ich verstehe deine Problemstellung noch nicht ganz:

Uhu Uhuhu schrieb:
> Ich möchte aus einer VBA-Funktion heraus die Hintergrundfarbe derjenigen
> Zelle ändern, in der der Funktionsaufruf steht. Wie muß ich diese Zelle
> in der Funktion ansprechen?

Was für ein Funktionsaufruf? Wenn es ein VBA Aufruf ist, dann kannst du 
das Einfärben ja gleich mit übernehmen.

Uhu Uhuhu schrieb:
> Zudem habe ich im Moment nur Excel97 - dort funktioniert der ganze Müll
> nicht. Excel ist wirklich zum Abgewöhnen...

Da wird es zeit für ein Update.

Hier mal ein Makromitschnitt:

Range("C7").Select
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorLight2
        .TintAndShade = 0.399975585192419
        .PatternTintAndShade = 0
    End With

Wenn du eine bisschen if und for drumrum baust und über die Zellen 
laufen lässt, dann hast du was du willst.
Für schleifen nimmst du besser ActiveSheet.Cells(i, j).Select anstatt 
Range("C7").Select.

von Uhu U. (uhu)


Lesenswert?

Martin Kreiner schrieb:
> Das ist nicht dein Ernst, oder?

Doch, das ist mein voller Ernst.

> Das Funktionen erst in späteren Softwarefunktionen implementiert sind,
> oder jetzt anders umgesetzt werden, ist für dich undenkbar?

Das Problem war, überhaupt eine derartige Funktion in Excel-VBA zu 
finden - die Doumenttionen sind nämlich leider nicht das Gelbe vom Ei 
und VBA wird offenbar auch nicht von sehr vielen Excel-Fans benutzt.

Daß mein Fund dann in der gerade benutzten Version nicht läuft, ist zwar 
unschön, aber da mein olles Office 97 schon mindestens zwanzigmal 
abgeschrieben ist, hält sich die Einbuße, die ich durch Anschaffung 
einer neueren Version erleide in gerade noch erträglichen Grenzen...

> Ein einfaches "oh, ja, habe ich vergessen: Excel 97" aus deinem
> Mund/Tastatur muss wohl ein Ding der Unmöglichkeit sein.

Sorry, aber genau diese Frage habe ich mir bei Eröffnen des Threads 
gestellt und bin aus o.g. Gründen zu dem Schluß gekommen, daß das nicht 
nötig ist.

Und die Tatsache, daß auch du mir nicht die gesuchte Antwort geben 
konntest, spricht stark dafür, daß meine Überlegung nicht ganz falsch 
war ;-)

von Uhu U. (uhu)


Lesenswert?

Karl schrieb:
> Was für ein Funktionsaufruf? Wenn es ein VBA Aufruf ist, dann kannst du
> das Einfärben ja gleich mit übernehmen.

Ich habe 20 Zellen, in denen jeweils ein Funktionsaufruf nach folgendem 
Muster steht:
1
=RoterHintergrundWennWertXKleinerY(<formel>, 10)

Die Funktion gibt den Wert der <formel> zurück und färbt den Hintergrund 
der Zelle, in der der Funktionsaufruf steht rot, wenn  Ergebnis keiner 
10 ist.

Das Einfärben kann man entweder mit der Funktion "bedingte Formatierung" 
machen - dann passiert es nicht in der Funktion, sondern außerhalb als 
Eigenschaft der Zelle, was ziemlich umständlich und pflegeunfreundlich 
ist -, oder aus der Funktion heraus.

Nur: wenn man es in der VBA-Funktion machen will, dann muß man wissen, 
welche Zelle man ansprechen muß und genau darauf bezog sich meine Frage.

> Hier mal ein Makromitschnitt:
>
> Range("C7").Select
>     With Selection.Interior
>         .Pattern = xlSolid
>         .PatternColorIndex = xlAutomatic
>         .ThemeColor = xlThemeColorLight2
>         .TintAndShade = 0.399975585192419
>         .PatternTintAndShade = 0
>     End With
>
> Wenn du eine bisschen if und for drumrum baust und über die Zellen
> laufen lässt, dann hast du was du willst.

Das nutzt leider nichts, weil du das eigentliche Problem mit dem 
Range("C7").Select elegant umschiffst. Dafür muß das ThisCell 
eingesetzt werden, dann sollte es ab Excel 2003 so gehen, wie ich das 
will.

> Für schleifen nimmst du besser ActiveSheet.Cells(i, j).Select anstatt
> Range("C7").Select.

Damit hättest du aber die Färberei für alle Zellen in einem Aufruf 
gemacht, oder? Das wäre auch nicht Sinn der Sache, weil alles, nur nicht 
pflegefreundlich - das Spreadsheet wird seit über 10 Jahren benutzt und 
immer mal wieder angepaßt...

von Arc N. (arc)


Lesenswert?

Hat Excel COMEFROM implementiert scnr.
Die gesuchte Funktionalität gibt es aber tatsächlich...
Application.Caller
http://msdn.microsoft.com/en-us/library/office/ff193687.aspx

von Uhu U. (uhu)


Lesenswert?

Das muß ich mir genauer ansehen.

von Karl (Gast)


Lesenswert?

Sub Einfaerben()
Dim formel As String
formel = "ABS" 'Zeichenkette deiner Funktion
a = 10 'Zeilenanzahl
b = 20 'Spaltenanzahl

For i = 1 To a
For j = 1 To b

If InStr(1, ActiveSheet.Cells(i, j).Formula, formel) Then
 ActiveSheet.Cells(i, j).Interior.ColorIndex = 36
End If
Next j
Next i

End Sub

von Karl (Gast)


Lesenswert?

Da fehlt nur noch die Abfrage nach deinem Grenzwert. Ich hoffe das 
schaft du selbst. Es gibt aber noch mehr Wege.

von Karl (Gast)


Lesenswert?

Uhu Uhuhu schrieb:
> oder aus der Funktion heraus.

Die Formatierung aus der Funktion heraus geht nicht, weil die Funktion 
nicht auf die Hintergrundfarbe zugreifen kann. Eine Funktion (die aus 
einer Zelle aufgerufen wird) liefert immer nur einen Wert zurück, und 
kann auch keine Sub-Routinen aufrufen. Das wäre sicherheitstechnisch ein 
Fiasko.

von Uhu U. (uhu)


Lesenswert?

Karl schrieb:
> Die Formatierung aus der Funktion heraus geht nicht, weil die Funktion
> nicht auf die Hintergrundfarbe zugreifen kann.

Wo steht das?

> Das wäre sicherheitstechnisch ein Fiasko.

Es kommt immer darauf an, was man damit macht. So ganz pauschal gesagt 
ist jede Programmiersprache sicherheitstechnisch ein Fiasko, wenn sie 
aus mehr als einer Anweisung besteht ;-)

von Uhu U. (uhu)


Lesenswert?

Hier mal mein Versuchsbalon, der aber auf Ex97 die Farbe nicht ändert - 
Fehlermeldung gibts aber auch keine:
1
Public Function Test()
2
    X = Application.Caller.Interior.Color = vbRed
3
    Test = 4711
4
End Function

Wenn man in eine Zelle
1
=Test()
schreibt, dann wird in die Zelle 4711 geschrieben, aber die Farbe ändert 
sich nicht.

von Karl (Gast)


Lesenswert?

Uhu Uhuhu schrieb:
> Wo steht das?


Das habe ich mal irgendwo gelesen. Falls do doch eine Möglichkeit 
findest dann bitte hier posten. Über die lausige Dokumentation seitens 
MS hast du dich ja schon beschwert.

Uhu Uhuhu schrieb:
> Es kommt immer darauf an, was man damit macht.

Wenn du ein Excel-File öffnest, wo in einer Zelle steht =Böse(true) 
steht
und die Funktion so definiert ist:

Function Böse(bool)

if bool = true
 Löschen()
Endif

Sub Löschen()
 Lösche die Eigenen Dateien vom Uhu Uhuhu
End Sub

Dann weist du warum das nicht geht.

Uhu Uhuhu schrieb:
> X = Application.Caller.Interior.Color = vbRed

Zwei = in einer Zeile? Ob das ein Computer versteht?

Wenn du die Syntax richtig machst und die ganze Funktion in einer Sub 
aufrufst wird es funktionieren. Rufst du die Funktion aus dem Worksheet 
auf geht es nicht. Das ist so.

von Uhu U. (uhu)


Lesenswert?

Karl schrieb:
>> X = Application.Caller.Interior.Color = vbRed
>
> Zwei = in einer Zeile? Ob das ein Computer versteht?

Oh, das 'X = ' hatte ich versuchsweise in einem späteren Schritt, als 
dem eigentlichen Test reingepackt, um mir das Geschehen im Debugger 
anzusehen. Aber er nimmt es hin und in X steht hinterher der Wert False.

Offensichtlich interpretiert er das zweite = als Vergleichsoperator.

Deine Argumentation bezüglich Sicherheit überzeugt mich nicht, denn 
fatalen Uninn kann man mit einer einigermaßen mächtigen 
Programmiersprache immer anstellen - genau wie man mit einem Skalpell 
jemandem das Leben retten oder nehmen kann.

von Martin K. (maart)


Lesenswert?

@ Uhu:
Jetzt nur mal zum Verständnis: Du hast in der Tabelle sagen wir mal 1000 
Zellen, 100 davon sollen jetzt zum Beispiel rot hinterlegt werden, wenn 
ein gewisser Wert x unterschritten wird.
Soweit richtig?

Bleibt die Position dieser 100 Zellen im Datenblatt immer gleich?

Sollen diese 100 Zellen irgendwann mal rot gefärbt werden, wenn jetzt 
nicht mehr der Wert x sondern jetzt der Wert y unterschritten wird?

Wird in dem Datenblatt an irgendeiner Stelle eine bedingte Formatierung 
verwendet?

von Karl (Gast)


Lesenswert?

Uhu Uhuhu schrieb:
> Deine Argumentation bezüglich Sicherheit überzeugt mich nicht, denn
> fatalen Uninn kann man mit einer einigermaßen mächtigen
> Programmiersprache immer anstellen - genau wie man mit einem Skalpell
> jemandem das Leben retten oder nehmen kann.

Dann nochmal eine programmtechnische Argumentation. Die Eingabe einer 
Formel in einer Zelle verändert Cells.Value gültige Werte für die 
Eigenschaften sind Zahlenwerte und Strings. Somit darf deine Funktion 
nur werte dieses Typs zurückgeben, sonst gibt es den Fehler #Wert. Frag 
jetzt nicht wo das steht. aber es könnte sei das es so ist.

Hast du mal den Code oben probiert? Der sollte doch deine Probleme 
lösen.

Martin Kreiner schrieb:
> Du hast in der Tabelle sagen wir mal 1000
> Zellen, 100 davon sollen jetzt zum Beispiel rot hinterlegt werden, wenn
> ein gewisser Wert x unterschritten wird.

Aber nur wenn in der Zelle eine bestimmte Formel steht.

von Uhu U. (uhu)


Lesenswert?

Karl schrieb:
> Dann nochmal eine programmtechnische Argumentation.

Programmtechnisch kann man für fast alles Gegenargumente finden - 
deswegen überzeugt mich das nicht.

Ich denke, das ist eine grundsätzliche Debatte, die aber schon vor 
mindestens 30 Jahren abgehakt wurde: Es gab mal so pädagogisch 
angehauchte Informatiker, die wollten die Menschheit mit "der 
narrensicheren Programmierumgebung" beglücken. Als man merkte, daß man 
damit höchstens die Programmierer zum Narren macht, weil die sich an den 
herrlich ideologisch begründeten Regeln für "erzwungen sauberes 
Programmieren" abrackern mußten, um eigentlich einfache Sachen zu 
realisieren, die durch diesen kranken Ansatz schwer behindert, oder 
unmöglich gemacht wurden, hatte sich der ganze Spuk irgendwann 
stillschweigend von selbst erledigt.

Letzte Ausläufer davon kann man zuweilen im Basic-Biotop - in der 
Sparte, in der die Programmierer für Büroanwendungen ihr tristes Dasein 
fristen  - noch beobachten. (Versuche, den Technikern solche Bretter vor 
die Köpfe zu nageln, quittieren die gerne mit Fersengeld, was die 
Überlebenswahrscheinlichkeit des betreffenden Programmiersprachdialektes 
drastisch reduziert.)

Ich habe mein Problem mittlerweile ganz einfach und mühsam zu Fuß 
erledigt und bin - offen gesagt - von Excel-VBA fürs erste geheilt.

von Martin K. (maart)


Lesenswert?

Uhu Uhuhu schrieb:
> Ich habe mein Problem mittlerweile ganz einfach und mühsam zu Fuß
> erledigt und bin - offen gesagt - von Excel-VBA fürs erste geheilt.

Excel-VBA ist schon lustig.
Kannst du zumindest kurz andeuten, wie du es jetzt gelöst hast?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.