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

Daten aus geschlossener Arbeitsmappe auslesen

Daten aus geschlossener Arbeitsmappe auslesen
26.10.2014 15:03:21
Z
Hallo Excel Freunde,
ich versuche Daten aus geschlossenen Dateien (ganze Bereiche) auszulesen. Wie ich nach Recherchen festgestellt habe gehts zwar mit indirekt, aber nach schließen der Datei ist dann eben eine Fehlermeldung "#Bezug" da. Scheint also nur mit Makro zu gehen. Und da kenne ich mich leider überhaupt nicht aus, nicht einmal wohin genau das Makro gespeichert werden muss (Modul? in der Arbeitsmappe?) Ok wie man da hinkommt das weiß ich (Alt+F11 :)).
Könnt ihr mir da weiter helfen?
Folgender Aufbau:
Es gibt einen Pfad wo die Datei "Auslesen" gespeichert ist. Hier werden aus den verschiedenen Unterordnern der Projekte aus einem File mit gleichem Namen wie der Unterordner Daten ausgelesen. In der Bsp Datei sind die Pfade auch mit angegeben (Spalten B - D, werden aber ausgeblendet). In der Datei habe ich ein Formularsteuerelement eingefügt, ist das überhaupt notwendig?
https://www.herber.de/bbs/user/93379.xlsm
Die Daten gibt der Anwender in der Datei (z. B. 14_001.xls) im Deckblatt ein, ausgelesen werden Sie aber aus einem zweiten Tabellenblatt (Reiter "Projektdaten") wo sie gesammelt hintereinander stehen. Die Datei steht in einem Unterordner (hier Ordner 14_001)
https://www.herber.de/bbs/user/93380.xlsx
Nochmal der Pfadaufbau:
C:\C-TRANSFER\Auslesen geschlossener Dateien - hier steht die Datei "Einlesen"
C:\C-TRANSFER\Auslesen geschlossener Dateien\Projektnummer (BSP: 14_001) - hier steht die Datei "Auslesen" (BSP: 14_001.xls)
Vielen Dank schon mal im Voraus und noch einen schönen Sonntag
Gruß
Raphael

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Das geht mit Makro auch nur, wenn die ...
26.10.2014 15:26:43
Luc:-?
…jeweilige Mappe im Hintergrund geöffnet wird, Raphael;
die sieht man dann zwar nicht, aber offen ist sie trotzdem (im VBEditor erkennbar). Ohne INDIREKT (mit direktem FernBezug) geht's ja bekanntlich immer, aber wirklich empfehlen kann ich das aus Gründen der Datensicherheit nicht, also dann doch besser per VBA die andere Datei öffnen, Daten einlesen und QuellDatei wieder schließen. Das sollte sich auch per Recorder aufzeichnen lassen. Die betrof­fenen QuellDateien könnten auch per Liste vorgegeben wdn.
Gruß, Luc :-?

AW: Das geht mit Makro auch nur, wenn die ...
26.10.2014 15:38:44
Z
Hallo Luc,
das die Mappe im Hintergrund (schreibgeschützt) geöffnet werden muss hab ich in den Internetrecherchen auch schon gelesen, stellt aber kein Problem dar.
Wie funktioniert dasd mit der Vorgabeliste der Quelldateien? Kann die z. B. aus der Datei "Einlesen" genommen werden (Spalte B-D), dann würden aber immer alle Dateien im Hintergrund kurz aufgehen. Das kann irgendwann mal viel werden. Besser wäre es doch wenn Daten die bereits drin sind nicht noch mal abgefragt werden und nur eine Pfadangabe zur "neuen" Datei die ausgelesen werden soll angegeben wird?
Gruß
Raphael

