Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
620to624
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
620to624
620to624
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Datensätze über Schlüsselvariable einlesen

Datensätze über Schlüsselvariable einlesen
06.06.2005 09:51:45
Michael
Hallo, guten Morgen,
ich suche eine VBA-Lösung für folgende Aufgabe. Sie muss nicht ausformuliert sein, eine elegante Strategie wäre schon genug.
In eine Arbeitsmappe1 sollen über die Monate hinweg sukzessiv Daten eingelesen werden. In Spalte A ist eine Schlüsselvariable (eine eineindeutige Variable, z.B. Artikelnummer), über die die Zuordnung der einzulesenden Daten erfolgen soll. Die Anzahl, Identität und Reihenfolge der einzulesenden Schlüsselvariablen ist aber nicht konstant. Zum Beispiel also:
Arbeitsmappe1
9872 DatenJanuar DatenFebruar
2345 DatenJanuar DatenFebruar
8465 DatenJanuar DatenFebruar
QuelldatenmappeMärz
8465 DatenMärz
9872 DatenMärz
9112 DatenMärz
1234 DatenMärz
Bei noch nicht in der Arbeitsmappe1 vorhandenen Datensätzen (z.B. 9112 im Beispiel) soll dieser Datensatz zusätzlich aufgenommen werden (z.B. mit "-" für nicht vorhandene Daten in DatenJanuar), bzw. nicht vorhandene Datensätze im Quelldatensatz sollen als "-" eingetragen werden.
Wie vergleicht man die Schlüsselvariablen am besten? Da es sich um viele Datensätze handelt, sollte die Lösung idealerweise auch auf hohe Ausführungsgeschwindigkeit achten.
Dank & Gruss,
Michael

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Datensätze über Schlüsselvariable einlesen
06.06.2005 10:01:51
MichaV
Hi,
m.E. nach höchste Such- Geschwindigkeit:

Dim x
Dim z
z = 9112 'zu suchende Schlüsselnummer
On Error Resume Next
x = Application.WorksheetFunction.Match(z, Range("a:a"), 0) 'entspr. Funktion "Vergleich"
If Err.Number = 1004 Then
MsgBox "nicht gefunden"
Else
MsgBox x '1. Auftreten von z in Zeile x
End If
On Error GoTo 0

Gruss- Micha
AW: Datensätze über Schlüsselvariable einlesen
06.06.2005 13:19:49
Michael
Hi MichaV,
danke, hab ich gleich eingebaut. Ich meinte allerdings mehr die gesamte Vorgehensweise. Meine Vorgehensweise erscheint´mir doch recht umständlich. Hast du da noch eine Idee:
(habs noch nicht getestet, Verbesserungsvorschläge willkommen!)
Option Base 1

Sub DatensaetzeVereinigen()
Dim i As Long, j As Long, n As Long
Dim numberDataSets As Long, numberDataSetsNewData As Long
Dim arrOld(numberDataSets) As Variant, arrNew(numberDataSetsNewData) As Variant
'Einlesen der bestehenden Datensatznamen in arrOld
For i = 1 To numberDataSets
arrOld(i) = ThisWorkbook.Worksheets(1).Cells(i + 1, 1).Value
Next i
'Einlesen der einzulesenden Datensatznamen in arrNew
For i = 1 To numberDataSetsNewData
arrNew(i) = Workbooks(dataFileName).Worksheets(1).Cells(i + 1, 1).Value
Next i
'Eindeutigkeit der einzulesenden Datensaetze überprüfen
For i = 1 To numberDataSetsNewData
n = Application.WorksheetFunction.CountIf _
(Workbooks(dataFileName).Worksheets(1).Range(Cells(2, 1), Cells(numberDataSetsNewData + 1, 1)), arrNew(i))
If n > 1 Then
MsgBox ("Die Datensätze sind nicht eindeutig")
Exit Sub
End If
'Datensaetze vergleichen
For i = 1 To numberDataSetsNewData
dataSet = Application.WorksheetFunction.Match(arrNew(i), _
ThisWorkbook.Worksheets(1).Range(Cells(2, 1), Cells(1 + numberDataSets, 1)))
If Err.Number = 1004 Then
'Code um zusätzliche Datensätze aufzunehmen
End If
'Code um Daten bestehender Datensätze einzulesen
Next i
For i = 1 To numberDataSets
dataSet = Application.WorksheetFunction.Match(arrOld(i), _
Workbooks(dataFileName).Worksheets(1).Range(Cells(2, 1), _
Cells(numberDataSetsNewData + 1, 1)))
If Err.Number = 1004 Then
'Code um nicht vorhandene neue Daten als "-" einzutragen
End If
Next i
End Sub

Anzeige
AW: Datensätze über Schlüsselvariable einlesen
06.06.2005 14:02:41
MichaV
Hi,
3 Sachen, die mir dazu einfallen, auch ungetestet:
1.)Einlesen der bestehenden Datensatznamen in Deine beiden Arrays geht schneller mit z.B.:
arrOld=Application.WorksheetFunction.Transpose(ThisWorkbook.Worksheets(1).Range(Cells(2,1),Cells(numberDataSets+1,1)))
Damit sparst Du 2 Schleifen. Dimensionieren musst Du als leeres Array Dim arrOld()
2.)Ich würde die Daten dann so abgleichen:
zuerst:

Workbooks(dataFileName).Worksheets(1).Range(Cells(2, x), Cells(numberDataSetsNewData + 1, x))="-"

also in Spalte x bei jedem vorhandenen Datensatz ein "-" eintragen
2. Schleife:
Wie Deine 1. Vergleichs- Schleife, die "-" werden dann ggf. durch aktuelle Daten überschrieben. Damit sparst Du Dir wieder eine Schleife.
3. Ansonsten Err.Clear vor jeder neuen oder direkt nach der alten Fehlerabfrage nicht vergessen:

If Err.Number = 1004 Then
'Code um nicht vorhandene neue Daten als "-" einzutragen
End If
Err.Clear

Gruss- Micha
PS: Rückmeldung wäre nett
Anzeige
AW: Datensätze über Schlüsselvariable einlesen
07.06.2005 09:29:18
Michael
Hi MichaV,
danke nochmal für Deine Ideen!
Deinen ersten Punkt konnte ich allerdings nicht umsetzen. Da scheinen die Klammern zu fehlen arrOld()=Application..... aber auch noch was nicht ganz zu stimmen. Die Idee mit "Transpose" legt bildlich nahe, dass (zumindest die erste Dimension eines) arrays "waagrecht" sind. Ich habe da im Archiv und der Excel Hilfe aber nichts gefunden, nur die andere Richtung (array in eine Spalte auslesen).
Gruss, Michael
AW: Datensätze über Schlüsselvariable einlesen
07.06.2005 10:59:06
MichaV
Hi,
die Klammer gehört da nicht hin.
Das Transponieren machst Du, damit Dein Array nur eine Dimension erhält. Bei arr=Range(...) kriegt das Array automatisch 2 Dimensionen, wenn Du aber nur eine Zeile/ Spalte beschreibst, ist die 2. Dimension sinnlos. Bei Daten in Spalten musst Du 1x Transponieren, um ein "ordentliches" eindimensionales Array zu erhalten, bei Daten in Zeilen dagegen 2 mal.
Hier mal eine Beispielmappe: https://www.herber.de/bbs/user/23687.xls
Gruss- Micha
Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige