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:
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.
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?
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
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
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:
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
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.
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ß
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.
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.
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.