Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Daten aus geschlossener Datei auslesen

Daten aus geschlossener Datei auslesen
22.12.2004 15:49:15
R.Schmitt
Zunächst einmal vielen Dank an Coach,
der mir bei meiner Frage, wie die Daten-
quelle einer Pivottabelle als Variable
zu schreiben war so toll weitergeholfen
hat. Hat prima gekplappt.
Jetzt die schlechte Nachricht.
Nach Ändern der Datenquelle auf eine andere
(geschlossene) Datei wurde meine vormals 4MB
große Datei auf über 22MB "aufgebläht" und auch
alle weiteren Veränderungen an der Pivottabelle
(Ein- und Ausblenden von Items) dauert wesentlich
länger.
Ich versuche jetzt die Daten wieder aus
einem Arbeitsblatt in der gleichen Datei
zu holen und befinde mich damit auf einem
"schmalen Brett".
Lösen will ich das über eine Formel. Nur welche ?
In der Spalte A dieser Tabelle auf die ich zugreifen
will steht die Artikelnummer (und ist mehr als
einmal vorhanden) Dahinter stehen dann die Daten,
die ich auslesen will.
Wie kann ich einer Tabelle in Datei A sagen,
dass Sie alle Werte einer Zeile in Tabelle B
ausliest, wenn in der ersten Zelle der betreffenden
Zeile, die gesuchte Artikelnummer steht ?
Und zwar nicht über Makro, sondern über Formel.
Mit SVERWEIS komme ich da ja nicht sonderlich weit
oder ?
Grüße
R.Schmitt
Anzeige
AW: Daten aus geschlossener Datei auslesen
Boris
Hi R.,
lad doch mal ne kleine Beispieltabelle auf den Server. Die Lösung sollte dann kein größeres Problem sein.
Grüße Boris
AW: Daten aus geschlossener Datei auslesen
R.Schmitt
Bitteschön
https://www.herber.de/bbs/user/15203.zip
in der Spalte A wie gesagt, die Artikelnummer.
In Tabelle1 der anderen Datei will ich dann
m Feld A1 nur noch die gesuchte Artikelnummer
eingeben müßen, um in den Zeilen darunter dann
nur die Zeilen aus der Beispieldatei angezeigt
zu bekommen, in deren erstem Spaltenfeld die
gesuchte Artikelnummer vorkommt.
Viele Grüße
R.Schmitt
Anzeige
AW: Daten aus geschlossener Datei auslesen
Boris
Hi R.,
ich hab mal mehrere Tipps für Dich:
1.) Deine Beispieldatei ist 510 KB groß, obwohl sie eigentlich nur 84 Zeilen hat.
Markiere mal die Zeilen 85 bis 65536, rechte Maustaste, Zellen löschen. Dann Datei sofort speichern.
Jetzt ist sie nur noch schlappe 19 KB groß.
2.)
Deine Artikelnummern sind - aus welchem Grund auch immer - Text (obwohl Zellformat "Standard"). Das ist mir bei der noch folgenden Formellösung aufgefallen.
Mach daraus mal eine Zahl, indem du eine leere Zelle kopierst, die gesamte Spalte A (mit den Artikelnummern) markierst, rechte Maustaste, Inhalte einfügen, Haken bei Addieren, und ok.
Jetzt sind es wieder Zahlen (auch daran zu erkennen, dass sie in der Zelle rechtsbündig stehen).
3.) Zu der eigentlichen Lösung:
In die neue Datei schreibst du in A1 die gewünschte Artikelnummer.
Dann in A2 folgende Array-Formel:
{=WENN(ZEILE($A1)&gtSUMME(N('C:\[Artikeldaten2.xls]Tabelle1'!$A$1:$A$84=$A$1));"";INDEX('C:\[Artikeldaten2.xls]Tabelle1'!B:B;KKLEINSTE(WENN('C:\[Artikeldaten2.xls]Tabelle1'!$A$1:$A$84=$A$1;ZEILE($1:$84));ZEILE($A1))))}
(Ich hab die Datei "Artikeldaten2.xls" mal direkt auf C: gespeichert - das musst du natürlich bei dir anpassen)
Die {geschweiften Klammern} gibst du nicht mit ein. Stattdessen schließe die Formeleingabe mit Strg-Shift-Enter ab (statt mit Enter allein). So werden sie automatisch erzeugt.
Diese Formel aus A2 kopierst du jetzt nach rechts bis D2 und dann alle Formeln soweit runter, wie maximal Treffer vorkommen können (kommt kein Treffer mehr vor, bleiben die Zellen leer).
Ich hab das jetzt mal bis Zeile 84 geschrieben - das musst du in der Formel ggfls. erweitern.
Aber Achtung: Die Arrayformeln sind sehr rechenintensiv. Wähle alle Bereich nur so groß wie gerade eben nötig - sonst geht dir die Performance fliegen.
Grüße Boris
Anzeige
AW: Daten aus geschlossener Datei auslesen
R.Schmitt
Dank´dir Boris,
so oder zumindest so ähnlich hatte ich es auch schon
angegangen. Für das Textformat in der Datei bitte ich
um Nachsicht. (ist nur ein entfremdeter Ausriß aus der
Originalliste und wohl beim Erstellen von Artikeldaten2
passiert)
Mein Problem ist genau der von dir angesprochene Bereich
und seine Größe.
Ich habe solche Artikellisten (von A1 bis Q40.000) nämlich
gleich 10x in einer Datei mit Namen "Daten". Auf diese Daten
soll nun niemand direkt Zugriff haben, desswegen ist sie
auch passwordgeschützt.
Mit einer Pivot wollte ich immer nur die Zahlen auslesen
auf die der Anwender (nach Einwahl durch PIN identifiziert)
Zugriff hat.
Der Leiter der Zweigstelle A hat nach Eingabe seiner Pin
auch nur Zugriff auf die Daten im Arbeitsblatt A von "Daten".
B nur auf B und so weiter.
Um die Auswertungsdatei etwas "geschmeidiger" zu machen, hatte
ich vor, nur jeweils die Daten aus "Daten" in meine Auswertungs-
datei (als Quelle der Pivottabelle dort)zu laden, für die der
Anwender berechtigt ist und die er auch gerade sehen will.
MS Query geht nicht - weil bei uns noch welche mit Version ´97
rumturnen.
Klar kann man jedesmal "Daten" aufmachen und die benötigten
Infos mittels Autofilter und Verweis auf das entsprechende Blatt
in die Auswertungsdatei holen.
Aber genau das ist es, was ich umgehen will. Denn Öffnen, Autofilter
Copy/Paste etc. braucht ja auch nicht wenig Zeit.
Auch konsolidierte Pivots mit mehreren Bereichen gehen mir nach
dem fünften Arbeitsblatt in die Knie : Performance = NULL.
Mit deiner Formel muß ich jeweils den ganzen Bereich A1 bis Q40000
abgrasen und habe im Zweifelsfall 38.000 leere Zeilen und bunt verstreut
meine 2.000 gesuchten vollen Zeilen bunt verstreut in A1:Q40.000.
Doch wie diese immer ganz oben stehen haben ?
Vielen Dank jedenfalls
R.Schmitt
Anzeige
Dann eben per VBA
Boris
Hi R.,
pack den Code in ein allgemeines Modul und starte ihn aus dem Tabellenblatt, in dem die Suche (und Ausgabe) stattfindet:
Option Explicit
Sub machs()
Dim C As Range, rngArtikel As Range, lRow As Long
Dim wbArtikel As Workbook, firstAddr As String
Application.ScreenUpdating = False
Set wbArtikel = GetObject("C:\Artikeldaten2.xls") 'Pfad anpassen!!!
Set rngArtikel = [a1] 'Suchbegriff = Artikelnummer
lRow = 2 'Startzeile für die Ausgabe
With wbArtikel.Worksheets("Tabelle1").Range("A:A")
Set C = .Find(rngArtikel, lookat:=xlWhole)
Rows("2:65536").Clear 'Ausgabebereich leeren
If Not C Is Nothing Then
firstAddr = C.Address
Do
Cells(lRow, 1) = C.Offset(0, 1)
Cells(lRow, 2) = C.Offset(0, 2)
Cells(lRow, 3) = C.Offset(0, 3)
Cells(lRow, 4) = C.Offset(0, 4)
lRow = lRow + 1
Set C = .FindNext(C)
Loop While Not C Is Nothing And C.Address <> firstAddr
Else
MsgBox "Artikelnummer " & rngArtikel & " nicht gefunden.", , "Fehlanzeige..."
End If
End With
wbArtikel.Close
Set wbArtikel = Nothing
Application.ScreenUpdating = True
End Sub

