xaumichi
Goto Top

VBA Code je nach Reihe ausführen

Hallo!

Folgendes:

Ich habe einen (ziemlich langen) VBA - Code, der für 35 Zeilen gleich aussieht nur, dass stadt die Reihenbezeichnung halt anders aussieht.
Sprich einmal werden A15, C15, D15 und G15 bearbeitet und ein anderes mal A18, C18, D18 und G18, je nachdem in welcher Reihe eine Änderung stattfindet.

Also: wird B15 verändert --> Änderungen in A15, C15, D15 und G15
wird B18 verändert --> Änderungen in A18, C18, D18 und G18

Also gäbe es eine möglichkeit den selben Code zuverwenden, in dem halt einfach die passenden Reihen eingesetzt werden, durch eine Art "activeRow." oder so!

Ich hoffe, es ist verständlich, was ich meine.

LG mike

Content-ID: 147874

Url: https://administrator.de/contentid/147874

Ausgedruckt am: 22.11.2024 um 20:11 Uhr

Biber
Biber 28.07.2010 um 21:28:05 Uhr
Goto Top
Moin xaumichi,

ich bin nicht ganz sicher, welche neuen Erkenntnisse du nun von den Antwortenden erhoffst...

Die meisten Fünftklässler, ausgenommen diese unnützige Blagen meiner Nachbarin, würden dir sofort erzählen.
"Hey, auch in VBA, was immer das sein mag, gibt es doch bestimmt so was wie 'Function' oder 'Sub' oder 'Procedur' oder 'Method'.
Halt irgendwas, dass sich a) aufrufen lässt b) noch dem Aufruf und Rumrödeln wieder eine Zeile nach dem Aufruf weitermacht c) vielleicht auch noch einen Parameter 'Reihe' akzeptiert und verwursten kann."


Ehrlich, ich verstehe entweder die Frage nicht oder die Erwartungshaltung, die du hast.
Wenn du dir einen "(ziemlich langen) VBA-Code" zusammengeharkt hast, dann musst du bei VBA zwangsläufig schon mal in die Hilfe geschaut haben. Anders kommt niemand auf mehr als 3 Zeilen Code.

Bitte formulier doch mal um, was wir dir jetzt antworten können, das dir neue Aspekte oder Horizonte eröffnet.

Grüße
Biber
EffEins
EffEins 28.07.2010, aktualisiert am 18.10.2012 um 18:42:58 Uhr
Goto Top
Zitat von @Biber:

Wenn du dir einen "(ziemlich langen) VBA-Code" zusammengeharkt hast, dann musst du bei VBA
zwangsläufig schon mal in die Hilfe geschaut haben. Anders kommt niemand auf mehr als 3 Zeilen Code.
-->Makro aufzeichnen-->5 Zellen formatieren -->gefühlte 2.000 Zeilen Code
Man braucht die Hilfe höchstens um rauszufinden wie man den Rekorder startet face-smile

Bitte formulier doch mal um, was wir dir jetzt antworten können, das dir neue Aspekte oder Horizonte eröffnet.
Der Hinweise nach Sub, Parameter, etc. sollte reichen. ;)

Schau Dir das Beispiel von vorhin noch mal an: VBA - 2 Change-Ereignisse verknüpfen
Da steckt auch schon die halbe Antwort drin.

Gruß F1
xaumichi
xaumichi 28.07.2010 um 21:59:53 Uhr
Goto Top
Hm...naja, dann probier ich's halt mal anders:

Angenommen ich habe folgendendes Makro:

'----------------------------------------------------------------  
Private Sub Test()

If Range("A2").active (= true?) then                                   '(weiß jetzt nicht genau, ob ich das "=true" brauche)  
Range("A15").Interior.Color = RGB (255,0,0)  


End sub
'---------------------------------------------------------------  
'nun möchte ich dieses Makro für alle Zeilen von A:ZZ anwenden.
Sprich:

if Range("ZZ2").aktiv then
Range("ZZ15").Interior.Color = RGB (255,0,0)

usw.

Nun meine Frage:
Ist es möglich, dass ich diese "If - Abfrage"
Durch eine Abfrage nach der Aktiven Reihe vereinfache und somit das Makro viel kürzer mache, in dem ich das Range durch eine "activeCell.Row" "erweitere"?

In der Art:
'-----------------------------  
Private Sub Test_neu()

Range("ZZ, activeCell.Row").Interior.Color=RGB(255,0,0)  

End Sub
'-------------------------------  
Mein Problem:
Dieser Ausdruck funktioniert so nicht und habe nun schon seit 1h herumprobiert und in Foren gelesen, jedoch nichts passendes gefundn.
Darum erhoffe ich mir eine Hilfe bei der Entwicklung eines Makros, das ca. so funktioniert! =)

