Forum: PC Hard- und Software Excel Zellen überwachen und überschreiben


von Excel Neuling (Gast)


Lesenswert?

Hallo lieber Forum,


ich bin neu in Excel. Und benötige einen Makro der mir einen 
Zellenbereich überwacht(soweit bin ich :) ) Allerdings möchte ich dass 
bei jeder Änderung diese Formel:
ActiveCell.FormulaR1C1 = 
"=IF(ISNUMBER(INDIRECT(""A""&ROW()-1)),INDIRECT(""A""&ROW()-1)+1,1)"
dort reingeschrieben wird.
Außerdem man muss davon ausgehen dass die Zeilen gelöscht werden 
können!!!
Ich habe bis jetzt nur mehrmals das Programm ins endlose Schleife 
gebracht :(
Für jede Weitere Hilfe bin ich sehr dankbar.

Mein Stand:
1
Private Sub Worksheet_Change(ByVal Target As Range)
2
If Not Application.Intersect(Target, Range("A4:A20")) Is Nothing Then
3
Range("A4").Select
4
ActiveCell.FormulaR1C1 = "=IF(ISNUMBER(INDIRECT(""A""&ROW()-1)),INDIRECT(""A""&ROW()-1)+1,1)"
5
Range("A4").Select
6
Selection.AutoFill Destination:=Range("A4:A20"), Type:=xlFillDefault
7
'MsgBox "Funkrioniert"
8
End If
9
End Sub

von Rainer V. (rudi994)


Lesenswert?

Excel Neuling schrieb:
> bis jetzt nur mehrmals das Programm ins endlose Schleife gebracht

Wenn eine Event-Routine für dieselbe Tabelle das gleiche Ereignis erneut 
auslöst, dann folgt Rekursion, Endlosschleife, Stapelüberlauf. Im o.g. 
Fall durch Ändern von Zelleninhalten innerhalb von Worksheet_Change(). 
Sowas kann übrigends auch in z.B. Worksheet_SelectionChange() passieren, 
wenn eine Bereichauswahl innerhalb dieser Event-Routine geändert wird.

Zu o.g. Problem habe ich keine Lösung. Mir scheint auch, daß Formel 
"=IF(...)" Syntaxfehler enthält, z.B. Komma anstatt Semikolon (;), 
fehlende und/oder falsche Parameter in z.B. INDIRECT(...). Zudem gibt es 
in meinem Excel Probleme mit engl.-sprachigen Formeln in Zellen.

von Excel Neuling (Gast)


Lesenswert?

Danke für die Antwort

Rainer V. schrieb:
> Zu o.g. Problem habe ich keine Lösung. Mir scheint auch, daß Formel
> "=IF(...)" Syntaxfehler enthält, z.B. Komma anstatt Semikolon (;),
> fehlende und/oder falsche Parameter in z.B. INDIRECT(...). Zudem gibt es
> in meinem Excel Probleme mit engl.-sprachigen Formeln in Zellen.

Ich habe diesen Befehl du Makroaufnahme mir übersetzen lassen.
Das hat er mir so rausgespukt



zu o.g. kann man vielleicht die Change-Abfrage mit eine Vergleichung 
verknüpfen.
Dafür brauche ich aber wissen, wie man ein Index der Zelle auslesen 
kann.

z.B.

A1 = 1
A2= 2

Kann mir da jmd. weiter Helfen?

von Sascha W. (sascha-w)


Lesenswert?

Excel Neuling schrieb:
> Danke für die Antwort
>
> Rainer V. schrieb:
>> Zu o.g. Problem habe ich keine Lösung. Mir scheint auch, daß Formel
>> "=IF(...)" Syntaxfehler enthält, z.B. Komma anstatt Semikolon (;),
>> fehlende und/oder falsche Parameter in z.B. INDIRECT(...). Zudem gibt es
>> in meinem Excel Probleme mit engl.-sprachigen Formeln in Zellen.
>
> Ich habe diesen Befehl du Makroaufnahme mir übersetzen lassen.
> Das hat er mir so rausgespukt
>
das ist eigentlich normal, im VBA werden immer die englichen 
Funktionsnamen verwendet.


> zu o.g. kann man vielleicht die Change-Abfrage mit eine Vergleichung
> verknüpfen.
> Dafür brauche ich aber wissen, wie man ein Index der Zelle auslesen
> kann.
>
> z.B.
>
> A1 = 1
> A2= 2
>
Target ist ja ein Rangeobjekt:
mit Target.Row / Target.Column hast die Zeilen/Spaltennummer, oder wenn 
mehrere Zellen zur gleichen Zeit geändert werden (hmm, geht das 
überhaupt - noch nicht probiert, vielleicht beim kopieren) dann hast du 
die 1.Zeile/1.Spalte und in Target.Rows.Count / Target.Columns.Count die 
Anzahl der Zeilen/Spalten

Sascha

von Rainer V. (rudi994)


Lesenswert?

Sascha W. schrieb:
> im VBA werden immer die englichen Funktionsnamen verwendet.

Formel aufzeichnen mit Makrorekorder hatte ich noch nicht. Habe es eben 
getestet, Sprache ist Englisch und Komma anstatt Semikolon ist korrekt.

Zum Verhindern der Endlosschleife habe ich die Ereignisse ein- und 
ausgeschaltet: Application.EnableEvents am Anfang der Event-Routine auf 
False und am Ende wieder auf True setzen. EnableEvents bleibt jedoch 
ausgeschaltet, wenn die Abarbeitung vor dem Zurücksetzen auf True wg. 
eines Fehlers abgebrochen wird. Die Ereignisse müssen dann gesondert 
wieder eingeschaltet werden, sonst werden keine mehr ausgelöst:
1
 Sub EnableEvents_einschalten ()
2
    Application.EnableEvents = True
3
End Sub

Oder Fehlerbehandlung innerhalb der Event-Routine:
1
 Sub Worksheet_Change(ByVal Target As Range)
2
    On Error Goto ErrHnd
3
    Application.EnableEvents = False
4
    '... weitere Verarbeitung
5
ErrHnd: Application.EnableEvents = True
6
End Sub

Verbesserungen gab es auch, wenn ich Zelle A4 nur zur Eingabe genommen 
und Ausgaben (von reinen Zahlen) auf Bereich A5:A20 beschränkt habe. Mit 
dem AutoFill für Formeln gibt es bei mir aber noch Probleme.

Excel Neuling schrieb:
> ... INDIRECT(""A""&ROW()-1)+1

Was bedeutet Zeile()-1)+1? Wenn das einen Bezug auf die Zelle ergibt, 
die auch die Formel enthält, dann wird daraus ein Zirkelbezug. LG

