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

Bereich syncronisieren III

Bereich syncronisieren III
14.10.2019 16:00:20
Steve

Moin Leute,
neulich hat mir Matthias sehr gut bei einem Problem helfen können. Nun wollte ich diese Lösung für eine andere Aufgabe zum Teil wiederverwenden. Leider, und das ärgert mich, scheine ich die Lösung nicht genug verstanden zu haben um sie vernünftig zu übertragen.
Kann mir Bitte jemand hierbei helfen?
Das Ziel ist, folgendes. Es wird per Button ein neues Sheet erstellt. Dieses enthält vordefinierte Bereiche die wiederum auch in einem anderen Sheet (LISTE) (in Listenform damit Serienbrieftauglich) wieder auftauchen.
Alle Änderungen in dem neuen Sheet sollen immer sofort in der Liste übernommen werden.
Aber irgendwie will das nicht so ganz funktionieren. Was mache ich da falsch?
https://www.herber.de/bbs/user/132527.xlsm
Vielen Dank und Liebe Grüße
Steve

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

Betreff
Datum
Anwender
Anzeige
AW: Bereich syncronisieren III
14.10.2019 21:45:59
Matthias
Moin!
Kann erst am Mittwoch richtig schauen. Was passt den nicht? Wird in die falsche Zeile oder Spalte eingetragen oder kommen Fehlermeldungen?
Da in der Variante nur ein Quellberich existiert, solltest du auf das UNion verzichten (da hatten wir ja mehrere Bereiche). Probiere es mal so.

If Not Intersect(target, quellbereich) Is _

Und hier
If InStr(1, "@" & Join(blattno, "@") & "@", sh.Name, vbTextCompare) > 0 Then Exit Sub

verkette mal sh.name auch mit "@". Da sollte kein Fehler kommen, damit gehst du aber auf nummer sicher, dass der Name nicht in einem ander Namen als Teilstring vorkommt.
Beim Eintragen unten dann, gibt es (so wie ich den Code interpretiere) nur eine Spalte. Also bräuchtest du auch kein if. Die Zuweisung wäre dann
spalte = target.Row - 1

Du startest ja in Zeile 5 und willst in Spalte 4 (was der 4 entspricht). Da du nur eine Spalte überträgst, brauchen wir die target Spalte nicht.
VG
Anzeige
AW: Bereich syncronisieren III
15.10.2019 15:52:33
Steve
Moin Matthias,
das war genau das wo er gemeckert hat. Die Quellbereiche. Konnte mir sogar ein wenig herleiten das es sich auf die Eingabebereiche bezieht und geändert werden muss. Wusste nur nicht wie.
Habe deine Änderungen durchgeführt, aber er meckert immernoch bei den Quellbereichen. Ich sende mal den Code:
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, quellbereich) Is _
Nothing Then
aktualisieren sh, target
End If
Else
'mehrere Einträge erfolgen
For Each zelle In target
If Not Intersect(target, quellbereich) Is _
Nothing Then
aktualisieren sh, target
End If
Next
End If
End Sub

Deine Änderung in dem zweiten Teil hab ich glaub ich nicht begriffen. Meinstest du das so?
Sub aktualisieren(sh As Object, ByVal target As Range)
Dim ziel
Dim spalte
Set ziel = Worksheets("LISTE").Columns(1).Find(sh.Name, LookIn:=xlValues, lookat:=xlWhole)
If ziel Is Nothing Then Exit Sub
spalte = target.Row - 1
Worksheets("LISTE").Cells(ziel.Row, spalte) = target.Value
If target.Column = 3 Or target.Column = 8 Then Worksheets("LISTE").Cells(ziel.Row, _
spalte + 1) = target.Offset(, 1).Text
End Sub
Ich habe mir übrigens, weil es mich gewurmt hat, das ich das nicht ausrechnen konnte, diesen Teil genauer angeschaut: spalte = target.Column - 6 + 3 * (target.Row - 4) + 60
Und ich glaube ich habe es Begriffen. Eigentlich nicht so schwer. Ist ja im Grunde reine Mathematik die mich zur richtigen Spalte leitet. Die Zeile ergibt sich ja durch die Blattnummer. Koerrekt?
Ich bin gespannt ob ich alles richtig gemacht habe.
Danke dir für deine Hilfe
Steve
Anzeige
AW: Bereich syncronisieren III
15.10.2019 20:11:34
Matthias
Moin!
Ups, da ist mir ein Fehler unterlaufen. Beim Intersect sollt es so lauten:
If Not Intersect(target, sh.range(quellbereich(0)) Is _)

Man muss ja eine Range übergeben. Vorher war das nur ein String. So sollte es eigentlich klappen. Schaue aber morgen nochmal drüber.
Beim Namen meinte ich das so:
"@" & sh.Name & "@"

Hatte ich damals auch weggelassen, aber so ist es sicherer.
Zur Sub aktualisieren, stimmt. Wobei du das letzte if noch rauslöschen soltest. Damit hatten wir ja die Summe übertragen (glaube ich). Das ist hier nicht notwendig.
Und die Spalte berechnen war wirklich nur Mathematik. Die Zeile wird durch die .find Methode herausgefunden.Da dort der Blattname stehen muss, wird sich einfach die entsprechende Zeile gesucht.
VG
Anzeige
AW: Bereich syncronisieren III
16.10.2019 15:47:29
Steve
Moin Matthias,
kann es sein das du nicht: If Not Intersect(target, sh.range(quellbereich(0)) Is _)
sondern das meinst: If Not Intersect(target, sh.Range(quellbereich(0))) Is _
Ansonsten wird nämlich alles rot markiert. Jetzt bin ich etwas gespannt ob ich richtig liege.
Habe alles umgesetzt. Das ganze sieht nun so aus:
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(target, sh.Range(quellbereich(0))) Is _
Nothing Then
aktualisieren sh, target
End If
Next
End If
End Sub

Sub aktualisieren(sh As Object, ByVal target As Range)
Dim ziel
Dim spalte
Set ziel = Worksheets("LISTE").Columns(1).Find(sh.Name, LookIn:=xlValues, lookat:=xlWhole)
If ziel Is Nothing Then Exit Sub
spalte = target.Row - 1
Worksheets("LISTE").Cells(ziel.Row, spalte) = target.Value
End Sub Blattnummer, Vor- und Nachname werden nun an LISTE übergeben. Aber leider nicht die Daten im Eingabebereich.
hab versucht rauszufinden was "@" tut. Kannst du mir das wohl eben erklären?
Liebe Grüße
Steve
Anzeige
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
Anzeige
AW: Bereich syncronisieren III
17.10.2019 17:07:28
Steve
Moin Matthias,
das funktioniert großartig. Danke dafür. Das ist jetzt ja eine Version an der ich problemlos auch rumprobieren kann. Habe dafür schon einige Ideen.
Das mit den "@" werde ich mir merken. Wer weiss wann ich das wiederverwenden kann.
Ich bedanke mich recht herzlich für deine Schnelle Hilfe und die guten Erklärungen.
Herzlichst
Steve
AW: Bereich syncronisieren III
18.10.2019 17:01:02
Hajo_Zi
Halo Steve,
offen bedeutet es soll noch eine Antwort kommen.
Warum ist dein Beitrag Offen.
Du willst doch was machen. Soll jemand vorbei kommen?
Das ist nur meine Meinung zu dem Thema.

Anzeige
AW: Bereich syncronisieren III
18.10.2019 17:23:03
Steve
Lieber Hajo,
Wir sprachen doch schon einmal darüber, und ich teilte dir mit, dass Matthias ( in diesem Fall) meinen Dank auch mitbekommen soll. (Würde er diesen nicht mitbekommen, wäre die Funktion des bedankens obsolet.)
Da ich aber davon überzeugt bin, dass eine höfliche und zuvorkommende Kommunikation essentiell für das miteinander ist - vor allem wenn man, eine kostenlose (da müssen wir und nichts vormachen) Dienstleistung erhält - lasse ich sehr gerne der Person meinen Dank auf sichtbare Weise zukommen.
Sollte dies gegen die Forumsregeln sein, bitte ich um einen kleinen Hinweis. Dann werde ich mich sehr gerne anders verhalten. Bis dahin Bitte ich darum meine - Nenn es gerne eine altbackene Angewohnheit andere mit Freundlichkeit und Respekt zu begeben - Schrulle zu akzeptieren oder zumindest zu ignorieren.
Mit freundlichen Grüßen
Steve L.
PS.: Ich sende das als unbeantwortet damit du diese Antwort auch sehen kannst.
Anzeige
AW: Bereich syncronisieren III
18.10.2019 17:35:33
Hajo_Zi
Halo Steve,
man kann im Forum als Antworter die Mailbenachrichtigung aktivieren und damit bekommt man eine Nachricht falls neuer Beitrag.
Gruß Hajo
AW: Bereich syncronisieren III
18.10.2019 17:41:54
Steve
Moin Hajo
Danke für die Info. Dachte bisher das gilt nur für den Ersteller des Threads. Also gilt das auch für einen beantworter, ja?
Gut zu wissen. Ich danke dir und wünsche dir ein schönes Wochenende.
Liebe Grüße
Steve.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige