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?
Uhu Uhuhu schrieb: > Application.ThisCell Ob das geht? Zeichne doch einfach ein Makro auf. Es müsste irgendwas mit Selection sein.
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...
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.
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.
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.
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.
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.
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 ;-)
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...
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
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
Da fehlt nur noch die Abfrage nach deinem Grenzwert. Ich hoffe das schaft du selbst. Es gibt aber noch mehr Wege.
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.
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 ;-)
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.
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.
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.
@ 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?
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.