von Excel Neuling (Gast)


Lesenswert?

Hallo Rainer V.,

danke für die Antwort.
Sorry für späte Rückmeldung. wurde einen anderen Projekt zugeordnet , 
dass dies komplett vergessen habe.

Mein code sieht mit deiner Hilfe so aus:
1
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
2
3
Application.EnableEvents = False
4
5
If Not Application.Intersect(Target, Range("A4:A20")) Is Nothing Then
6
Range("A4").Select
7
ActiveCell.FormulaR1C1 = "=IF(ISNUMBER(INDIRECT(""A""&ROW()-1)),INDIRECT(""A""&ROW()-1)+1,1)"
8
Range("A4").Select
9
Selection.AutoFill Destination:=Range("A4:A20"), Type:=xlFillDefault
10
MsgBox "Funkrioniert"
11
End If
12
13
14
Application.EnableEvents = True
15
16
End Sub

Und es funktioniert!!!!!
Allerding der Benutzer soll eine Möglichkeit haben eine  Zeile zu 
löschen. Mein Makro aber spring beim klicken in den ausgesuchten Bereich 
immer in A4. Das heist wenn der Benutzer markiert die Zeile die er 
Löschen möchte, springt der in A4 und somit kann er dann die Zeile gar 
nicht löschen.

Rainer V. schrieb:
> Excel Neuling schrieb:
>> ... INDIRECT(""A""&ROW()-1)+1
>
> Was bedeutet Zeile()-1)+1? Wenn das einen Bezug auf die Zelle ergibt,
> die auch die Formel enthält, dann wird daraus ein Zirkelbezug. LG

Hier überwacht er die obige Zeile und dann setzt er den Wert +1

LG

von Rainer V. (rudi994)


Lesenswert?

Ja gut, diese IF-Formel funktioniert bei mir jetzt auch. Wenn ich in A3 
etwas eingebe, erscheint eine Liste von durchnummerierten Zahlen.