LG Mike

[Edit Biber] Codetags gesetzt, falls wir die Zeilennummern mal brauchen sollten beim Antworten. [/Edit]
76109
76109 28.07.2010 um 22:20:32 Uhr
Goto Top
Hallo xaumichi!

Versuch mal anstatt
Range("ZZ, activeCell.Row").Interior.Color=RGB(255,0,0)
das
Cells(ActiveCell.Row, "ZZ").Interior.Color=RGB(255,0,0)

Gruß Dieter
bastla
bastla 28.07.2010 um 22:35:08 Uhr
Goto Top
... oder auch
Cells(ActiveCell.Row + 13, ActiveCell.Column).Interior.Color = RGB(255, 0, 0)
BTW: Die Adress(bestandteil)e und den ursprünglichen Farbwert der zuletzt eingefärbten Zelle solltest Du (in globalen Variablen) zwischenspeichern - Du wirst ja vermutlich bei einer Änderung der aktiven Zelle die Umfärbung auch wieder rückgängig machen wollen ...

Grüße
bastla
EffEins
EffEins 28.07.2010 um 22:55:47 Uhr
Goto Top
Hi,
das war ja die ursprüngliche Frage:

Also gäbe es eine möglichkeit den selben Code zuverwenden, in dem halt einfach die passenden Reihen eingesetzt werden,

Erstelle eine Prozedur und übergebe als Parameter die zu bearbeitende Range.
Sub test()
Färben Range("A15:G15")  
Färben Range("A18:G18")  
End Sub

Sub Färben(rng As Range)
 rng.Interior.Color = RGB(255, 0, 0)
 rng.Font.Size = 18
 'usw  
End Sub

gruß F1
76109
76109 28.07.2010 um 22:58:40 Uhr
Goto Top
Hallo bastla!

Zitat von @bastla:
BTW: Die Adress(bestandteil)e und den ursprünglichen Farbwert der zuletzt eingefärbten Zelle solltest Du (in globalen
Variablen) zwischenspeichern - Du wirst ja vermutlich bei einer Änderung der aktiven Zelle die Umfärbung auch wieder
rückgängig machen wollen ...
Das könnte sich als etwas problematisch erweisen, falls z.B. das Worbook geschlossen und wieder geöffnet wird, dann ist die Variable nicht verfügbar/initialisiert, was wiederum zu einem Fehler führt. Insofern würde ich einfach die ganze Spalte oder entsprechenden Range-Bereich vor dem Neusetzen erst zurücksetzen.

Gruß Dieter
bastla
bastla 28.07.2010 um 23:04:57 Uhr
Goto Top
Hallo Dieter!
falls z.B. das Worbook geschlossen und wieder geöffnet wird, dann ist die Variable nicht verfügbar/initialisiert
Doch (wenn sie vor dem Code unter "Allgemein / Deklarationen" deklariert wird - sie soll ja global sein); sie hat dann nur den Wert 0, der sich ja abfragen lässt ...

Grüße
bastla
76109
76109 28.07.2010 um 23:30:06 Uhr
Goto Top
Hallo bastla!

Zitat von @bastla:
> falls z.B. das Worbook geschlossen und wieder geöffnet wird, dann ist die Variable nicht verfügbar/initialisiert
Doch (wenn sie vor dem Code unter "Allgemein / Deklarationen" deklariert wird - sie soll ja global sein); sie hat dann
nur den Wert 0, der sich ja abfragen lässt ...
Ich verstehe schon, was Du meinst, aber angenommen die Zelle A18 ist rot und das Workbook wird geschlossen, dann ist die Zelle beim öffnen immer noch rot und die Variable mit Wert 0 entspricht keiner gültigen Zell-Adresse. Oder steh ich jetzt irgendwie auf der Leitung? face-wink

Gruß Dieter
bastla
bastla 29.07.2010 um 00:00:33 Uhr
Goto Top
Hallo Dieter!

Damit hast Du dann natürlich Recht - so global, dass sie auch im "Workbook_BeforeClose"-Ereignis verfügbar wäre, bekomme ich die Variable wohl nicht hin (aber auf einen definierten Standard-Farbwert könnte die eingefärbte Zelle - per "ActiveCell" und Offsetwert - immer noch gebracht werden) ...

Die Möglichkeit, die eine oder andere ohnehin nur nutzlos herumlungernde Zelle einer sinnvollen Verwendung zuzuführen und dort, flankiert durch ein Zahlenformat ";;;", die Werte zu hinterlegen, würde ich im Fall des Falles vermutlich auch noch erwägen, aber beim Gedanken, in die Registry (Stichwort "SaveSetting") zu schreiben, wäre dann Schluss mit lustig ... face-wink