Hilft´s?
Grüße Boris
Anzeige
Noch etwas schlanker...
Boris
Hi,
..beim Übertragen der Ergebnisse:
Option Explicit
Sub machs()
Dim C As Range, rngArtikel As Range, lRow As Long
Dim wbArtikel As Workbook, firstAddr As String
Application.ScreenUpdating = False
Set wbArtikel = GetObject("C:\Artikeldaten2.xls")
Set rngArtikel = [a1] 'Suchbegriff = Artikelnummer
lRow = 2 'Startzeile für die Ausgabe
With wbArtikel.Worksheets("Tabelle1").Range("A:A")
Set C = .Find(rngArtikel, lookat:=xlWhole)
Rows("2:65536").Clear 'Ausgabebereich leeren
If Not C Is Nothing Then
firstAddr = C.Address
Do
Range(Cells(lRow, 1), Cells(lRow, 4)) = C.Offset(0, 1).Resize(1, 4).Value
lRow = lRow + 1
Set C = .FindNext(C)
Loop While Not C Is Nothing And C.Address <> firstAddr
Else
MsgBox "Artikelnummer " & rngArtikel & " nicht gefunden.", , "Fehlanzeige..."
End If
End With
wbArtikel.Close
Set wbArtikel = Nothing
Application.ScreenUpdating = True
End Sub

Grüße Boris
Anzeige
Whow !!!!!!!!!!
R.Schmitt
...in Farbe und BUNT ;-))
Lieber Boris,
vielen vielen Dank.
Ja es tut
Jetzt muß ich nur noch gucken, wie lang´
er bei 40.000 Zeilen braucht und ihm das
Arbeitsblatt in dem er zu suchen hat als
Variable mitgeben. Ich denke mal, dass krieg
ich noch alleine hin (**hoff**).
Dir ein schönes Weihnachtsfest und lass´dich
reich beschenken
Verdient hast Du´s dir ja allemal mit der Antwort.
Grüße
R.Schmitt
Anzeige
Und zu guter letzt noch variabler...
Boris
Hi R.,
...könnte das so aussehen:
Option Explicit
Sub Artikel_auflisten()
Dim C As Range, rngArtikel As Range, lRow As Long
Dim wbArtikel As Workbook, firstAddr As String
Dim wsArtikel As Worksheet
Dim wbZiel As Workbook, wsZiel As Worksheet, rngSuch As Range
Application.ScreenUpdating = False
Set wbArtikel = GetObject("C:\Artikeldaten2.xls") 'Quelldatei
Set wsArtikel = wbArtikel.Worksheets("Tabelle1") 'Blatt in Quelldatei
Set rngSuch = wsArtikel.[a:a] 'Suchbereich im Blatt der Quelldatei - hier: Spalte A
Set wbZiel = ThisWorkbook 'Zieldatei
Set wsZiel = wbZiel.Worksheets("Tabelle1") 'Blatt in Zieldatei
With wsZiel
Set rngArtikel = .[a1] 'Suchbegriff = Artikelnummer aus A1 des Blattes wsZiel
lRow = 2 'Startzeile für die Ausgabe
Set C = rngSuch.Find(rngArtikel, lookat:=xlWhole)
.Rows("2:65536").Clear 'Ausgabebereich leeren
If Not C Is Nothing Then
firstAddr = C.Address
Do
.Range(.Cells(lRow, 1), .Cells(lRow, 4)) = C.Offset(0, 1).Resize(1, 4).Value
lRow = lRow + 1
Set C = rngSuch.FindNext(C)
Loop While Not C Is Nothing And C.Address <> firstAddr
Else
MsgBox "Artikelnummer " & rngArtikel & " nicht gefunden.", , "Fehlanzeige..."
End If
End With
wbArtikel.Close
Set rngSuch = Nothing
Set wsArtikel = Nothing
Set wbArtikel = Nothing
Set wsZiel = Nothing
Set wbZiel = Nothing
Application.ScreenUpdating = True
End Sub

Auch dir ein frohes Fest!
Grüße Boris
Anzeige
AW: Und zu guter letzt noch variabler...
R.Schmitt
Hi Boris,
funzt - variabel oder statisch.
Schon für die große Liste angepasst und
in Bestzeit. Jetzt lass´ich´s für heute
aber gut sein. Die Anwendung war schließlich
nicht als Weihnachtsgeschenk gedacht, sondern
muß erst zur nächsten Tagung im Februar fertig
werden.
Gruß
R.Schmitt
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Daten aus geschlossener Excel-Datei auslesen


Schritt-für-Schritt-Anleitung

  1. Artikelnummer eingeben: Öffne die Auswertungsdatei und gib die gesuchte Artikelnummer in Zelle A1 ein.
  2. Array-Formel eingeben: Trage in Zelle A2 die folgende Array-Formel ein:
    {=WENN(ZEILE($A1)>SUMME(N('C:\[Artikeldaten2.xls]Tabelle1'!$A$1:$A$84=$A$1));"";INDEX('C:\[Artikeldaten2.xls]Tabelle1'!B:B;KKLEINSTE(WENN('C:\[Artikeldaten2.xls]Tabelle1'!$A$1:$A$84=$A$1;ZEILE($1:$84));ZEILE($A1))))}

    Hinweis: Schließe die Eingabe mit Strg+Shift+Enter ab, um die geschweiften Klammern automatisch zu erzeugen.

  3. Formel kopieren: Kopiere die Formel nach rechts bis D2 und nach unten, um alle möglichen Treffer anzuzeigen.
  4. Daten überprüfen: Stelle sicher, dass die Quelldatei (Artikeldaten2.xls) korrekt angegeben ist und die Artikelnummern im richtigen Format vorliegen.

Häufige Fehler und Lösungen

  • Leere Zellen: Wenn leere Zellen angezeigt werden, überprüfe, ob die Artikelnummer im richtigen Format (Zahl) vorliegt. Möglicherweise sind die Artikelnummern als Text formatiert. Verwende die Methode „Inhalte einfügen“ mit „Addieren“, um sie in Zahlen umzuwandeln.

  • Formel funktioniert nicht: Achte darauf, dass der Pfad zur geschlossenen Datei korrekt ist und dass du die Array-Formel richtig eingegeben hast (mit Strg+Shift+Enter).

  • Leistungseinbußen: Wenn die Performance leidet, reduziere die Größe des Suchbereichs in der Formel, um die Berechnungen zu optimieren.


Alternative Methoden

Falls du die Formel nicht verwenden möchtest, gibt es auch die Möglichkeit, VBA zu nutzen, um Daten aus einer geschlossenen Datei auszulesen. Hier ist ein einfacher VBA-Code:

Option Explicit
Sub Artikel_auflisten()
    Dim C As Range, rngArtikel As Range, lRow As Long
    Dim wbArtikel As Workbook, firstAddr As String
    Application.ScreenUpdating = False
    Set wbArtikel = GetObject("C:\Artikeldaten2.xls") ' Pfad anpassen!
    Set rngArtikel = [A1] ' Suchbegriff = Artikelnummer
    lRow = 2 ' Startzeile für die Ausgabe
    With wbArtikel.Worksheets("Tabelle1").Range("A:A")
        Set C = .Find(rngArtikel, lookat:=xlWhole)
        Rows("2:65536").Clear ' Ausgabebereich leeren
        If Not C Is Nothing Then
            firstAddr = C.Address
            Do
                Cells(lRow, 1) = C.Offset(0, 1)
                lRow = lRow + 1
                Set C = .FindNext(C)
            Loop While Not C Is Nothing And C.Address <> firstAddr
        Else
            MsgBox "Artikelnummer " & rngArtikel & " nicht gefunden.", , "Fehlanzeige..."
        End If
    End With
    wbArtikel.Close
    Set wbArtikel = Nothing
    Application.ScreenUpdating = True
End Sub

Dieser Code sucht nach der Artikelnummer und gibt die entsprechenden Daten aus.


Praktische Beispiele

  • Beispiel 1: Nehmen wir an, du hast eine Liste von Artikelnummern in einer Datei und möchtest die dazugehörigen Preise in einer anderen Datei anzeigen. Verwende die oben genannte Array-Formel, um alle Preise zu extrahieren, wenn die Artikelnummer in A1 eingegeben wurde.

  • Beispiel 2: Mit VBA kannst du die Suche automatisieren, indem du die Artikelnummer in Zelle A1 eingibst und der Code die Daten in der Zielarbeitsmappe anzeigt. Dies ist besonders nützlich, wenn du häufig auf große Datenmengen zugreifen musst.


Tipps für Profis

  • Datenformatierung: Achte darauf, dass die Artikelnummern in beiden Dateien im gleichen Format vorliegen. Dies kann durch Kopieren und Einfügen in eine leere Zelle erreicht werden, wie bereits erwähnt.

  • Effizienz: Verwende nur die benötigten Datenbereiche in deinen Formeln. Das reduziert die Rechenzeit erheblich und verbessert die Leistung.

  • Automatisierung: Wenn du regelmäßig Daten aus einer geschlossenen Datei auslesen musst, ziehe in Betracht, ein VBA-Skript zu erstellen, das diese Aufgabe für dich automatisiert.


FAQ: Häufige Fragen

1. Frage
Kann ich Daten aus mehreren geschlossenen Dateien auslesen?
Antwort: Ja, du kannst mehrere Formeln erstellen oder ein VBA-Skript anpassen, um Daten aus verschiedenen Dateien zu extrahieren.

2. Frage
Was ist der Unterschied zwischen Array-Formeln und normalen Formeln?
Antwort: Array-Formeln können mehrere Werte gleichzeitig berechnen und sind nützlich, um Daten aus geschlossenen Dateien effizient auszulesen. Sie benötigen jedoch eine andere Eingabemethode (Strg+Shift+Enter).

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige