AW: Bereich syncronisieren III
16.10.2019 18:36:43
Matthias
Moin!
Ja, da hatte sich der Kopierfehler eingeschlichen. Vorab, (fast :-) ) alles richtig gemacht. Zwei Sachen musst du noch ändern, dann passt es. Arbeiten wir von unten nach oben.
1. im else Zweig für mehrere Zellen den Aufruf von Aktualisieren so starten:
aktualisieren sh, zelle
Da wir da ja durch die Zellen in target gehen, musst du da zelle nehmen. Target wäre immer nur die erste Zelle von target.
2. Das mit dem @ und dem Namen.
Hatte meinen Code gestern nur verkürzt. So sollte es aussehen;
If InStr(1, "@" & Join(blattno, "@") & "@", "@" & sh.Name & "@", vbTextCompare) > 0 Then Exit Sub
Da hattest du ein Komma und ein @ vergessen. De Sinn darin ist, dass die Blätter, in welchen der Code nicht durchalufen werden soll erst "aussortiert" werden. Da könnte man auch eine Schleife durch das Array nutzen. Bei den wenigen Namen war ich aber für eine Stringsuche. DAs Array verknüpfe ich mit @ zu einem String (join Funktion). Der sieht dann bspw. so aus. @Master@Daten... . Um das aktuelle Blatt darin zu finden, nutze ich die Instr Funktion. Damit man auf Nummer sicher geht, packe ich immer ein Zeichen, was sonst nicht im Text / Namen vorkommen sollte, dazwischen. Den zu suchenden Wert bei instr übergebe ich dann auch mit den umgebenden @. Wenn er das findet, weiß man, dass es auch wirklch das Blatt war. Stell dir sonst vor, dein Blatt LIste würde Liste001 heißen (weil es in der 1. Datei ist oder warum auch immer). Wenn du nun nur 001 für das 1. eingefügte Blatt suchst, landest du einen Treffer. Der Treffer ist zwar ein Teilstring von LIste001, dass weiß das Programm aber nicht. WEnn du @001@ suchst, gibt es keinen Treffer. Das mit den @ ist also nur der NUtzung von instr und damit man einen eineindeutugen Treffer hat geschuldet.
Der komplette Code sollte jetzt so aussehen:
Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal target As Range)
Dim blattno, bereich
Dim quellbereich, zelle
'die blätter bei denen nix passierne soll
blattno = Array("Daten", "Startseite", "Liste", "Master")
quellbereich = Array("B5:B24")
If InStr(1, "@" & Join(blattno, "@") & "@", "@" & sh.Name & "@", vbTextCompare) > 0 Then Exit _
Sub
If target.Count = 1 Then
'nur ein Eintrag erfolgte
If Not Intersect(target, sh.Range(quellbereich(0))) Is Nothing Then
aktualisieren sh, target
End If
Else
'mehrere Einträge erfolgen
For Each zelle In target
If Not Intersect(zelle, sh.Range(quellbereich(0))) Is Nothing Then
aktualisieren sh, zelle
End If
Next
End If
End Sub
VG