Grüße
bastla
xaumichi
xaumichi 29.07.2010 um 07:53:44 Uhr
Goto Top
Hallo!

Der Tip von Didi1954 hat super geklappt.
Genau so hab ich mir das vorgestellt.

@bastla: Ich habe eine "Rückfärbe" - Procedure gemacht.

@ EffEins: Hm....wenn ich das richtig verstanden habe, dann wird bei dir eine Reihe nach der Andren eingefärbt, oder? (das wäre nicht ganz das, das ich gebraucht hätte!)

Trotzdem DANKE an alle!

LG Mike
xaumichi
xaumichi 29.07.2010 um 07:59:39 Uhr
Goto Top
Aber eine Frage hätte ich doch noch:

Der Befehl:
Cells(ActiveCell.Row, "ZZ").Interior.Color=RGB(255,0,0) (funktioniet auch mit Range(ActiveCell.Row, "ZZ").Interior.Color=RGB(255,0,0))

aber ist es möglich durch diese Schreibweise einen Bereich zu definieren, wie es mit einem "gewöhnlichen" Range möglich ist??

LG Mike
76109
76109 29.07.2010 um 08:10:50 Uhr
Goto Top
Hallo bastla!

Zitat von @bastla:
Damit hast Du dann natürlich Recht - so global, dass sie auch im "Workbook_BeforeClose"-Ereignis verfügbar
wäre, bekomme ich die Variable wohl nicht hin...
Doch per Modul-Public-Variable geht das schon, aber wenn der betroffene Bereich eine standardmäßige gleiche Einfärbung hat, ist es doch viel einfacher, diesen Bereich erst zurückzusetzen und dann erst die Active Zeile neu einzufärben...z.B.
Range("A15:Z35").Interior.ColorIndex = xlNone  
ActiveCell.Offset(13, 0).Interior.Color = RGB(255, 0, 0)

Gruß Dieter
76109
76109 29.07.2010 um 08:19:19 Uhr
Goto Top
Hallo xaumichi!

Wenn z.B. die Zelle A10 die aktive Zelle ist, dann wird mit dieser Codezeile der Bereich A23:H23 eingefärbt.
Range(ActiveCell.Offset(13, 0), ActiveCell.Offset(13, 7)).Interior.Color = RGB(255, 0, 0)

Gruß Dieter
xaumichi
xaumichi 29.07.2010 um 09:06:30 Uhr
Goto Top
Okey, habs durch Probieren auch gerade geschafft! ;)

LG Mike
xaumichi
xaumichi 29.07.2010 um 20:08:52 Uhr
Goto Top
Hm...irgendwien finde ich die Schreibweise mit "....Offset..." nicht wirklich übersichtlich, das man ja sehr viel herumrechnen muss, oder?

Gäbe es nicht die möglichkeit das Range so zu definieren:

Range((ActiceCell.Row, "A2"), (ActiveCell.Row, "N"))

nur funktioniert dieser Ausdruck leider nicht! face-sad

[Edit Biber] Codetags berichtigt. [/Edit]
bastla
bastla 29.07.2010 um 20:14:01 Uhr
Goto Top
Hallo xaumichi!

Und so?
Range(cells(ActiceCell.Row, "A"), cells(ActiveCell.Row, "N"))
Grüße
bastla
xaumichi
xaumichi 29.07.2010 um 20:50:53 Uhr
Goto Top
Hm...nö, bekomm ich auch einen fehler.

face-sad

LG
bastla
bastla 29.07.2010 um 20:56:27 Uhr
Goto Top
Hallo xaumichi!
nö, bekomm ich auch einen fehler.
Nur für den unwahrscheinlichen Fall, dass dieser Fehler irgendeine Bedeutung haben könnte - wäre es dann ev sinnvoll, den Inhalt der Fehlermeldung hier wiederzugeben?

Bei mir funktioniert übrigens
Range(Cells(ActiveCell.Row, "A"), Cells(ActiveCell.Row, "N")).Interior.Color = RGB(255, 0, 0)
Grüße
bastla
xaumichi
xaumichi 29.07.2010 um 21:49:56 Uhr
Goto Top
Oh, sry.
Ich sitzt heute schon so lang vor dem Kasten und tüftle herum, dass ich schon ganz weich bin in der Birne. Sry

 Range(Cells(ActiceCell.Row, "A"), Cells(ActiveCell.Row, "N")).Interior.Color = RGB(255, 255, 255)  

Laufzeitfehler '424'

Objekt erforderlich
bastla
bastla 29.07.2010 um 21:54:55 Uhr
Goto Top
Hallo xaumichi!

Wenn Du das in "Worksheet_SelectionChange" einsetzen willst, dann eher:
Range(Cells(Target.Row, "A"), Cells(Target.Row, "N")).Interior.Color = RGB(255, 255, 255)
Grüße
bastla
xaumichi
xaumichi 29.07.2010 um 22:09:40 Uhr
Goto Top
Hm...okey, soweit funktioniert es mal!

Werd ich morgen dann vollständig ausprobieren, thx schon mal!

schönen abend noch!

LG Mike
bastla
bastla 29.07.2010 um 22:11:58 Uhr
Goto Top
Hallo xaumichi!

Noch ein Tipp: Vermutlich nicht ganz das, was Du erreichen willst, aber vielleicht trotzdem interessant: SmartTools CellSpot 2.0

Grüße
bastla
xaumichi
xaumichi 30.07.2010 um 10:30:22 Uhr
Goto Top
Hallo!

So. neuer Tag, neues Glück!

Ich habe jetzt ein bisschen mit dem "Target...." oder dem "ActiveCell.Row".... herumprobiert.

Jetzt gibds da ein großes Problem:
(kurz zur Erklärung: Aufgabe ist es, in einer Reihe 4 Zeiten einzutragen)

Es gibt große Unterschiede ob ich nach dem Eintragen einer Zeit mit:

-) mit der Pfeiltast in die nächste Zelle springe
-) mit Enter bestätige und dann mit der Maus in die nächste Zelle springe
-) ohne bestätigen, gleich mit der Maus in die nächste Zelle gehe

Denn so lautet die Befehlzeile einmal:

Range(Cells(Target.Row, "A"), Cells(Target.Row, "N")).Interior.Color = RGB(255, 255, 255)  

einmal

Range(Cells(Target.Row-1, "A"), Cells(Target.Row-1, "N")).Interior.Color = RGB(255, 255, 255)  

also kann ich diese möglichkeit den selben Code für alle 35 Zeilen zu verwenden, oder?

wie würde es aussehen, wenn ich eine CASE-Abfrage mache, je nach dem in welcher Zelle ich stehe und dann in den Code springe, in dem die fixen Bereiche stehen.
sprich:
Range("A1, A6").Interior.Color = RGB(255, 255, 255)  

oder wird das VBA - Programm so zu lange. (wenn eine CASE ca. 400 Zeilen hat!!)

ODER:

beim markieren und Ändern einer Zelle im Bereich B15:B53 wird die Reihe, in der etwas geändert wurde einer Variable zugewiesen und diese Variable wird dann jeweils als "Reihenangabe" zu den Bereichszuweisungen in den Formatierungsbefehln übergeben.


LG Mike
76109
76109 30.07.2010 um 11:37:52 Uhr
Goto Top
Hallo Mike!

Irgendwie steige ich da nicht so ganz durch?

Zitat von @xaumichi:
Ich habe jetzt ein bisschen mit dem "Target...." oder dem "ActiveCell.Row".... herumprobiert.

Jetzt gibds da ein großes Problem:
(kurz zur Erklärung: Aufgabe ist es, in einer Reihe 4 Zeiten einzutragen)

Es gibt große Unterschiede ob ich nach dem Eintragen einer Zeit mit:

-) mit der Pfeiltast in die nächste Zelle springe
-) mit Enter bestätige und dann mit der Maus in die nächste Zelle springe
-) ohne bestätigen, gleich mit der Maus in die nächste Zelle gehe

Denn so lautet die Befehlzeile einmal:

Range(Cells(Target.Row, "A"), Cells(Target.Row, "N")).Interior.Color = RGB(255, 255,  
> 255)

einmal

Range(Cells(Target.Row-1, "A"), Cells(Target.Row-1, "N")).Interior.Color = RGB(255, 255,  
> 255)
Das Target enthält die Zell-Adresse der Zelle, in der eine Änderung stattgefunden hat, unabhängig davon, ob die Maus, Pfeil- oder Return-Taste betätigt wurde.

Also, was willst Du nun mit dieser Tatsache (Maus, XY-Taste) den nun genau anfangen? Nenn mal ein explizites Beispiel!

Gruß Dieter
xaumichi
xaumichi 30.07.2010 um 22:50:48 Uhr
Goto Top
Abend!

Ich weiß nicht warum das so war (vl hatte ich eine Tipfehler oder so), aber wenn ich die Eingabe mit der Enter-Taste bestätigt habe, so wurden die Formatierungen etc. für die Zeile darunter eingetragen, wenn ich jedoch einen Eintrage gemacht habe und dann mit der Pfeiltast eine Zelle weitergesprungen bin, dann haben die Formatierungen usw. super gekplappt.

Naja, auf jeden Fall habe ich die ganzen Befehle für die Bereichszuweisung dann noch mal neu geschrieben und dann hats wunderbar geklappt, so wie ich mir das ganze vorgestellt habe! =)

Also, dein Lösungsweg funktioniert super! :D

THX, LG
Mike