Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1924to1928
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Bereiche überwachen

VBA Bereiche überwachen
19.03.2023 19:08:28
David15348

Hallo alle Damen und Herren zusammen,

ich bin zum ersten mal in einem Forum unterwegs und bitte um Korrektur wenn die Ausführungen ungenügend sind.
Meine VBA-Kenntnisse sind eher geringer Natur das vorweg.

Ich möchte in eine Tabelle, einen oder mehrere Einträge einfügen oder löschen.
Wenn dies geschieht, dann soll eine Prüfung statt finden die erkennet welcher Bereich wurde gerade geändert/ neuer Eintrag.
Abhängig von dem geänderten Bereich soll ein weiteres Makro aufgerufen werde das eine weitere Prüfung durchführt.

Mein Code:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim a As Integer
Dim b As Integer

a = 18 'steht für die Anfangszeile
b = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row ' letzte Zeile ermittelt

Dim SoUn_ObEin As Range
Dim SoUn_ObGeli As Range
Dim LichMaßIST As Range

Dim RohGeli As Range
Dim RohAng As Range
Dim RREin As Range
Dim tbl As Range

Set SoUn_ObEin = Worksheets("LÜ").Range("AP" & a, "AQ" & b) 'Bereich 1
Set SoUn_ObGeli = Worksheets("LÜ").Range("AI" & a, "AJ" & b) 'Bereich 2
Set LichMaßIST = Worksheets("LÜ").Range("AF" & a, "AF" & b) 'Bereich 3

Set RohGeli = Worksheets("LÜ").Range("K" & a, "K" & b) 'Bereich 4
Set RohAng = Worksheets("LÜ").Range("M" & a, "M" & b) 'Bereich 5
Set RREin = Worksheets("LÜ").Range("O" & a, "O" & b) 'Bereich 6

Set tbl = Worksheets("LÜ").Range("A" & a, "ED" & b)

'erste Ansatz/ Versuch

In dem ersten Ansatz habe ich mir aus dem Netz Codes zusammen gestohlen. Es wird der Bereich 4,5 & 6 nach meinem Verständnis überwacht.

Wenn ich nun eine Änderung/ Eintrag in dem Tabellenballt und Bereich 4 oder 5 oder 6 einfügen wird über das Worksheets_Change Event der Code ausgelöst und Excel geht den Code ohne Fehler durch.

Tatsächlich wäre es wirklich sehr schön wenn Excel wüsste zu unterscheiden wenn in

Bereich 4, 5 oder 6 eine Änderung dann nur diese Pfad gehen (Application.Run "Rohre" ) und

wenn in Bereich 1,2 oder 3 eine Änderung/ Eintrag dann Application.Run "ZelleBeschSoUnEin_SoObEin".

Ziel des ganzen soll sein das je nach (beschriebenen) Bereich nur die entsprechenden Makros "aktiviert werden" und nicht alle existierenden Makros.

Ich hoffe ich habe mich nicht zu kryptisch ausgedrückt.


If Application.Intersect(Target, RohGeli, RohAng, RREin) Is Nothing Then ' Erste IF-Anweisung

Application.Run "Rohre"

End If

If Application.Intersect(Target, SoUn_ObEin, SoUn_ObGeli, LichMaßIST) Is Nothing Then 'Zweite IF-Anweisung

Application.Run "ZelleBeschSoUnEin_SoObEin"

End If



'zweiter Ansatz/ Versuch

Im Zweiten Ansatz dachte ich wäre schlauer geworden, weil ich die Möglichkeiten von Select Case entdeckt habe. Dann habe ich die ganze Tabelle (tbl) unter Überwachung gestellt und Fälle kreiert die die Bereiche darstellen.
Das wenn der Eintrag in dem Bereich liegt dann das weiter Makro aufgerufen wird.
Das zum gedachte Teil was das Makro können sollte kommen wir zu dem was es macht.

Es macht bei einem Eintrag egal in welchem Bereich eine Prüfung des ersten Falles ohne Fehler und beendet dann den Code.



If Application.Intersect(Target, tbl) Is Nothing Then
Exit Sub
Else
Select Case True

Case Application.Intersect(Target, RohGeli, RohAng, RREin) Is Nothing 'Ersten Fall
Application.Run "Rohre"


Case Application.Intersect(Target, SoUn_ObEin, SoUn_ObGeli, LichMaßIST) Is Nothing 'Zweiter Fall
Application.Run "ZelleBeschSoUnEin_SoObEin"

End Select

End If


End Sub

Ich bitte um Hilfe wie der Code umgeschrieben werden muss das je wenn Bereiche beschrieben werden die entsprechende Fallunterscheidung durchgeführt wird.

Vielen Dank im Voraus.

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Bereiche überwachen
19.03.2023 19:37:28
onur
Sowas ist schon mal falsch:
Set RohGeli = Worksheets("LÜ").Range("K" & a, "K" & b)
Muss heissen
Set RohGeli = Worksheets("LÜ").Range("K" & a & ":K" & b)


AW: VBA Bereiche überwachen
19.03.2023 19:51:35
onur
2) Intersect gibt NICHT True oder False aus, sondern die Schnittmenge zwischen Target und den geänderten Zellen - also einen BEREICH mit allen Zellen, die im zu überwachenden Bereich liegen UND verändert wurden


AW: VBA Bereiche überwachen
19.03.2023 20:04:05
David15348
Ok das hatte ich nicht verstanden aber mit deiner Erklärung hilft mir das etwas besser zu verstehen.

Frage warum ist diese Schreibweise Falsch: Set RohGeli = Worksheets("LÜ").Range("K" & a, "K" & b) an sich gab es kein Fehler daher bin ich davon ausgegangen das es passt.

Welche Konsequenz hat das wenn ich so weiter schreiben würde?


Anzeige
AW: VBA Bereiche überwachen
19.03.2023 20:20:04
onur
Ein Ausdruck im Befehl Range muss, wenn man wie du die A1-Schreibweise nimmt, z.B. so aussehen:
Range("A1:A50") - Das kennst du ja. Der Ausdruck innerhalb der Klammern ist ein Text (String).
Wenn du aber die Zeilennummer(n) variabel gestalten willst, muss du, innerhalb der Klammern, einen String zusammenbasteln, dass es hinterher wieder so aussieht wie oben (mit einem Doppelpunklt als Separator).
Wie z.B.:
Range("A" & x & ":A" & y)
"A" & x & ":A" & y ergibt einen String "A1:A50", wenn x=1 und y 50 wären. Klaro?


Anzeige
AW: VBA Bereiche überwachen
20.03.2023 09:36:46
David15348
Achso jetzt ist der Grosche gefallen, danke das hat mir sehr geholfen :)


AW: VBA Bereiche überwachen
19.03.2023 19:52:15
David15348
Hallo onur,

danke für die Antwort ich habe das abgeändert bei mir im Code.

Hast du eine Idee zu den anderen Punkten?

Gruß

David15348


AW: VBA Bereiche überwachen
19.03.2023 20:01:26
onur
WAS soll denn noch in den anderen Makros passieren? Werden durch sie irgendwelche Zellen auf dem Blatt verändert?


AW: VBA Bereiche überwachen
19.03.2023 20:06:47
David15348
die anderen Makros legen nur fest welche Zellen gesperrt bleiben oder freigegeben werden. Es finden keine Einträge statt.


Anzeige
AW: VBA Bereiche überwachen
19.03.2023 20:51:51
onur
Da du ja auch mal, wie du schriebst, mehrere Zellen eintragen/verändern willst, ist es etwas komplizierter:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim von, bis, sp, ze, cell
    Dim found1 As Boolean, found2 As Boolean ' Gewöhne dir mal an, immer alle Variablen zu deklarieren
    von = 18 'steht für die Anfangszeile
    bis = Cells(Rows.Count, 2).End(xlUp).Row ' letzte Zeile ermittelt
    For Each cell In Target
        sp = cell.Column: ze = cell.Row
        If ze >= von And ze = bis Then
            If sp = 11 Or sp = 13 Or sp = 15 Then found1 = True '
            If sp = 32 Or sp = 35 Or sp = 36 Or sp = 42 Or sp = 43 Then found2 = True
        End If
    Next
    If found1 Then MsgBox "Makro1"
    If found2 Then MsgBox "Makro2"
End Sub


Anzeige
AW: VBA Bereiche überwachen
20.03.2023 09:34:52
David15348
Hallo onur,

danke für den Code ich probieren diesen gleich aus, ich habe noch einige Verständnis Frage.

For Each cell In Target
sp = cell.Column: ze = cell.Row -------------- Frage 1
If ze >= von And ze = bis Then -------------- Frage 2

Frage 1:

ich meine zu verstehen wie das ungefähr funktioniert aber wissen tu ich´s nicht. mit Cell.Column & cell.Row

Cell gibt ein Rang-Objekt zurück, das die Zellen im angegebene Bereich darstellt.
Column gibt die erste Spalte am Anfang des angegebenen Bereichs als Zahl zurück.
Row wäre wie Column nur für die Zeile

Ich lese das, aber wirklich verstehen tu ich nicht was da genau abläuft?

dann die Schreibweise: sp=.... : ze=.... mir war nicht bewusst das man dies in VBA so schreiben kann der ":" zwischen den Variablen was bewirkt dieser?

Frage 2:

In der If-Anweisung wird geprüft ob die Zeile(n) größer gleich dem Startwert und kleiner gleich dem Endwert ist.
Ist das richtig wie ich mir das vorstelle oder läuft das anders ab?

nach dem die Zeile(n) "bestimmt" wird/ werden die Spalten geprüft ob die Zelle in dem Bereich liegt. Ist diese richtig ist found = Wahr und in der nächsten If anweisung könnte ich mit Application.Run"xxx" starten

Ich danke dir für deine Hilfe du hast mir sehr weiter geholfen.


Anzeige
AW: VBA Bereiche überwachen
20.03.2023 09:53:20
onur
For each cell....
geht den Bereich (falls du mehrere Werte gleichzeitig verändert hast, hast du ja als Target einen Bereich statt einer Zelle) Zelle für Zelle durch.
sp = cell.Column: ze = cell.Row
ermittelt Zeile und Spalte dieser Zelle.
Du musst nicht pro Befehl eine Zeile nehmen, du kannst mehrere Befehle hintereinander schreiben (musst du aber nicht).
"In der If-Anweisung wird geprüft ob die Zeile(n) größer gleich dem Startwert und kleiner gleich dem Endwert ist. " - nur die ERSTE IF-Anweisumg. Die Zweite überprüft, ob Spalte im zu überprüfenden Bereich liegt. Du definierst 7 verschiedenen Ranges (SoUn_ObEin usw) und benutzt Intersect dafür, ICH mache das einfach mit 2 IF-Anweisungen.
"und in der nächsten If anweisung könnte ich mit Application.Run"xxx" starten" - Nicht IN der nächsten IF-Anweisung, sondern NACH, sonst wird, wenn du 5 Änderungen gleichzeitig im zu überprüfenden Beriches hast, das Makro auch 5x ausgeführt. Deswegen wird ja auch ein Flag (found1 bzw found2) benutzt, um festzustellen, ob was gefunden wurde - egal ob 1x oder 100x, das entspr. Makro wird nur 1x ausgeführt.


Anzeige
AW: VBA Bereiche überwachen
21.03.2023 13:57:22
David15348
Vielen Dank das ist genial und danke für die genau Erklärung damit ist mein Problem gelöst.


AW: VBA Bereiche überwachen
20.03.2023 09:59:50
David15348
Hallo onur,

ich danke dir sehr der Code läuft mit den zwei Beispielen super ab er macht das wie ich mir es vorgestellt habe, Vielen Dank!

Ich baue die anderen Fälle noch ein und melde mich nochmal.

Vielen Dank nochmal :)


AW: VBA Bereiche überwachen
20.03.2023 10:09:45
onur
Übrigens:
 Application.Run"xxx"

ist Quatsch,
xxx
reicht.

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige