Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1708to1712
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

Mit Deklarationen weiterarbeiten - Hallo Werner

Mit Deklarationen weiterarbeiten - Hallo Werner
04.09.2019 14:10:41
Steve
Moin Werner,
ich habe nun mal was vorbereitet.
Zunächst einmal habe ich nun dein Makro auf die Schaltfläche "Neuer Mitarbeiter" gelegt.
Dann habe ich zwei Mitarbeiter angelegt. (für die Bearbeitung habe ich den Blattschutz entfernt.)
Mitarbeiter 001 - ist meine ursprüngliche Idee.
Mitarbeiter 002 - eine andere Idee, die vielleicht besser ist.
Wäre schön du kannst mir da sagen was besser ist. Vielleicht hast du ja auch eine noch bessere Idee.
Kurze Erklärung: Durch aktivieren von "Neuer Mitarbeiter" wird ein neues Sheet erstellt.
Hierzu wird das versteckte Sheet MASTER kopiert und umbenannt. Die Sheets werden automatisch, Nummerisch und aufsteigend - Lücken werden aufgefüllt - erstellt.
Ich habe immer exemplarisch drei vollständige Eingaben vorbereitet und farbig markiert.
In derselben aber dunkleren Farbe habe ich alle Felder markiert die für diese Funktion relevant wären.
Zu Mitarbeiter 001 (Sheet 001)
Die vorbereiteten Felder sind Hellblau und finden sich per SVERWEIS in dem Sheet LISTE wieder.
In dunkelblau habe ich alle Felder markiert die letztlich noch dazugehören.
Die Formel SVERWEIS steht also in dem Sheet LISTE
zu Mitarbeiter 002 (Sheet 002)
Hier habe ich die entsprechenden Felder in Gelb markiert, aber einen anderen Ansatz mit einem Zwischenschritt verfolgt.
Zunächst werden die Betroffenden Felder in einen neuen Bereich übertragen.
(dafür habe ich dasselbes Sheet in dem Bereich R5:EG5 / kann ja später ausgeblendet werden)
Ich denke der Vorteil hier könnte sein, das man weniger Code benötigt, da man hier einfach die Masterfolie anpassen mussund bei Änderungen oder Ergänzungen in der Masterfolie flexibler ist.
Dann müsste nur diese eine Zeile (R5:EG5) in das Sheet LISTE übertragen werden.
https://www.herber.de/bbs/user/131787.zip
So, ich hoffe ich habe dieses mal nichts relevantes vergessen und danke dir herzlich für deine Hilfe.
Liebe Grüße
Steve

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Bereich syncronisieren
06.09.2019 11:22:48
Steve
Moin Leute,
leider kam von Werner nichts mehr. Ich nehme an er ist anderweitig beschäftigt. Kann mir wohl jemand helfen?
Ich möchte das ein worksheet ("LISTE") sich mit allen anderen (nummerischen) Worksheets nonstop syncron hält.
Wird also ein Wert der nummerischen Sheets verändert, soll diese Änderung umgehend in dem anderen Sheet übernommen werden.
die nummerischen Worksheets werden per Makro erstellt und in dem Sheet "LISTE" entsteht eine Zeile in dem der Name des nummerischen Sheets erscheint.
Ich dachte bisher an ein SVERWEIS für jedes einzelne Feld, aber das erscheint mir nicht als der richtige weg, da er sehr umfangreich ist. Gibt es da einfacherere Lösungen?
Eine Beispieldatei mit Erklärung gibt es schon in der vorhergehenden Nachricht.
Ich danke schon einmal für eure Hilfe.
Liebe Grüße
Steve
Anzeige
AW: Bereich syncronisieren
09.09.2019 13:50:09
Matthias
Moin!
ALso habe mir deine Datei mal angeschaut. Die zweite Variante mit der Verknüpfung ist wohl die gescheiteste, weil da alles aktuell gehalten wird, ohne das was berechnet werden muss (wie bei der ersten). Du könntest das auch mit einem Makro abfangen, wenn du irgendwann mal zuviel Verknüpfungen hättest und die Dateigröße zu groß wird. Jetzt würde ich mal die Verknüpfung vorschlagen. Anbei den Code im Modul Werner so anpassen / austauschen. Hinweis aber noch, in einigen Tagen kannst du hier bei dem Thread nix mehr editieren (geht nur 1 Woche) sondern nur noch im Archiv anschauen. Dann ggf. mal einen neuen Thread eröffnen.
'''''''''''''''''''''''''''''''''''
'LISTENSEITE BEFÜLLEN UND SORTIEREN'
With Worksheets("LISTE")
lZ = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
If .Cells(2, 1).Value = "" Then lZ = 2
.Cells(lZ, 1).Value = Blatt
.Cells(lZ, 1).Hyperlinks.Add Anchor:=.Cells(lZ, 1), Address:="", SubAddress:= _
Blatt & "!A1", TextToDisplay:=Blatt
.Cells(lZ, 2).Value = NNam
.Cells(lZ, 3).Value = VNam
.Cells(lZ, 4).Value = WorksheetFunction.VLookup _
(1, Worksheets(Blatt).Range("A4:O24 "), 2, False)
'.Range("B1") = WorksheetFunction.VLookup _
'(.Range("A1"), Worksheets("Tabelle2").Range("A1:B4"), 2, False)
Dim spalte
For spalte = 1 To 20
.Cells(lZ, 3 * spalte + 1).Formula = "='" & Blatt & "'!" & Worksheets(Blatt).Cells( _
spalte + 4, 2).Address
.Cells(lZ, 3 * spalte + 2).Formula = "='" & Blatt & "'!" & Worksheets(Blatt).Cells( _
spalte + 4, 3).Address
.Cells(lZ, 3 * spalte + 3).Formula = "='" & Blatt & "'!" & Worksheets(Blatt).Cells( _
spalte + 4, 4).Address
Next
For spalte = 1 To 20
.Cells(lZ, 3 * spalte + 61).Formula = "='" & Blatt & "'!" & Worksheets(Blatt).Cells( _
spalte + 4, 7).Address
.Cells(lZ, 3 * spalte + 62).Formula = "='" & Blatt & "'!" & Worksheets(Blatt).Cells( _
spalte + 4, 8).Address
.Cells(lZ, 3 * spalte + 63).Formula = "='" & Blatt & "'!" & Worksheets(Blatt).Cells( _
spalte + 4, 9).Address
Next
End With

VG
Anzeige
AW: Bereich syncronisieren
09.09.2019 16:07:42
Matthias
Moin!
Hier nochmal ein Nachtrag. Falls du vielen Dateien hast und dich die Verknüpfungen stören (kann man ja auch rauslöschen), hier die VBA Variante. Den Code unter DieseArbeitsmappe einfügen. Damit werden die Änderungen in den numerischen Blätter überwacht und in die LISTE übertragen.
Option Explicit
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("Inaktive", "Daten", "Startseite", "Liste", "Master")
quellbereich = Array("B5:D24", "G5:I25")
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, Union(sh.Range(quellbereich(0)), sh.Range(quellbereich(1)))) Is  _
Nothing Then
aktualisieren sh, target
End If
Else
'mehrere Einträge erfolgen
For Each zelle In target
If Not Intersect(zelle, Union(sh.Range(quellbereich(0)), sh.Range(quellbereich(1)))) 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
If target.Column > 6 Then
spalte = target.Column - 6 + 3 * (target.Row - 4) + 60
Else
spalte = target.Column - 1 + 3 * (target.Row - 4)
End If
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

VG
Anzeige
AW: Bereich syncronisieren
09.09.2019 16:45:30
Matthias
Ein Fehler ist mir grad eingefallen. Bei den mehreren Werten den Aufuf von aktualiisern mal bitte so ändern:
aktualisieren sh, zelle
VG
AW: Bereich syncronisieren
09.09.2019 19:17:22
Steve
Hallo Matthias,
Ich danke dir recht herzlich für deine Hilfe. Ich werde das morgen nachmittag direkt ausprobieren. Momentan tue ich mich noch schwer mit dem Lesen des Codes. Aber vielleicht verstehe ich den teil den ich beim Lesen noch nicht verstanden habe wenn ich ihn ausführe.
Ich melde mich Morgen sobald ich es ausgetestet habe.
Bis dahin wünsche ich dir einen schönen Abend.
Liebe Grüße
Steve
AW: Bereich syncronisieren
10.09.2019 09:49:59
Matthias
Moin!
Kein Problem, wenn Fragen sind, einfach melden. Wobei ab morgen der Thread nicht mehr beschrieben werden kann. Dann einfach einen neuen aufmachen.
Ein Hinweis noch zum Code. Wenn du die Anzahl auf einem Blatt änderst, springt der Code an und überträgt die neue Anzahl. Gleichzeitig erfolgt ja eine Spalte weiter die Berechnung. Das wird vom Change Ereignis nicht abgefangen. Deshalb übertrage ich die Änderung automatisch, wenn die Anzahl geändert wurde. Falls du allerdings im Blatt Daten den Preis änderst, änder sich im Blatt ja auch die Summe, dass wird aber nicht abgefangen. Dann müsste man noch was am Code ändern.
Ansonsten mal noch zu Erklärung:
Am Anfang mit noblatt lege ich die Blätter fest, bei denen nix passieren soll. Das Ereignis springt dort auch an, wird aber bei der Prüfung auf diese Blattnamen beendet.
Danach habe ich die relevanten Bereiche auf den Bättern festgelegt - so kann man es einfacher ändern.
Dann kommt die Prüfung auf den Blattnamen. Ist er aus der Liste vom Anfang beendet die Prozedur.
Dann schaue ich, ob nur eine Zelle oder mehrer geändert wurden. Je nachdem muss man ja durch alle Zellen gehen.
Dann wird geprüft, ob die geänderte Zelle in unserem vorherigen Quellbereich liegt. Wenn ja, rufe ich die Prozedur darunter auf und übergebe Blatt und Zelle. Hätte man auch in die Prozedur reinpacken können, dann hätte ich sie aber zweimal (auch für die mehrfachen Änderungen ) reinschreiben und ggf warten müssen. Bei den "mehr" Zellen, gehe ich durch jede der Zellen und prüfe das selbe.
In der Prozedur suche ich anfangs den Blattnamen in der Tabelle Liste. Damit habe ich die Zeile für die Eintragungen. Dann werte ich die geänderte Spalte aus und berechne die Zielspalte im Blatt Liste. Das in Abhängigkeit von Spalte und Zeile der geänderten Zelle (am besten die Rechnung mal auf einem Zettel nachvollziehen). Dann wird in die so gefunden Zelle der Wert eingetragen. Und falls du die Anzahl geändert hast, wird auch die Summe daneben mit übertragen.
Mehr macht der Code eigentlich nicht.
VG
Anzeige
AW: Bereich syncronisieren
10.09.2019 14:31:51
Steve
Moin Matthias,
zunächst einmal vielen Dank für deine Hilfe. Selber hätte ich das nicht hinbekommen. Aber einige Fragen habe ich dazu noch.
zuerst die Korrektur die umgesetzt werden muss. Du meinst bei der Korrektur den Teil der zu "DieseArbeitsmappe" kopiert werden muss.
Und dann diese Stelle:
'mehrere Einträge erfolgen
For Each zelle In target
If Not Intersect(zelle, Union(sh.Range(quellbereich(0)), sh.Range(quellbereich(1)))) Is _
Nothing Then
aktualisieren sh, target (HIER) (streiche: target / setze zelle)

Zu dem ersten Absatz deiner Erklärung: Die Änderung des Preises.

Ich muss gestehen, daran habe ich nie gedacht. Wenn bei einem Mitarbeiter ein Werkzeug xy eingegeben wurde, dann erscheint der Preis automatisch. Ändere ich in DATEN den Preis, darf der Preis sich nicht automatisch bei den schon eingegebenen Mitarbeitern mitändern.
Das wäre ja nicht sehr fair.
ABER: Gebe ich bei einem schon angelegten Mitarbeiter erneut dasselbe Werkzeug an, dann müsste der neue Preis übernommen werden.
Kann man das irgendwie hinbekommen?
Dann noch eine blöde Frage:
Der code in "Diese Arbeitsmappe" läuft automatisch und muss nicht "angestoßen" werden richtig?
Listenseite Befüllen
Sehe ich das richtig, das die Auslagerung wie in meinem zweiten Beispiel (Blatt 002 Spalte R:EG)
zwar stattfindet, aber nicht sichtbar ist? (Finde ich großartig)
Was würde passieren, wenn ich auf die Idee käme diese Felder nun anderweitig zu befüllen.
(wird nicht passieren, ist eine reine interessensfrage)
Ich habe mal drei weitere Mitarbeiter angelegt (Habe nun also Blatt 001 - 010)
Ich glaube ich habe deinen Code verstanden. Ich versuche einen Ansatz.
For spalte = 1 To 20
.Cells(lZ, 3 * spalte + 1).Formula = "='" & Blatt & "'!" & Worksheets(Blatt).Cells( _
spalte + 4, 2).Address
Das ist für das Material
.Cells(lZ, 3 * spalte + 2).Formula = "='" & Blatt & "'!" & Worksheets(Blatt).Cells( _
spalte + 4, 3).Address
Das ist die Menge
.Cells(lZ, 3 * spalte + 3).Formula = "='" & Blatt & "'!" & Worksheets(Blatt).Cells( _
spalte + 4, 4).Address
Das ist der Preis
Das ganze wird 20 mal wiederholt. Also so oft wie es (Daten)Zeilen in dem Blatt gibt.
Analog wird das ganze dann noch für die Kleidung durchgeführt.
Sehe ich das richtig. Wenn ich meine Liste erweitern oder eine neue anlegen möchte, dann kann ich das Prinzip auch für die Bereiche Arbeitsanweisungen und Fahrpersonal übernehmen, benötige dafür aber immer nur die erste Zeile deines Codes?
Ein Problem
Was ich aber nicht in deinem Code finde ist der Bereich der letztlich "LISTE" versorgt, sonst hätte ich gerne selber versucht das Problem zu lösen.
Im Blatt LISTE werden nur die Spalten D:L richtig übernommen.
Alle weiteren Spalten enthalten Verknüpfungen zum zuletzt eingebenen Tabellenblatt - hier also Blatt 010
Ich danke dir jetzt schon recht herzlich
Liebe Grüße
Steve
Anzeige
AW: Bereich syncronisieren
10.09.2019 21:53:15
Matthias
Moin!
Nen Haufen Text. :-) Versuche mich mal durchzuschlagen und alles zu beantworten.
1. Korrektur:
Genau! Target durch Zelle ersetzen. Damit werden dann alle Zellen durchgegangen (wenn du mehrere gleichzeitig reinkopierst)
2. Preis:
Das würde dann noch falsch laufen. Derzeit ist ist auf Grund der "festen" Verknüpfung mittels Formel immer einer Aktualisierung da. Da könnte man die Formel auch rausschmeißen und das durch den Code am Anfang laufen lassen. Damit werden die alten Daten gelassen. Gibt da nur ein Problem. Wenn man bei einem schon erfassten Artikel die Anzahl ändert, wird der neue Preis genommen. Da könnte man ggf. beim erfassen des Artikels schon den aktuellen Preis in einer ungenutzten Spalte erfassen (weiße Schriftfarbe, ausgeblendet, damit man es nicht sieht). Bei einer Änderung der ANzahl wird dann mit der Zelle abgeglichen. Das ist aber noch nicht drin. Hier mal die Variante. Füg nach
aktualisieren sh, target
mal die Zeile ein.
preiserfassen sh, Target
Das Makro dazu ist hier. Das einfach unter aktualisiern einfügen:
Sub preiserfassen(sh As Object, ByVal Target As Range)
On Error GoTo ende
Dim daten
Dim zeile
daten = Worksheets("Daten").UsedRange
If Target.Column = 3 Then
If Target.Offset(, -1)  "" And Target  "" And Target  "-" Then
Set zeile = Worksheets("Daten").Columns(1).Find(Target.Offset(, -1), LookIn:=xlValues,  _
lookat:=xlWhole)
If Not zeile Is Nothing Then
If zeile.Offset(, 2) = "Menge" Then
'Produkt
Application.EnableEvents = False
Target.Offset(, 1) = CDbl(Target) * CDbl(zeile.Offset(, 1))
Application.EnableEvents = True
Else
'nur die Nummer
Application.EnableEvents = False
Target.Offset(, 1) = zeile.Offset(, 1)
Application.EnableEvents = True
End If
Else
Exit Sub
End If
End If
End If
If Target.Column = 8 Then
If Target.Offset(, -1)  "" And Target  "" And Target  "-" Then
Set zeile = Worksheets("Daten").Columns(1).Find(Target.Offset(, -1), LookIn:=xlValues,  _
lookat:=xlWhole)
If Not zeile Is Nothing Then
Application.EnableEvents = False
Target.Offset(, 1) = CDbl(Target) * CDbl(zeile.Offset(, 1))
Application.EnableEvents = True
Else
Exit Sub
End If
End If
End If
ende:
Application.EnableEvents = True
End Sub
3. Code in diese Arbeitsmappe:
Richtig. Voraussetzung ist natürlich, dass man die Markos aktiviert. Das ist halt der NAchteil, auch bzgl der Preise in Punkt 2. Geht dann nur mit aktivierten Makros, während die Formel immer geht. Bei der Formel könntest du aber auch mit der erwähnten Hilfsspalte arbeiten.
4. Sichtbarkeit:
Also mit Sichtbarkeit meinst du Formeln oder? Der Code überträgt das automatisch. In den Zellen in LISTE steht keine Formel mehr, die überschrieben werden können. Weiß nicht genau, was du mit Blatt 2 Spalte R:EG meinst. Da sind ja wieder Formeln sichtbar. Auf die greift der COde aber nicht zu. Die Felder kannst du also löschen oder umbenennen (Falls du jetzt R:EG meinst). Die braucht der Code nicht und habe ich erst jetzt gesehen. Habe mich jetzt meist auf den Code in DieseArbeitsmappe bezogen. Auch die Formeln beim Anlegen (können bei der Makroversion natürlich raus - werden sonst eh überschrieben) brauchen den Bereich nicht. Den kannst du also anderweitig nutzen.
5. Eingetragene Formeln:
Richtig. Die Formeln werden automisch eingefügt. IN der Reihenfolge wie du es beschrieben hast (Material, Menge, Preis) und dann das selbe für Kleidung. Beim Code vorne brauchst du aber nicht.
6. Erweiterung:
Jetzt verwirrst du mich zugegeben. Bin mir nicht sicher, ob sich die Frage auf den Code in DieseArbeitsmappe oder die automatisch eingefügten Verknüpfungen bezieht. Und welche erste Zeile meinst du bzw. sollen die Daten irgendwohin? Theoretisch kannst du da sowohl die automatische Verknüpfung als auch den Code anwenden. Musst halt nur die richtige Zeile/Zelle berechnen. Ansonsten analog dazu vorgehen. Hierzu evtl. nochmal genaue erklären und nachfragen.
7. Problem:
Also der Code in DieseArbeitsmappe läuft automatisch und fängt jede Änderung (außer Berechnungen) in allen! Blättern ab. Im Code wird dann geprüft. Die Eintragung in Liste erfolgt in der Sub aktualisieren. Wie geschrieben, wollte ich das nicht doppelt in den Code darüber packen.
Dort wird einmal das ziel gesucht - der Blattname. Damit hast du die Zeile für das Eintragen. Dann suche ich noch die richtige Spalte. Das hängt ja davon ab, ob du bei Material oder KLeidung bist.
Dann kommt eine Zeile mit dem Blatt LISTE. Da greife ich auf die LISTE zu und trage die Daten ein. Der COde drumherum war nur zum richtigen Berechnen der Zelle.
Könntest das da auch auf andere Spalten anpassen.
8: ProblemII:
Du hast geschrieben, dass nur die Spalte D bis L richtig angezeigt werden. Bei welcher der Varianten gilt das (Verknüpfung oder Code)? Bei meinem Test hat er es immer in die richtigen Zeile und Spalte eingetragen. Kann ich grad nicht nachvollziehen. Bitte nochmal genaue Beschreiben (was eingetragen, wo angezeigt, bei welchem Blatt).
So war nun auch viel Text.
VG
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige