Zeilen löschen/einfügen - EVENT?

Hallo,

erstmal muss ich sagen das Forum is spitze - hat mir schon oft geholfen!

Ich hätte ein paar excel vba fragen - im inet hab ich nichts passendes gefunden.

  1. Gibt es ein Event das ausgelöst wird wenn der Benutzer eine Zeile löscht oder einfügt? ich möchte nämlich wenn er das macht, bestimmte zeilen auch löschen bzw einfügen!?

  2. wie finde ich unter VBA eine formel die hinter einer zelle sitzt heraus? ich möchte dem benutzer nicht erlauben in manche zellen zu schreiben - zellschutz geht nicht, weil das das einfügen und löschen von zeilen verhindert - also hab ich mir gedacht ich merk mir was in der zelle stand und schreibs nachher einfach wieder rein! funktioniert auch wunderbar nur bei formeln nimmt er nicht die formel sonder die zahl, und ohne formeln funktioniert nix mehr!

  3. die dritte und letzte frage bezieht sich wieder auf ein event. und zwar möchte ich wissen was in einer zelle als letztes stand bevor sie editiert wurde. mit doppelklick gehts, aber wenn der benutzer hinnavigiert und einfach zum schreiben beginnt kann er den doppelklick umgehn. mit selection_change gehts auch nicht weil ich den markierten wert schon wo anders brauch.

danke schon mal für eure antworten, ich hoff ihr könnt mir helfen!

mfg

Hi Wotan,

  1. Gibt es ein Event das ausgelöst wird wenn der Benutzer eine
    Zeile löscht oder einfügt? ich möchte nämlich wenn er das
    macht, bestimmte zeilen auch löschen bzw einfügen!?

Worksheet_Change

  1. wie finde ich unter VBA eine formel die hinter einer zelle
    sitzt heraus?
    ich möchte dem benutzer nicht erlauben in manche
    zellen zu schreiben - zellschutz geht nicht, weil das das
    einfügen und löschen von zeilen verhindert - also hab ich mir
    gedacht ich merk mir was in der zelle stand und schreibs
    nachher einfach wieder rein! funktioniert auch wunderbar nur
    bei formeln nimmt er nicht die formel sonder die zahl, und
    ohne formeln funktioniert nix mehr!

Formula, FormulaLocal,FormulaR1C1

  1. die dritte und letzte frage bezieht sich wieder auf ein
    event. und zwar möchte ich wissen was in einer zelle als
    letztes stand bevor sie editiert wurde. mit doppelklick gehts,
    aber wenn der benutzer hinnavigiert und einfach zum schreiben
    beginnt kann er den doppelklick umgehn. mit selection_change
    gehts auch nicht weil ich den markierten wert schon wo anders
    brauch.

Verstehe ich nicht, du schriebst doch oben:

„also hab ich mir gedacht ich merk mir was in der zelle stand und schreibs nachher einfach wieder rein! funktioniert auch wunderbar…“

Du schreibst in Modul1 ganz oben
Option Explicit
Public Wert

In Tabelle1 schreibst du:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Wert „“ Then Target.Value = Wert
Application.EnableEvents = True
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Wert = Target.Value
End Sub

Dann sind Neueingaben erlaubt, aber keine Veränderung.

Das mit Formeln und Zeilen einfügen habe ich jetzt berücksichtigt.

Gruß
Reinhard

Erstmals danke für die schnelle Antwort!

Worksheet_Change

ja, aber woher weis ich das eine zeile gelöscht wurde und nicht nur irgendein text verändert? welche eigenschafte o.ä. sagt mir das?

Formula, FormulaLocal,FormulaR1C1

Mit formulaLocal funktionierts ganz gut, jedoch nur bei +/- berechnungen, wenn ich SUMME hab dann kommt ein #NAME? obwohl die formel stimmt.
ein calculate danach hat sich auch als nutzlos erwiesen.

Du schreibst in Modul1 ganz oben
Option Explicit
Public Wert

In Tabelle1 schreibst du:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Wert „“ Then Target.Value = Wert
Application.EnableEvents = True
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Wert = Target.Value
End Sub

OK, folgendes Szenario:

Ich hab den Cashplan für Januar mit Empfänger, Zweck, Betrag u Datum. ein paar zeilen darunter der für februar, märz, usw…

wenn ich jetzt den betrag bei empfänger A im Februar änder, soll sich der betrag auch in allen folgemonaten ändern. gleiches gilt für löschen von zeilen. wenn ich C lösche, soll C auch nicht mehr in den folgemonaten sein.

Dann sind Neueingaben erlaubt, aber keine Veränderung.

d.h. es sind neueingaben, aber auch veränderungen erlaubt, jedoch nur in bestimmten zellen. dafür hab ich aber schon eine funktion geschrieben die mir sagt wo ich ändern darf.

wenn ich einen betrag änder, und vorher mit doppelklick in die zelle geklickt habe - funktionierts. wenn man aber gleich reinschreibt gehts nicht weil ich kein event hab wo ich die daten vorbereiten kann. das war meine frage.
und das mitn zeilen löschen is auch noch offen …

danke nochmal für deine hilfe

mfg

Hi Wotan,

Worksheet_Change

ja, aber woher weis ich das eine zeile gelöscht wurde und
nicht nur irgendein text verändert? welche eigenschafte o.ä.
sagt mir das?

Man müßte die Zeilenanzahl von Userange vor und nach jedem Change überprüfen.

Formula, FormulaLocal,FormulaR1C1

Mit formulaLocal funktionierts ganz gut, jedoch nur bei +/-
berechnungen, wenn ich SUMME hab dann kommt ein #NAME? obwohl
die formel stimmt.

Sub tt()
Range(„A1“).FormulaLocal = „=Summe(B1:B5)“
End Sub

Du schreibst in Modul1 ganz oben
Option Explicit
Public Wert

In Tabelle1 schreibst du:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Wert „“ Then Target.Value = Wert
Application.EnableEvents = True
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Wert = Target.Value
End Sub

OK, folgendes Szenario:

Ich hab den Cashplan für Januar mit Empfänger, Zweck, Betrag u
Datum. ein paar zeilen darunter der für februar, märz, usw…

wenn ich jetzt den betrag bei empfänger A im Februar änder,
soll sich der betrag auch in allen folgemonaten ändern.
gleiches gilt für löschen von zeilen. wenn ich C lösche, soll
C auch nicht mehr in den folgemonaten sein.

Dann sind Neueingaben erlaubt, aber keine Veränderung.

d.h. es sind neueingaben, aber auch veränderungen erlaubt,
jedoch nur in bestimmten zellen. dafür hab ich aber schon eine
funktion geschrieben die mir sagt wo ich ändern darf.

wenn ich einen betrag änder, und vorher mit doppelklick in die
zelle geklickt habe - funktionierts. wenn man aber gleich
reinschreibt gehts nicht weil ich kein event hab wo ich die
daten vorbereiten kann. das war meine frage.
und das mitn zeilen löschen is auch noch offen …

Du hast da einige zusammenhängende komplexe Vorhaben.
Man könnte „Zeilen einfügen“ aus dem rechten Kontextmenu der Maus entfernen/deaktivieren und durch einen Makroaufruf ersetzen. Das Gleiche für Einfügen–Zeilen.

Das Gleiche für Zeilen Löschen. Dann bestimmt man selbst im Code was genau geschehen soll oder nicht.

Dadurch kann man das Worksheet_Change Ereignis durch EnableEvents =False raushalten und es tritt nur dann ein wenn Zellwerte geändert werden, aber nicht beim Einfügen von Zeilen.

Aber ist mir jetzt bei der Hitze zu aufwendig *schwitz*

Gruß
Reinhard

Mit formulaLocal funktionierts ganz gut, jedoch nur bei +/-
berechnungen, wenn ich SUMME hab dann kommt ein #NAME? obwohl
die formel stimmt.

Sub tt()
Range(„A1“).FormulaLocal = „=Summe(B1:B5)“

Hi Peter,

Sub tt()
Range(„A1“).FormulaLocal = „=Summe(B1:B5)“

Hi PeterM!

Du musst die englischen (!!) Bezeichnungen nehmen, also
Range(„A1“).FormulaLocal = „=SUM(B1:B5)“

Dadurch sind Excel-Makros (und damit das ganze Workbook)
unabhängig von der Sprache der Excel-Version. Die Verwendung
der Landessprache war ein „Bug“ in alten Excel-Versionen.

Danke für den tipp, ich ersetzt jetzt einfach jedes =SUMME durch ein =SUM dann funktionierts! DANKE!

Falls Du die englischen Befehle nicht kennst, einfach mal in
die Zelle den deutschen Befehl mschreiben und im Makro mit
MsgBox(Range(„A1“).FormulaLocal) anzeigen lassen.

Das Problem bestand eh nur bei SUMME, die Bezeichnungen für die anderen Funktionen brauch ich daher nicht.

Mein Problem mit dem Zeilen löschen/einfügen, hab ich auch hingekriegt - Danke an reinhard. Ich nehm mir jetzt einfach alle einträge vom aktuellen Monat her und schau was sich verändert hat - etwas aufwändig aber es funktioniert.

Jetzt bleibt mir nur mehr das mit dem Doppelklick und dem „Sofort-Reinschreiben“ über - aber ich glaub wenn ich mein ganzes Programm komplett umstrukturiere kann ichs mit selection_change machen.

Nochmal herzlichen Dank an euch zwei!

mfg

Hab noch eine kleine frage!

Ich hab mittlerweile herausgefunden das man die letze beschriebene zeile mittels vba code so findet:

LowestRow = Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row

doch wenn noch nichts drinnen steht krieg ich nen fehler - hat jemand eine ahnung wie ich das abfangen könnt?

mfg

Es klappt bei einem deutschen Excel.

Du musst die englischen (!!) Bezeichnungen nehmen, also
Range(„A1“).FormulaLocal = „=SUM(B1:B5)“

In England, hier kracht es.

Nein, in D kriegste dann Summe usw.

Hallo Reinhard,

Du hast recht. Ich hatte das mit .formula (ohne Local) verwechselt. Das ist nämlich genau der Unterschied. (Und deshalb ist .formula vielleicht auch „besser“, weil sprach-kompatibel.)

Peter

OT Formula FormulaLocal

Du hast recht. Ich hatte das mit .formula (ohne Local)
verwechselt. Das ist nämlich genau der Unterschied. (Und
deshalb ist .formula vielleicht auch „besser“, weil
sprach-kompatibel.)

Hallo Peter,
da hast du Recht. Sprachübergreifend würde ich auch Formula nehmen.
Und ohne Erfahrungswerte denke ich mir da lauern in anderen Sprachen noch genug andere Fallen, Trennzeichen bei Csv, bei Datumswerten etc.
Und noch einige, die man erst kennenlernt, neue Bugs Features von MS.
Gruß
Reinhard