Excel Neuling schrieb:
> Makro aber spring beim klicken in den ausgesuchten Bereich immer in A4.

Wenn das unerwünscht ist, dann darf Range("A4").Select nicht verwendet 
werden. Der Bezug auf A4 muß in die anderen Befehle integriert werden:
  Range("A4").FormulaR1C1 = ...
  Range("A4").AutoFill ...

Im überwachten Bereich können dann Zeilen gelöscht werden, wobei jedoch 
die darunterliegenden Zeilen nach oben rücken und evtl. überschrieben 
werden, da der Bereich ja automat. mit Zahlen/Formeln aufgefüllt wird.

von Excel Neuling (Gast)


Lesenswert?

Dankeschön es klappt wunderbar.
Jetzt nur der letzter Schritt:
 beim löschen einer Zeile erfolgt keine aut. Vervolständigung des 
Bereiches. ERst bei wiederklicken in den ausgewählten Bereich.
Das heisst wenn ich eine Zeile lösche, anstatt der Nummerierung von 1 
bis 16, erfolgt die Nummerierung von 1 bis 15. Und erst wenn ich in den 
Bereich wiederklicke wird er aktualisiert auf 1 bis 16.
Kann man die Aktualisierung irgendwie einpflegen?

Gruß

von Rainer V. (rudi994)


Lesenswert?

Dazu fällt mir nichts ein. Bei mir funktioniert es, wie es soll. Gebe 
ich in A3 z.B. die Zahl 1 ein, wird A4:A20 mit den Zahlen 2 bis 18 
gefüllt. Gebe ich in A3 Text ein, kommen in A4:A20 die Zahlen 1 bis 17.

Ich kann auch bis zu mehrere Zeilen löschen, danach kommt wieder die 
Zahlenliste entsprechend dem Inhalt von A3. Zu beachten: das AutoFill 
füllt A4:A20 nicht mit den durchnummerierten Zahlen, die der Benutzer zu 
sehen bekommt, sondern mit einer IF-Formel entsprechend wie in A4.

von Excel Neuling (Gast)


Lesenswert?

Rainer V. schrieb:
> Ich kann auch bis zu mehrere Zeilen löschen, danach kommt wieder die
> Zahlenliste entsprechend dem Inhalt von A3. Zu beachten: das AutoFill
> füllt A4:A20 nicht mit den durchnummerierten Zahlen, die der Benutzer zu
> sehen bekommt, sondern mit einer IF-Formel entsprechend wie in A4.

Ja das funktioniert auch, aber sobald du eine Zeile löschst und klickst 
dann auf z.B. B4 dann stellt er nicht die Formeln wieder her bis man in 
den Überwachten Bereich klickt.

von Rainer V. (rudi994)


Lesenswert?

Excel Neuling schrieb:
> sobald du eine Zeile löschst und klickst dann auf z.B. B4

Um kein Mißverständnis aufkommen zu lassen: B4 ist eine einzelne Zelle 
und liegt nicht im Überwachungsbereich A4:A20. Wenn ich B4 lösche, 
passiert auch bei mir weiter nichts besonderes. Lösche ich aber die 
Zeile 4, dann wird die Zahlenliste in A4:A20 wieder aufgefüllt.

Hinzu kommt, daß Du im 1. Beispiel das Change-Event und im Beispiel 
danach das SelectionChange-Event verwendest. Bei mir ist es jetzt so, 
daß ich die Makros für beide Events habe. Funktioniert, wie gewünscht.

> stellt er nicht die Formeln wieder her bis man in
> den Überwachten Bereich klickt

Das ist schon klar, wenn beim Löschen einer Zelle oder Zeile die Auswahl 
(Selection) nicht im Überwachungsbereich liegt oder wenn die Auswahl 
durch das Löschen nicht geändert wird. Bei Letzterem wird ja auch das 
Event SelectionChange nicht ausgelöst. Beim Change-Event ist das anders. 
Es wird ausgelöst, wenn der Inhalt einer Zelle geändert wird, und das 
ist auch der Fall, wenn z.B. im Überwachungsbereich eine Zelle gelöscht 
wird oder wenn eine Zeile gelöscht wird, in der sich eine überwachte 
Zelle befindet.

von Excel Neuling (Gast)


Lesenswert?

Vielen dank.
Jetzt habe ich auch den Unterschied verstanden.
Und es klappt alles :)

Gruß

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.