Anzeige
Archiv - Navigation
1472to1476
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

Externe Daten, Aktualisieren ohne Überschreiben

Externe Daten, Aktualisieren ohne Überschreiben
01.02.2016 10:39:09
Michelle
Hallo ihr Lieben,
ich habe ein Problem mit der Erstellung einer Datei, welche Daten aus einer Basisliste abruft.
In der Basisliste sind Personendaten. Diese Liste wird auch von Zeit zu Zeit geändert.
Ich möchte diese Daten in eine andere Liste kopieren um damit weiterzuarbeiten.
Da ich die Daten aus der Basisliste auch aktualisieren muss, darf es nicht passieren, dass die in der Basisliste gelöschten Daten auch in meiner Datei gelöscht oder überschrieben werden, da die Zeilen dann nicht mehr zueinander passen.
Beispiel: Ich habe eine Query erstellt und in den Spalten rechts daneben mit den Daten aus dem Query gearbeitet. Wenn ich die Query aktualisiere, passen dem entsprechend meine selbst erstellen Spalten mit den Query Daten nicht mehr überein.
Hat jemand Rat?

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
  • 01.02.2016 19:13:03
    Michael
Anzeige
Ansatz
01.02.2016 19:13:03
Michael
Hi Michelle,
test bitte mal die Datei: https://www.herber.de/bbs/user/103207.xls
Das Makro:
Option Explicit
Sub importieren()
Dim o As Object, o1 As Variant
Dim von As Worksheet, nach As Worksheet
Dim zvon&, zbis&, z&, untz&, zvorh&, i&
Dim BerVon As Variant, BerNach As Variant
' geht schneller als Range-Zugriffe
Set von = Sheets("Import")
Set nach = Sheets("Bearbeitet")
zvon = 2
zbis = nach.Range("A" & Rows.Count).End(xlUp).Row
BerNach = nach.Range("A1:C" & zbis) ' bis Spalte "?" anpassen
Set o = CreateObject("scripting.dictionary")
For z = zvon To zbis
o(BerNach(z, 1) & BerNach(z, 2)) = z ' name+vorname
' oder sonstwas, was eindeutig ist, z.B. Personal-Nr.
Next
' **** Damit sind alle Namen mit Zeilennr. eingelesen ******
BerNach = nach.Range("A1:C" & zbis + 500) ' bis Spalte "?" anpassen
zbis = von.Range("A" & Rows.Count).End(xlUp).Row
BerVon = von.Range("A1:C" & zbis) ' bis Spalte "?" anpassen
untz = zbis ' unterste, befüllte Zeile in von bzw. "Bearbeitet"
For z = zvon To zbis
zvorh = o(BerVon(z, 1) & BerVon(z, 2))
If zvorh = 0 Then
zvorh = untz + 1
untz = untz + 1
End If
If untz > 498 Then MsgBox "hier noch was machen"
For i = 1 To 3 ' je nach Spaltenanzahl
BerNach(zvorh, i) = BerVon(z, i)
Next
nach.Range("D" & zvorh) = Now
Next
nach.Range("A1").Resize(zbis + untz, 3) = BerNach
Set o = Nothing
End Sub
Die Idee ist, erst mal alle vorhandenen Personen einzulesen und sich die Zeilennummer zu merken.
Dann werden die Daten importiert und auf ihr Vorhandensein geprüft (ZeilenNr. größer 0); wenn die Zeile vorhanden ist, wird sie mit den aktualisierten Werten überschrieben, wenn sie in der Basisliste (die heißt bei mir "Import") vorhanden ist, aber nicht in Deiner bearbeiteten Version, wird der Name unten angehängt, und wenn sie im Import nicht mehr vorhanden ist (die Hanna Huber), bleibt sie unangetastet.
Wichtig ist, daß Du dabei ein *eindeutiges* Kriterium verwendest!
Zum Testen habe ich mich zu einer Kombination aus Name + Vorname entschlossen, aber die Besonderheit beim "Dictionary" ist, daß doppelte/mehrfache Werte NICHT gespeichert werden. In der Praxis hast Du ja evtl. Personen-Nr., die sind ja dann eindeutig.
Beobachte mal die Werte in Spalte C und D...
Schöne Grüße,
Michael
P.S.: ich habe hier ziemlich "dreckig" programmiert und die Anzahl der neu hinzukommenden Personen auf 500 begrenzt; wenn es bei Dir um ernsthafte Datenmengen geht, muß man das noch nachbessern (d.h. die Daten zwischendrin "wegschreiben").
Anzeige

213 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige