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

Import aus anderen xls Dateien

Import aus anderen xls Dateien
15.02.2015 13:27:07
Ulf
Hallo zusammen,
ich würde mich freuen, wenn ihr mir bei meinem Problem helfen könntet.
Grundsätzliche Beschreibung:
Die Datei „Auswertung.xlsm“ soll regelmäßig (10-minütlich) Daten aus anderen Quellen abrufen, mit den Daten ein paar Berechnungen durchführen und die Ergebnisse in einem Diagramm und einer kleinen Liste darstellen. Bei den Nutzern soll die Datei rund um die Uhr laufen. Eine Interaktion der Nutzer ist nicht (bzw. nur minimal) vorgesehen, d.h. die Nutzer sollen nur die jeweils aktuellen Ergebnisse präsentiert bekommen. Der Datenabruf soll im Hintergrund laufen.
Eine erste lauffähige Version habe ich schon hinbekommen, allerdings kann diese nicht alle gewünschten Funktionen erbringen und der Datenabruf ist auch noch nicht optimal.
Detaillierte Beschreibung:
Die Quelldateien liegen in dem Netzwerkordner X:\Daten
Die Benennung der Dateien folgt einem festen Schema: Datum (yyyymmdd) & „Betriebsdaten_V“ & laufende Versionsnummer
Pro Tag werden zwischen 1 bis 30 Versionen eingestellt
Es kann sein, dass einzelne Versionsnummern ausgelassen werden
Der Aufbau der Dateien ist identisch
Importiert werden soll von der jeweils aktuellen Version der Bereich „C1:C113“ vom Blatt „Tabelle1“ (Abfrage alle 10 Minuten)
Es ist nicht auszuschließen, dass die Quelldatei zum Zeitpunkt des Abrufs von einem anderen Nutzer geöffnet ist (aber nicht verändert wird)
Meine Wünsche:
1. Aktuell ist der Import sehr langsam. Es wird im vorgegebenen Zeittakt immer importiert. Sinnvoll wäre es aber, wenn in einem ersten Schritt erst mal nur geprüft wird, ob seit der letzten Abfrage eine neue Version eingestellt wurde. Falls ja dann importieren, falls nein dann nix machen. Zielbereich Tabelle1 ab Zelle E1
2. Zusätzlich beim Starten von Auswertung.xlsm sowie einmalig täglich nach Mitternacht von der letzten Version des Vortags den Bereich C1:C113 auslesen und in Tabelle 1 ab Zelle D1 importieren
3. Zusätzlich ab 20 Uhr ebenfalls alle 10 Minuten von der neuesten Version des Folgetages den Bereich C1:C113 in Tabelle1 ab Zelle F1 importieren (vorherige Abfrage o/b neue Version vorhanden wie unter 1. beschrieben)
Bonus 1: Wenn für den laufenden Tag eine neue Version gefunden wurde MsgBox „Neue Version!“ die durch den Nutzer mit ok zu bestätigen ist. Import erfolgt aber unabhängig von der Bestätigung.
Bonus 2: Uhrzeit der letzten Abfrage in Tabelle1 Zelle A1 eintragen.
Sonstiges:
Bei den abgerufenen Daten steht in Zeile 5 die jeweilige Version der Datei. Das kann vielleicht genutzt werde, um zu vergleichen ob es eine neue Version gibt.
Hier noch zur Info den bisher von mir verwendeten Code (ohne VBA-Kenntnisse aus verschiedenen Quellen zusammengesucht und für meine Zwecke angepasst):
'** Dimensionierung der Variablen
Dim pfad As String, datei As String, blatt As String, bereich As Range, zelle As Object, StrDate As String, strFile As String
Sub Bereich_auslesen1()
Application.OnTime Now + TimeValue("00:10:00"), "Bereich_auslesen1"
'**aktuelles Datum
StrDate = Format(Now(), "yyyymmdd")
'** Angaben zur auszulesenden Zelle
pfad = "X:\Daten"
blatt = "Tabelle1"
Set bereich = Range("C1:C113")
'Version prüfen und Datenabruf starten
For vers = 30 To 1 Step -1
datei = StrDate & "Betriebsdaten_V" & vers & ".xls"
If Dir(pfad & "\" & datei) "" Then
Call Bereich_auslesen2
Exit For
End If
Next vers
End Sub Sub Bereich_auslesen2()
'** Bereich auslesen
For Each zelle In bereich
'** Zellen umwandeln
zelle = zelle.Address(False, False)
'** Eintragen in Bereich
ActiveSheet.Cells(zelle.Row, zelle.Column).Value = GetValue(pfad, datei, blatt, zelle)
Next zelle
End Sub
Private Function GetValue(pfad, datei, blatt, zelle)
'** Daten aus geschlossener Arbeitsmappe auslesen
'*** Dimensionierung der Variablen
Dim arg As String
'Sicherstellen, dass das datei vorhanden ist
If Right(pfad, 1)  "\" Then pfad = pfad & "\"
If Dir(pfad & datei) = "" Then
GetValue = "datei Not Found"
Exit Function
End If
'** Das Argument erstellen
arg = "'" & pfad & "[" & datei & "]" & blatt & "'!" & Range(zelle).Range("A1").Address(, ,  _
xlR1C1)
'** Auslesen über Excel4Macro
GetValue = ExecuteExcel4Macro(arg)
End Function

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

Betreff
Datum
Anwender
Anzeige
AW: Import aus anderen xls Dateien
15.02.2015 15:00:12
Christian
hallo Ulf,
ich würde
- nicht 24h am Tag Excel laufen lassen, sondern zB. über den Taskplaner ein externes Script (batch, vbs, ...) starten. Dieses Script prüft dann zB. ob es eine neue Version gibt und aktualisiert die xls-Datei.
- den Dateinamen der letzte eingelesene Version irgendwo abspeichern (txt, ...) und dann wie du schreibst vor der nachsten Aktualisierung prüfen, ob sich die neueste Version unterscheidet.
- nicht zeilenweise, sondern den kompletten Bereich auf einmal übertragen, bzw. besser in bestehenden Formeln nur den Dateinamen aktualisieren.
- das ganze nicht parallel auf x Rechner laufen lassen, sondern zentral auf einem Rechner / Server. Wenn jeder Nutzer seine eigene Version brauchen sollte, dann per Script kopieren, sonst reicht der Link.
- Info per MessageBox in VBA wird nicht o.w. funktionieren, da der Ablauf bis zur Bestätigung unterbrochen wird. Alternativ Shell-Befehle wie "msg" bzw "net send".
- "von der neuesten Version des Folgetages den Bereich ...", da wirst du wohl 'ne Kristallkugel brauchen.
Gruß
Christian

Anzeige
AW: Import aus anderen xls Dateien
16.02.2015 21:34:24
Ulf
Hallo Christian,
danke für deine Antwort. Leider hilft mir die nicht so viel weiter.
- Die Variante per Excel-Datei habe ich deshalb gewählt, weil es die einzige Möglichkeit ist, das Projekt sozusagen mit Bordmitteln zu realisieren. Für alles andere (z.B. Serverlösung) müsste ich über unsere IT gehen und das würde dauern.
- Grundsätzlich soll die Datei nur auf einem Rechner rund um die Uhr laufen. Es ist aber nicht auszuschließen, dass sie auch mal auf anderen Rechnern genutzt wird.
- Könnte die Messagebox „Neue Version!“ nicht erst aktiviert werden, wenn der Import abgeschlossen ist?
- „Kristallkugel“: Keine Sorge, ich beschreibe nichts unmögliches. Wenn ich schreibe, dass ab 20 Uhr die neueste Version des Folgetages importiert werden soll, dann gibt es die (in der Regel) auch. Hintergrund: Die Quelldateien beinhalten Prognosen/Zielvorgaben und das Datum im Dateinamen ist der Tag der Gültigkeit, nicht der Erstellung.
Zum Abschluss noch eine Bitte an alle potentiellen Helfer. Meine VBA-Kenntnisse sind recht spärlich. Bei einer rein textlichen Beschreibung einer Lösung, werde ich es wahrscheinlich nicht hinbekommen, dies in VBA umzusetzen. Über zumindest etwas beispielhaften Code würde ich mich deshalb sehr freuen.
Viele Grüße
Ulf

Anzeige
AW: Import aus anderen xls Dateien
17.02.2015 13:00:38
Christian
hallo Ulf,
Taskplaner, vbs, batch, etc. sind doch alles Windows-Bordmittel. Und vbs basiert schließlich genau wie vba auch auf vb. Um 20-30 mal am Tag ein paar Daten zu importieren, macht es keinen Sinn Excel 24H-365T durchlaufen zu lassen.
Könnte die Messagebox nicht erst aktiviert werden, wenn der Import abgeschlossen ist? Nein, die klassische MsgBox unterbricht den Code.
Alternativ: API-Funktionen oder Userform, da musst du aber drauf achten, das sich das mit deinem "OnTime" nicht beißt.
...und das Datum im Dateinamen ist der Tag der Gültigkeit, nicht der Erstellung. Dann liegst du aber mit deinem Ansatz à la "StrDate = Format(Now(), "yyyymmdd")" falsch.
Um mal bei deinem "Excel läuft durch" zu bleiben, hier ein Ansatz. Dabei werden in A1:B3 Zeitstempel und Dateinamen geschrieben.
Option Explicit
Dim dblTime As Double
Sub StartImport()
Call ImportData
End Sub
Private Sub NextImport()
dblTime = Now + TimeSerial(0, 1, 0)
Application.OnTime dblTime, "ImportData"
End Sub
Sub StopImport()
Application.OnTime dblTime, "ImportData", Schedule:=False
End Sub
Private Sub ImportData()
Dim strPath As String
Dim strFile As String
Dim strDate As String
Dim wkb As Workbook
Dim wks As Worksheet
Dim i As Long
Call NextImport
strDate = Format(Date, "YYYYMMDD")
strPath = "X:\Daten"
If Right(strPath, 1)  "\" Then strPath = strPath & "\"
Application.ScreenUpdating = False
With ThisWorkbook.Sheets("Tabelle1")
For i = 30 To 1 Step -1
strFile = strPath & strDate & "Betriebsdaten_V" & i & ".xls"
If Dir(strFile)  "" Then
Set wkb = Workbooks.Open(strFile, ReadOnly:=True)
Set wks = wkb.Sheets("Tabelle1")
If .Cells(2, 2)  strFile Then
.Cells(1, 5).Resize(113) = wks.Cells(1, 3).Resize(113).Value
.Cells(1, 1) = "Import:"
.Cells(1, 2) = Now
.Cells(2, 1) = "File:"
.Cells(2, 2) = strFile
End If
.Cells(3, 1) = "Last Check:"
.Cells(3, 2) = Now
wkb.Close 0
ThisWorkbook.Save
Exit For
End If
Next
End With
Application.ScreenUpdating = True
Set wks = Nothing
Set wkb = Nothing
End Sub
Gruß
Christian

Anzeige
AW: Import aus anderen xls Dateien
18.02.2015 21:11:37
Ulf
Hallo Christian,
vielen Dank. Ich konnte den Code bisher nur zu Hause testen, da läuft er super. Die nächsten Tage werde ich es auf Arbeit testen.
Die MsgBox ist erst mal nicht so wichtig, wäre eh nur Bonus gewesen.
In einem Firmennetzwerk sind auch Windows-Bordmittel für den Nicht-Admin manchmal unerreichbar. Nur mal als Beispiel: Ich habe weder Zugriff auf die Einstellungen für den Bildschirmschoner noch kann ich die Browser-Startseite verändern. Ob ich die von dir genannten Windows-Bordmittel nutzen könnte, weiß ich nicht, da habe ich zu wenig Ahnung von. Aber was definitiv nicht geht (bzw. nur mit unserer IT) wäre eine Serverlösung. Die dauerlaufende Excel-Datei dient zudem ja nicht nur dem Datenabruf und der Berechnung, sondern auch der Datenausgabe für den Nutzer.
Was ich nicht verstehe, wo das Problem liegt, die Daten für den morgigen Tag abzurufen. Kann ich nicht z.B. ein Sub ImportDataMorgen einfügen und bei der Generierung des Dateinamens strDate = Format(Date + 1, "YYYYMMDD") verwenden?
Viele Grüße
Ulf

Anzeige
AW: Import aus anderen xls Dateien
19.02.2015 08:00:26
Christian
Hallo Ulf,
doch, natürlich kannst du das morgige Datum so verwenden. Mir wurde aus deiner bisherigen Beschreibung nicht klar, mit welchem Datum die Dateinamen wirklich vorliegen.
Noch ein Punkt - versetzte die folgenden 3 Zeilen direkt vor "End With":
.Cells(3, 1) = "Last Check:"
.Cells(3, 2) = Now
ThisWorkbook.Save
Dann wird "Last Check:" auch aktualisiert, wenn es keine "heutige" Datei gibt.
Gruß
Christian

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige