Bestimmen Sie, ob Benutzer Zeilen hinzufügen oder löschen
Ich habe ein VBA-makro, das überprüft, Benutzer-Daten eingegeben (ich habe nicht verwenden, die Validierung von Daten/bedingte Formatierung auf einen bestimmten Zweck).
Ich bin mit Worksheet_Change
Ereignis zum auslösen der code, das problem habe ich nun konfrontiert ist, wenn es eine Reihe änderungen. Ich weiß nicht, ob es ein löschen /einfügen von Zeilen.
Gibt es sowieso zu unterscheiden zwischen diesen beiden?
InformationsquelleAutor der Frage thinkanotherone | 2011-09-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man einen Bereich definieren, Namen wie
RowMarker =$A$1000
Dann diesen code in Ihre change-Ereignis wird speichern Sie die position dieser Markierung gegen es die Vorherige position, und melden Sie jede änderung (dann speichert die neue position)
InformationsquelleAutor der Antwort brettdj
Versuchen, diesen code:
Fügen Sie auch diese in das Modul "DieseArbeitsmappe":
Und dann diese in ein eigenes Modul:
Den code angenommen, Sie haben Daten in der Zeile 1. Hinweis: das erste mal Sie es starten Sie, erhalten Sie ein Falsches Ergebnis, weil der code benötigt, um die lRowCount auf die richtige variable. Sobald es fertig sein sollte, okay dann in.
Wenn Sie nicht wollen, verwenden Sie die Public-variable und Arbeitsblatt open-Ereignis, dann könnten Sie einen benannten Bereich im Arbeitsblatt irgendwo und speichern Sie die Zeilenanzahl (lRowCount) gibt.
InformationsquelleAutor der Antwort Reafidy
Annahme: "die Unterscheidung zwischen den beiden" Unterscheidung hinzufügen/löschen einer Zeile aus einer anderen Art von Veränderung. Wenn Sie bedeutete, wie Sie sagen, wenn die änderung war eine Zeile hinzufügen ODER Zeile löschen, dann Ignoriere meine Antwort unten.
Bei einfügen oder löschen einer Zeile, das Ziel.Zellen.Zählung werden alle Zellen in der Zeile. So können Sie diese If-Anweisung zu erfassen. Beachten Sie, dass ich die Verwendung von Zellen.Spalten.zählen, da könnte es anders sein für jede Datei. Es wird auch ausgelöst, wenn der Benutzer selektiert eine ganze Zeile und trifft die "delete" (zum löschen der Werte), so müssen Sie code ein workaround dafür, aber...
InformationsquelleAutor der Antwort aevanko
Nach der Suche nach etwas beschlossen, um es zu lösen mich.
In Ihrem Arbeitsblatt-Modul (z.B. Tabelle1 unter Microsoft-Excel-Objekte in VBA-Editor) legen Sie die folgenden:
InformationsquelleAutor der Antwort bzn
Einige von dem, was Ihre end-Zweck der Unterscheidung zwischen Einfüge-und Löschoperationen endet, wird bestimmen, wie Sie Vorgehen möchten einmal eine insertion oder deletion identifiziert worden. Die folgenden können, ist wohl der Schnitt deutlich gesunken ist, aber ich habe versucht, jeden möglichen Szenario.
Im wesentlichen, dieser code ermittelt die Letzte Zelle der Spalte-wise und die Letzte Zelle Zelle-Zeile-Weise. Es dann rückgängig macht den letzten Vorgang und prüft wieder. Vergleich beider Ergebnisse ermöglicht es zu ermitteln, ob eine Zeile/Spalte wurde eingefügt/gelöscht werden. Sobald die vier Messungen wurden ergriffen, es wiederholt den letzten Vorgang, so dass alle anderen mehr standard Worksheet_Change-Operationen verarbeitet werden können.
InformationsquelleAutor der Antwort Jeeped
Gibt es zwei etwas andere Ansätze sowohl auf der Grundlage der folgenden Vorlage.
Range
geben.Im ersten Ansatz das gesamte Spektrum der Zinsen wird der Variablen zugewiesen und die Auswahl der Größe wird gespeichert. Dann in einem Blatt ändern-Ereignishandler den folgenden Fällen verarbeitet werden müssen:
Address
Eigentum = > "angeheftet" - Bereich ist nicht mehr vorhanden sind;Im zweiten Ansatz ein "marker" - Bereich wird der Variablen zugewiesen (siehe Beispiel unten) und die range-Adresse gespeichert wird, um bestimmen, Bewegungen oder Verschiebungen in jede Richtung. Dann in einem Blatt ändern-Ereignishandler den folgenden Fällen verarbeitet werden müssen::
Address
Eigentum = > " angeheftet "marker" ist nicht mehr vorhanden sind;abs(new_row - saved_row) > 0 or abs(new_col-saved_col) > 0
= > "angeheftet" - Bereich verschoben wurde oder verschoben werden.Vorteile:
UsedRange
- Eigenschaft wird nicht verwendetNachteile:
WithEvents
-variable-Objekt zugewiesen werden mussNothing
in eine Arbeitsmappe schließen, event-handler, um die Abmeldung form der Veranstaltung.Folgende Beispiel zeigt, dass beide Ansätze funktionieren könnte. Definieren Sie in einem Modul:
Führen
set_m_st
(einfach statt einem cursor in die sub-und call -Run
Aktion), um pin-Reihe$A$10:$F$10
. Einfügen oder löschen einer Zeile oder Zelle darüber (nicht zu verwechseln mit dem ändern der Zelle(N) - Wert). Führen Sieget_m_st
zu sehen, eine geänderte Adresse der angehefteten Bereich. Löschen Sie die angeheftete Reihe zu bekommen "Objekt erforderlich" exception inget_m_st
.InformationsquelleAutor der Antwort Aleksey F.
Capture-Reihe von Ergänzungen und Löschungen in das worksheet_change-Ereignis.
Ich erstellen Sie eine named range namens "CurRowCnt"; Formel: =ZEILEN(Tabelle1).
Access im VBA-code mit:
Dieser benannte Bereich wird immer die Anzahl der Zeilen 'nach' eine Zeile(N) einfügen oder löschen. Ich finde, es gibt eine stabilere CurRowCnt als die Verwendung einer global-oder Modul-Ebene-variable, besser für Programmierung, testen und Debuggen.
Speichere ich die CurRowCnt, um eine benutzerdefinierte Dokument-Eigenschaft, wieder für Stabilität Zwecke.
Meine Worksheet_Change Event-Struktur ist wie folgt:
InformationsquelleAutor der Antwort phillfri