Anzeige
AW: Daten aus geschlossener Arbeitsmappe auslesen
26.10.2014 16:56:25
Hajo_Zi
Hallo Raphael,
das ist aufwendig, ich würde die Datei öffnen
Option Explicit
Public Function GetDataClosedWB(SourcePath As String, _
SourceFile As String, sourceSheet As String, _
SourceRange As String, TargetRange As Range) As Boolean
'Holt einen Bereich aus einer _geschlossenen_ Arbeitsmappe
'Nur in VBA zu verwenden; nicht aus einer Tabellenzelle heraus
'© t.ramel@mvps.org
' wird durch die HoleDaten aufgerufen
Dim strQuelle       As String
Dim Zeilen          As Long
Dim Spalten         As Byte
On Error GoTo InvalidInput
strQuelle = "'" & SourcePath & "[" & SourceFile & "]" & sourceSheet & "'!" & Range( _
SourceRange).Cells(1, 1).Address(0, 0)
Zeilen = Range(SourceRange).Rows.Count
Spalten = Range(SourceRange).Columns.Count
With TargetRange.Cells(1, 1).Resize(Zeilen, Spalten)
.Formula = "=IF(" & strQuelle & "="""",""""," & strQuelle & ")"
.Value = .Value
End With
GetDataClosedWB = True
Exit Function
InvalidInput:
MsgBox "Die Quelldatei oder der Quellbereich ist ungültig!", vbExclamation, "Get data from  _
closed Workbook"
GetDataClosedWB = False
End Function
Public Sub HoleDaten()
' Die Funktion arbeitet mit der obrigen GetDataClosedWB zusammen
Dim Pfad            As String
Dim Dateiname       As String
Dim Blatt           As String
Dim Bereich         As String
Dim Ziel            As Range
Pfad = "L:\Eigene Dateien\Hajo\Internet\Test\2009\"
Dateiname = "Beispiel Forum 30.xlsm" ' aus welcher Datei soll er holen?
Blatt = "Tabelle1"  ' von welcher Tabelle soll er holen?
Bereich = "A1:B9"   ' aus welchem Bereich soll er holen?
Set Ziel = ActiveSheet.Range("A1")  ' in welchen Bereich soll er kopieren? Genauer gesagt:  _
Bei welcher Zelle soll er anfangen, Datein reinzukopieren? Bsp: ActiveCell geht auch
If GetDataClosedWB(Pfad, Dateiname, Blatt, Bereich, Ziel) Then
MsgBox "Daten importiert"
End If
End Sub


Anzeige
AW: Daten aus geschlossener Arbeitsmappe auslesen
26.10.2014 17:14:46
Z
Hallo Hajo,
hab den Code kopiert, angepasst und mit dem Steuerelement verknüpft. Beim ersten Test kamm Syntaxfehler und die Zeilen
Public Function GetDataClosedWB(SourcePath As String, _
SourceFile As String, sourceSheet As String, _
SourceRange As String, TargetRange As Range) As Boolean
wurden markiert. Bedeutet das einen Fehler im Pfad?
Gruß
Raphael

AW: Daten aus geschlossener Arbeitsmappe auslesen
26.10.2014 17:30:48
Z
Hallo nochmal
hab den Pfad und die Datei kontrolliert, finde keien Fehler. Nach dem Pad habe ich auch das \ drin und die Datei und das Tabellenblett stimmen auch?
Was mache ich da falsch
Gruß
Raphael

Anzeige
AW: Daten aus geschlossener Arbeitsmappe auslesen
26.10.2014 17:35:36
Hajo_Zi
Hallo Raphael,
schaue in den Code der ist nicht von mir.
Ich vermute die Verknüpfung mit dem Steuerelement ist das Problem?
TakeFocusOnClick mal ändern?
Gruß Hajo

AW: Daten aus geschlossener Arbeitsmappe auslesen
26.10.2014 18:12:16
Z
Hallo Hajo,
ich kenne VBA gar nicht. Was bedeutet "Nur in VBA zu verwenden; nicht aus einer Tabellenzelle heraus?" kann man kein Steuerelement verwenden?
Und wie ist es dann wenn ich dann Daten aus einer neuen anderen (z.B. 14_002) Datei holen will in die nächste Zeile? Jedes mal das VBA umschreiben?
Gruß
Raphael

Anzeige
AW: Daten aus geschlossener Arbeitsmappe auslesen
27.10.2014 00:24:21
Z
Hallo nochmal,
nach langen probieren und suchen hats nun geklappt :)
Jetzt schreibt mir das Makro eine Zeile wie explizit im Makro angegeben.
Aber, wenn ich nun immer wieder in verschieden Zeilen was reinschreiben muss, wie mache ich das? Kann ich dem Makro beibringen zu fragen, aus welchem Pfad, welcher Datei er lesen soll und ab welcher Zeile er eintragen soll. Die bereits vorhandenen Zeilen sollen dabei natürlich nicht überschrieben werden.
Folgendes nutze ich zum reinschreiben:
Public Sub HoleDaten()
' Die Funktion arbeitet mit der obrigen GetDataClosedWB zusammen
Dim Pfad            As String
Dim Dateiname       As String
Dim Blatt           As String
Dim Bereich         As String
Dim Ziel            As Range
Pfad = "C:\Test\Projekte\14_001\"
Dateiname = "14_001.xlsx" ' aus welcher Datei soll er holen?
Blatt = "Datenübertrag"  ' von welcher Tabelle soll er holen?
Bereich = "A4:AN4"   ' aus welchem Bereich soll er holen?
Set Ziel = ActiveSheet.Range("F5")  ' in welchen Bereich soll er kopieren? Genauer  _
gesagt: _
Bei welcher Zelle soll er anfangen, Datein reinzukopieren? Bsp: ActiveCell geht auch
If GetDataClosedWB(Pfad, Dateiname, Blatt, Bereich, Ziel) Then
MsgBox "Daten importiert"
End If
End Sub
Die fett geschriebenen müssten demnach immer angepasst werden. Kann in einer MAske abgefragt werden.
Den Pfad (mit letztem \, die Datei mit Endung und der Name des Tabellenblattes habe ich auch in der jeweiligen Zeile schon gebildet (Funktion &), kann man dem Makro sagen, es soll eben eine Zelle auslesen?
Ist in der Beispieldatei https://www.herber.de/bbs/user/93379.xlsm auch schon beschrieben
Danke schon mal
Gruß
Raphael

Anzeige
Vorschlag zum testen
28.10.2014 16:09:23
Tino
Hallo,
erweitere Deine Tabelle wie in Zeile 3 gezeigt,
Adresse wo sich die Daten in der Tabelle stehen. (kann ja auch ausgeblendet werden)
Achte darauf das unterhalb von Spalte B keine anderen Daten stehen und rechts von Spalte 3 auch nicht!
 ABCDEFGHI
3    C7F7I7C9F9
4NummerPfadDateiBlattAnfordererAbteilungakt. DatumZiel der Kalkulationbis
514_001C:\C-TRANSFER\Auslesen geschlossener Dateien\14_001\14_001.xlsxProjektdaten     

In ein Modul kommt dieser Code, diesen weist Du dem Button zu.
Sub Lese_Daten()
Dim ArDataFile, ArDataCell, ArErgebnis()
Dim sFormel$, sFileFullPath$
Dim n&, nn&

With ThisWorkbook.ActiveSheet  'Tabelle evtl. anpassen 
    n = .Cells(.Rows.Count, 2).End(xlUp).Row
    If n < 5 Then Exit Sub
    ArDataFile = .Range("B5", .Cells(n, 2)).Resize(, 3)
    
    n = .Cells(3, .Columns.Count).End(xlToLeft).Column
    If n < 5 Then Exit Sub
    ArDataCell = .Range("E3", .Cells(3, n).Resize(, 2))
    Redim Preserve ArDataCell(1 To 1, 1 To Ubound(ArDataCell, 2) - 1)
    
    Redim Preserve ArErgebnis(1 To Ubound(ArDataFile), 1 To Ubound(ArDataCell, 2))
    
    On Error Resume Next
    
    For n = 1 To Ubound(ArDataFile)
        If ArDataFile(n, 1) <> "" Then
            sFileFullPath = ArDataFile(n, 1) & ArDataFile(n, 2)
            ChDrive ArDataFile(n, 1)
            ChDir ArDataFile(n, 1)
            If Dir$(sFileFullPath, vbNormal) <> "" Then
                For nn = 1 To Ubound(ArDataCell, 2)
                    If ArDataCell(1, nn) <> "" Then
                        sFormel = "'" & ArDataFile(n, 1) & "[" & ArDataFile(n, 2) & "]" & _
                        ArDataFile(n, 3) & "'!" & .Range(ArDataCell(1, nn)).Address(ReferenceStyle:=xlR1C1)
                        ArErgebnis(n, nn) = ExecuteExcel4Macro(sFormel)
                    End If
                Next nn
            Else
                For nn = 1 To Ubound(ArDataCell, 2)
                    ArErgebnis(n, nn) = "'Error"
                Next nn
            End If
        End If
    Next n
    
    .Range("E5").Resize(Ubound(ArErgebnis), Ubound(ArErgebnis, 2)) = ArErgebnis
End With
End Sub
Gruß Tino
Anzeige

238 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige