PDA

Vollständige Version anzeigen : Zellen aus zweiter Datei auslesen


Jann Hendrik
28.03.2012, 19:38
Hallo,
ich habe eine Frage - ich bin gerade ein wenig am Basteln.

Ich habe zwei Excel-Dateien.

In beiden Excel-Dateien sind einige Zellen identisch.

In einer der beiden Dateien sind in den Spalten A, B und C Werte eingetragen, die in der Kombination in der Datei nur einmal vorkommen.
In der anderen Datei kommt diese Kombination ebenfalls nur einmal vor (wenn nicht, dann reicht der erste Eintrag von den mehreren Treffern).

Nun möchte ich in einer der beiden Dateien ein VBA-Skript starten und weitere Zelleninhalte (bei Übereinstimmung) in die andere Datei übernehmen.

Ich stelle mir das so vor, dass ich eine Datei öffne; das VBA-Skript starte; und dann zeilenweise die Datei durchgegangen wird. Es wird für jede Zeile die Kombi aus Spalte A+B+C in der anderen Datei gesucht - und im Fall eines Treffers dann dort (z.B.) Spalte D, F, J ausgelesen und die Werte dann übernommen.

Kann mir jmd. helfen das umzusetzen?

Meine letzten VBA-Einsätze liegen schon ein wenig zurück. In den letzten Jahren hätte ich sowas eher mit einer richtigen Datenbank gemacht. Dies ist jedoch in diesem Fall nicht möglich, da es sich um einen Report handelt, der aus einer Fremd-Software erstellt wird und hier auch nicht die Möglichkeit vorliegt div. andere Software einzusetzen...

Ich bin über Hilfe dankbar!

ebs17
28.03.2012, 23:59
In den letzten Jahren hätte ich sowas eher mit einer richtigen Datenbank gemacht.
Dort dann sicher über eine Abfrage (SQL) und nicht zeilenweise über VBA, oder? Massendatenverarbeitung schlägt Einzeldatenverarbeitung.

Die gute Nachricht: Du kannst SQL auch direkt in Excel einsetzen, ganz ohne Datenbank, vergleiche ADO und Excel (http://www.online-excel.de/excel/singsel_vba.php?f=135).

User Alfred
29.03.2012, 07:06
Versuch es mal damit.

Sub im_Hintergrund_bestehende_Mappe_oeffnen()
On Error GoTo Fehler
Dim objWb As Object
Dim objSH As Object
Dim AktuelleMappe As Workbook
Set AktuelleMappe = ActiveWorkbook
'----------------------------------------------------
Set objWb = GetObject("C:\Ordner\Dateiname.xls")
'zu öffnende Datei (Kopierdatei) eintragen
'----------------------------------------------------
'----------------------------------------------------
Set objSH = objWb.Sheets(1)
'die erste Mappe anwählen
'----------------------------------------------------
'----------------------------------------------------
objSH.Range("A1:C9980").Copy AktuelleMappe.Sheets(1).Cells(1, 1)
'von der zu kopierenden Datei die Zeile (A1 bis C9980) kopieren und in der aktuellen Datei in der ersten Mappe in Zeile (1, A) einfügen
'----------------------------------------------------
objWb.Close savechanges:=False
Set objSH = Nothing
Set objWb = Nothing
Exit Sub
Fehler:
MsgBox "Achtung! Keine Quelldatei gefunden. Operation NICHT erfolgreich"
Set objSH = Nothing
Set objWb = Nothing
End Sub


Dieses Makro habe ich in leichter abgeänderter Form einst für meine Zwecke hier aus dem Forum bekommen. Ich hoffe, das Du es so in etwa einsetzen kannst.

Gruß Alf

Jann Hendrik
30.03.2012, 19:11
@ebs17: Da ich das ganze innerhalb der IT-Struktur eines Unternehmens machen muss, das arg restriktiv gehalten ist (über 50.000 Mitarbeiter, zuzüglich viele Fremdfirmen, die im gleichen Netz arbeiten) - um es kurz zu machen: Ich kann es gerne die nächsten Tage im Büro ausprobieren, aber ich befürchte, dass es schon zu viel an Rahmenbedingungen voraussetzt, die hier nicht mehr einzuhalten, bzw. zu erstellen sein werden.

Ja - ich bin ein absoluter SQL-Freund.
Daher würde ich das am ehesten noch in Access umsetzen - aber auch hier bin ich leider in meiner Umgebung 'gefangen'. Trotzdem sieht der Weg über ADO (alle Daumen hoch) interessant aus!


@User Alfred:
Soweit schon ein guter Ansatz. Was mir dann noch fehlt wäre ein Vergleich der Zelleninhalte für die Selektierung der korrekten Zeile in welcher die gewünschten Daten versteckt sind.

Es geht in meinem Fall um drei Zellen die in beiden Dateien identisch sein müssen, damit ein match vorliegt.

Hat hierzu jmd. eine Idee?
Dann könnte ich mich an die konkrete Umsetzung machen.

Einen kompletten Bereich zu kopieren fällt bei mir leider aus.



Ich befürchte ohnehin schon, dass das voll der Performance-Killer werden wird, da ich rund 100-200 (schwankend) Zeilen pro Durchlauf (in Zieldatei) mit rund 500-1000 Zeilen (Quelldatei) gegeneinander prüfen muss. Das heißt, ich muss den Durchlauf dann 100-200 wiederholen. Und um genau zu sein - ich habe 2 Quelldateien; das Prinzip aber ist ja das gleiche...

ebs17
30.03.2012, 19:54
dass es schon zu viel an Rahmenbedingungen voraussetzt
Die Jet-Engine ist seit etwa Windows2000 Bestandteil des Betriebssystems, wie auch analog ADODB und DAO als Zugriffstechnologien Bestandteil eines "üblichen" Windowssystems sind.

Die andere Rahmenbedingung ist, dass sich die Exceltabellen als Datenbanktabellen verwenden lassen, dass wäre aber bei einem Standardimport in Access ebenfalls zwingend notwendig.

Das ist alles. Hast Du Windows, Excel und diese Mappen auf Deinem Rechner zur Verfügung? Da Excel nicht mehrbenutzerfähig ist, würde mich die IT-Struktur eines 50.000-MA-Unternehmens recht wenig interessieren, außer sie bietet zusätzliche Hilfestellungen.

Ein Import in Access hätte den Vorteil, dass sich Tabellenfelder indizieren lassen und so eine performantere Abfrage möglich wäre. Ohne Indizes kannst Du aber auch in Excel bleiben.
Access hätte noch den Vorteil, dass man sich Abfragen über den Abfrageeditor erstellen kann. Mit etwas Kenntnissen kann man aber auch eine SQL-Anweisung per Hand schreiben oder aus Access kopieren.

Als Anwendungsbeispiel: VBA - MATRIX-Formel über VBA -> zu langsam. Dort gibt es aber auch feine Beispiele mit Einsatz von Dictionaries.