Live-Forum - Die aktuellen Beiträge
Datum
Titel
29.03.2024 13:14:12
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1864to1868
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

Target Address multiple Zelle

Target Address multiple Zelle
18.01.2022 19:20:08
CoAdmiral
Hi,
es soll geprüft werden, wenn Bereich A oder Bereich B Änderungen erhalten, das dann jeweils X oder Y durchgeführt wird. Mein Problem: der Bereich B wird nicht geprüft.

Option Explicit
Public strRGNR As String
Public lngMax As Long
Public arrLogStart As Long
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim i As Long
Dim strNextFree As String
Dim strCheck As String
Dim arrLogstr() As Variant
Dim rng As Range
Dim lngMaxNr As String
Dim intString, x As Integer
Dim wsRG, wsLog As Worksheet
Dim wb As Workbook
Set wb = ThisWorkbook
Set wsRG = wb.Worksheets("RG-Nr")
Set wsLog = wb.Worksheets("Log")
On Error GoTo ErrorHandler
Application.EnableEvents = False
Set rng = ThisWorkbook.Worksheets("Log").Range("RG_Array") 'erfasse alle bisher vergebenen RG-Nr
arrLogstr = rng
' nicht relevanter Code, nur hier der Vollständigkeit
ReDim arrLogLng(1 To UBound(arrLogstr, 1), 1) As Long
For i = LBound(arrLogstr, 1) To UBound(arrLogstr, 1)
arrLogLng(i, 1) = arrLogstr(i, 1)
Next i
lngMax = WorksheetFunction.Max(arrLogLng, 1) 'ermittel die nächste freie RG; Lücken werden hierbei übersprungen
lngMax = lngMax + 1
strNextFree = "'" & Format(lngMax, "00000")
strCheck = Worksheets("RG-Nr").Range("RGNR").Value
'Ende unrelevanter Code
If Not Intersect(Target, wsRG.Range("RGNR")) Is Nothing Then                         'Bereich A
'Prüft ob Nummern im Feld "RGNR" gültigen Format eingegeben werden
If Len(Target)  5 Or IsNumeric(Target) = False Then
'Nutzer informiere was falsch lief
GoTo ErrorHandler
End If
'wenn eingegebenes Format korrekt war, prüf ob die Nummer frei ist
For i = LBound(arrLogstr, 1) To UBound(arrLogstr, 1)
'Nr frei? --> ja/nein
Next i
'------------wenn Kommentar entfernt wird, wird angenommen, die RG-Nr wurde nun verwendet
ElseIf Not Intersect(Target, wsLog.Range("D:D")) Is Nothing Then                          'Bereich B
MsgBox Target.Address
End If
ErrorHandler:
Application.EnableEvents = True
End Sub
"RGNR" ist eine einzelne Zelle. Ist Target nicht "RGNR", so springt der Code immer direkt auf

Application.EnableEvents = True

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Mit der Sprungmarke "ErrorHandler"...
18.01.2022 19:30:08
{Boris}
Hi,
...steigt der Code ja in diesem Moment aus:

If Len(Target)  5 Or IsNumeric(Target) = False Then
'Nutzer informiere was falsch lief
GoTo ErrorHandler
End If
Lass also den Sprung "GoTo ErrorHandler" weg und schieb den folgenden Teil

'wenn eingegebenes Format korrekt war, prüf ob die Nummer frei ist
For i = LBound(arrLogstr, 1) To UBound(arrLogstr, 1)
'Nr frei? --> ja/nein
Next i
in den Else-Zweig der If-Bedingung, anstatt diese mit End If zu beenden.
VG, Boris
AW: Mit der Sprungmarke "ErrorHandler"...
18.01.2022 20:05:49
CoAdmiral
Nein, es geht nur bis

If Not Intersect(Target, wsRG.Range("RGNR")) Is Nothing Then 
anschließend folgt der Sprung zum ErrorHandler. Hab deinen Vorschlag ausprobiert, aber kein Erfolg
Anzeige
Dann zeig doch mal bitte...
18.01.2022 20:12:05
{Boris}
Hi,
...Deinen geänderten Code.
VG, Boris
AW: Target Address multiple Zelle
18.01.2022 19:35:14
Piet
Hallo
wenn Target ein Bereich ist und dann nicht ausgeführt werden soll setzte einfach ganz oben hinter Sub diesen Befehl:
If InStr(Target.Address, ":") Then Exit Sub - PS es geht auch über Target.Count, ich bevorzuge Target.Address!
mfg Piet
AW: Target Address multiple Zelle
18.01.2022 19:56:11
CoAdmiral
Ich habe zu Testzwecken immmer nur eine einzelne Zelle geändert (leider ohne gewünschten Erfolg), müsste aber dies perspektivisch einbauen, Danke für den Hinweis
AW: Target Address multiple Zelle
18.01.2022 20:52:34
Daniel
HI
1. Errorhandler Sucks! sowas macht meistens nur Ärger. Lieber vorher sauber prüfen, was Sache ist, dann braucht man meistens keinen Errorhandler.
2. scheint mir hier das für alle Blätter geltende Change-Event ungünstig, da die gewünschten Aktionen nur auf zwei Tabellenblättern stattfinden sollen (Log und Reg-Nr) und dann noch nicht mal für beide Blätter gleich sind, sondern unterschiedlich.
Wahrscheinlich wird das ganze einfacher, wenn du für die Blätter Log und Reg-Nr eigenständige Change-Events im Modul der jeweiligen Blätter erstellst.
das für alle geltende Change-Event im Modul "DieseArbeitsmappe" verwendet man nur, wenn für mehrere Blätter die gleiche Aktion mit dem gleichen Code ausgeführt werden soll.
Gruß Daniel
Anzeige
AW: Target Address multiple Zelle
20.01.2022 12:18:53
CoAdmiral
Aufteilung auf die verschiedenen Sheets wäre natürlich auch eine Idee, hab es als erstes mit Gerds Vorschlag probiert und es hat soweit geklappt
AW: Target Address multiple Zelle
18.01.2022 21:49:52
GerdL
Hallo,
ich habe dir die Sache mal etwas entzerrt. Vielleicht findest du die Divergenz selbst heraus.
Option Explicit
Public strRGNR As String
Public lngMax As Long
Public arrLogStart As Long

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim i As Long
Dim strNextFree As String
Dim strCheck As String
Dim arrLogstr() As Variant
Dim rng As Range
Dim lngMaxNr As String
Dim intString, x As Integer
Dim wsRG  As Worksheet, wsLog As Worksheet
Dim wb As Workbook
Set wb = ThisWorkbook
Set wsRG = wb.Worksheets("RG-Nr")
Set wsLog = wb.Worksheets("Log")
' On Error GoTo errorhandler  '#für Test ausschalten
Application.EnableEvents = False
Set rng = ThisWorkbook.Worksheets("Log").Range("RG_Array") 'erfasse alle bisher vergebenen RG-Nr
arrLogstr = rng
If Sh.Name = wsRG.Name Then
If Not Intersect(Target, wsRG.Range("RGNR")) Is Nothing Then                         'Bereich A
'Prüft ob Nummern im Feld "RGNR" gültigen Format eingegeben werden
If Len(Target)  5 Or IsNumeric(Target) = False Then
'Nutzer informiere was falsch lief
GoTo errorhandler    'dann ohne Bereich B !!!!
End If
'wenn eingegebenes Format korrekt war, prüf ob die Nummer frei ist
For i = LBound(arrLogstr, 1) To UBound(arrLogstr, 1)
'Nr frei? --> ja/nein
Next i
End If
End If
If Sh.Name = wsLog.Name Then
'------------wenn Kommentar entfernt wird, wird angenommen, die RG-Nr wurde nun verwendet
If Not Intersect(Target, wsLog.Range("D:D")) Is Nothing Then                          'Bereich B
MsgBox Target.Address
End If
End If
errorhandler:
Application.EnableEvents = True
End Sub
Gruß Gerd
Anzeige
AW: Target Address multiple Zelle
20.01.2022 12:22:07
CoAdmiral
Hallo Gerd,
deine Lösung hat funktionier, vielen Dank. Hatte dir eigentlich schon vor 2 Tagen geantwortet, ist aber irgendwie nicht angekommen.
Frage dazu:

Sh.Name
ist ja an keiner Stelle definiert. Funktioniert das ähnlich wie

Target
, ist also ein von Excel reservierter Begriff?
AW: Target Address multiple Zelle
20.01.2022 12:41:36
GerdL
Ja. Siehe die Kopfzeile der Ereignisprozedur:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Sh ist das Blatt, in dem jenachdem geändert oder das selektiert wird.
Gruß Gerd
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige