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

Aus mehereren Excel-Dateien importieren

Aus mehereren Excel-Dateien importieren
Thomas
Hallo zusammen,
ist es möglich, dass gleichzeitig aus mehreren Excel-Dateien in eine andere Excel-Datei importiert werden kann?
Beispiel:
D:\Daten\Archiv.xls
D:\Daten\Viele Exceldateien.xls
Funktionieren soll es so, dass aus den vielen Excel-Dateien immer die Zeile 2 der Tabelle1 in die nächste freie Zeile in die Archiv-Datei kopiert werden soll.
Hat jemand eine Idee?
Vielen Dank!
Gruß
Thomas

40
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
Archivsuche hilft...
robert
Daten aus mehreren Excel Dateien auslesen
Hi,
gib mal dies in Alle Recherchen ein, da gibts Beispiele.
Gruß
robert
AW: Aus mehereren Excel-Dateien importieren
Tino
Hallo,
hier ein Beispiel von vielen wie man es machen könnte.
Der Code befindet sich in der Archiv.xls
https://www.herber.de/bbs/user/79105.zip
Gruß Tino
AW: Aus mehereren Excel-Dateien importieren
Thomas
Hallo Tino,
kannst du mir noch helfen, in dem du mir die Zeile anpasst mit Pfad
D:\Daten
Danke!
Gruß
Thomas
'Pfad zu daten.xls anpassen!
sFullPath = IIf(Right$(ThisWorkbook.Path, 1) = "\", ThisWorkbook.Path, ThisWorkbook.Path & "\")
Anzeige
AW: Aus mehereren Excel-Dateien importieren
Tino
Hallo,
ersetze die Zeile durch diese
sFullPath = "D:\Daten\"
Gruß Tino
AW: Aus mehereren Excel-Dateien importieren
Thomas
jetzt stört er sich an dieser Zeile
Private cnMDB As ADODB.Connection
AW: Aus mehereren Excel-Dateien importieren
Tino
Hallo,
funktioniert das Beispiel bei dir?
Gruß Tino
AW: Aus mehereren Excel-Dateien importieren
Thomas
Hallo Tino,
nein, das Beispiel funktioniert nicht.
Ich habe alle vier Dateien in dem Ordner D:\Daten
Gruß
Thomas
AW: Aus mehereren Excel-Dateien importieren
Tino
Hallo,
schau mal im VBA Editor ob der Verweis auf
Microsoft ActivX Data Objects … Library gesetzt ist.
Wenn da ein Fehler steht, diesen Verweis deaktivieren und nochmals neu setzen.
Gruß Tino
AW: Aus mehereren Excel-Dateien importieren
Thomas
Microsoft ActivX Data Objects 2.0 … Library ist gesetzt.
Anzeige
dann muss es gehen,wie bei mir..owT
robert
AW: Aus mehereren Excel-Dateien importieren
Thomas
Hallo Tino und Robert,
das tut mir jetzt echt leid, dass ich Euch beide so lange beschäftigt habe.
Ich habe das jetzt Zuhause ausprobiert und da ging es sofort.
Ich weiß nicht, warum es an der Arbeit nicht geht.
Ganz herzlichen Dank Euch beiden!
Gruß
Thomas
AW: Aus mehereren Excel-Dateien importieren
CJ
Hallo Tino!
Ich wollte nachfragen, ob man dieses Makro auch auf mein Problem vom 26.02.12 (hier im Forum unter Bones26 gepostet) anwenden kann?
Vielen Dank im Voraus!
Viele Grüße
CJ
AW: Aus mehereren Excel-Dateien importieren
Tino
Hallo,
theoretisch denke ich schon das dies machbar sein müsste, allerdings fehlen mir dazu noch angaben.
Woran kann man erkennen welcher Eintrag neu ist,
Datum welches noch nicht in der Übersicht vorhanden ist?
Sind die Dienstorte bereits bekannt,
oder muss dies dass Programm selbst anhand der vorhandenen Dateien herausfinden?
Kannst Du ein paar Beispieldateien hochladen,
evtl. als Zip- File dann könnte ich mir vielleicht ein Bild davon machen.
(vertrauliche Daten kannst du ja anonymisieren)
Gruß Tino
Anzeige
AW: Aus mehereren Excel-Dateien importieren
CJ
Hallo Tino,
habe gerade versucht eine Beispieldatei hochzuladen, leider ist sie für dieses Forum zu groß - kann max. 300kb hochladen und die Datei ist mittlerweile fast 2MB groß! Und ein Zip-Programm habe ich nicht auf dem Rechner und kann mir auf Arbeit auch keines herunterladen!
Ich versuche daher einfach mal den Aufbau zu beschreiben.
Jede Tabelle ist von den Tabellenblättern gleich aufgebaut - sowohl die Gesamtdatei, als auch die der Dienstorte.
Folgende Tabellenblätter sind enthalten: Übersicht; EGZ 2011; EGZ 2012; EGZ Projekt 50plus 2011; EGZ Projekt 50plus 2012; 16e Fälle; EQ
Das Tabellenblatt Übersicht füllt sich aus den übrigen Tabellenblättern mittels Zellbezug, muss also nicht mit übertragen werden.
In die anderen Tabellenblätter werden Fälle eingegeben. Spalten sind z.B. Arbeitgeber, Bewerber, Geburtsdatum, Beginn und Ende der Förderung etc.
Es ist schwierig zu erkennen, welcher Fall neu ist, da sowohl der Arbeitgeber als auch der Bewerber, als auch Geburtsdaten häufiger vorkommen können. Ich habe mir gerade jede Spalte genau angeschaut, und es gibt nichts was einmalig wäre.
Die Dienstorte sind in der Gesamtdatei nicht bekannt, sind aber auch nicht separat in der Excel-Liste der einzelnen Dienstorte angegeben.
Gibt es da eine Möglichkeit?
Vielen lieben Dank im Voraus!
CJ
Anzeige
ein Ansatz
Tino
Hallo,
evtl. könnte man in den einzelnen Dateien eine Kennzeichnung ans Ende der Tabelle stellen als zusätzliche Spalte und dort zBsp. ein x oder das heute Datum eintragen, dann wäre beim lesen bekannt ob diese Zeile schon gelesen wurde.
Diese Spalte könnte man mit einer Überschrift versehen um sie zu identifizieren.
Hier mal ein Beispielcode.
Da Du aber keine Beispieldatei hochgeladen hast, kann ich nicht sagen ob es auf Dein Projekt passt,
habe es anhand Deiner Angaben getestet und da funktioniert es.
Weiß nicht wie gut Deine VBA Kenntnisse sind und ob Du evtl. noch Anpassungen vornehmen kannst!
kommt als Code in Modul1
Option Explicit 
 
Dim oApp As Excel.Application 
 
Sub Start_Daten_Sammeln() 
Dim ArrayTabNamen(), ArrayFiles(), varNewInhalt 
Dim strOrdner$, varTab 
Dim nFileCount& 
 
'Tabellen die gelesen werden sollen, diese müssen auch in der Übersicht vorhanden sein 
ArrayTabNamen = Array("EGZ 2011", "EGZ 2012", "EGZ Projekt 50plus 2011", "EGZ Projekt 50plus 2012", "16e Fälle", "EQ") 
'Ordner anpassen wo die Dateien liegen 
strOrdner = "G:\1 Forum\Dienstorte\" 
'Dateien suchen, die in diesen Ordner und Unterordner liegen 
FindFiles ArrayFiles, strOrdner, nFileCount, Array("*.xls"), True 
'Dateien gefunden? 
If nFileCount = 0 Then 
    MsgBox "keine Dateien gefunden!" 
    Exit Sub 
End If 
 
 
 
For nFileCount = Lbound(ArrayFiles) To Ubound(ArrayFiles) 
    'Ist diese Datei die Übersichtsdatei? 
    If LCase(ArrayFiles(nFileCount)) <> LCase(ThisWorkbook.FullName) Then 
        'Daten aus den Tabellen lesen 
        Daten_Einlesen ArrayFiles(nFileCount), ArrayTabNamen 
    End If 
Next nFileCount 
 
On Error Resume Next 
oApp.Quit 
Set oApp = Nothing 
End Sub 
 
Sub Daten_Einlesen(ByVal strFile$, ArrayTabellen()) 
Dim varTab, ArrayData(), NewArray(), nColRefSpalte 
Dim n&, nn&, nR& 
 
If oApp Is Nothing Then 
    Set oApp = New Excel.Application 
    oApp.ScreenUpdating = False 
    oApp.EnableEvents = False 
    oApp.DisplayAlerts = False 
End If 
 
With oApp.Workbooks.Open(Filename:=strFile) 
    If Not .ReadOnly Then 'Datei darf nicht Schreibgeschützt sein 
        For Each varTab In ArrayTabellen 
            'prüfen ob es diese Tabelle in der Datei gibt 
            If CheckTab(oApp.Workbooks(.Name), varTab) Then 
                With .Sheets(varTab) 
                     
                    nColRefSpalte = Application.Match("Ex-Read", .Rows(1), 0) 
                    'Spalte Ex-Read gefunden? nein -> wird angelegt 
                    If Not IsNumeric(nColRefSpalte) Then 
                        With .Cells(1, .Columns.Count).End(xlToLeft).Offset(0, 1) 
                            .Value = "Ex-Read" 
                            .Font.Bold = True 
                            nColRefSpalte = .Column 
                        End With 
                    End If 
                     
                    With .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)).Resize(, nColRefSpalte) 
                        ArrayData = .Value2 
                        If Ubound(ArrayData) > 1 Then 
                            Redim Preserve NewArray(1 To Ubound(ArrayData) - 1, 1 To nColRefSpalte - 1) 
                            For n = 2 To Ubound(ArrayData) 
                                If ArrayData(n, nColRefSpalte) = "" Then 
                                    nR = nR + 1 
                                    For nn = 1 To Ubound(ArrayData, 2) - 1 
                                        NewArray(nR, nn) = ArrayData(n, nn) 
                                    Next nn 
                                    ArrayData(n, nColRefSpalte) = Date 
                                End If 
                            Next n 
                             
                            If nR > 0 Then 
                                .Value = ArrayData 
                                With ThisWorkbook.Sheets(varTab) 
                                    With .Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0) 
                                        .Cells.Resize(nR, Ubound(NewArray, 2)) = NewArray 
                                    End With 
                                End With 
                            End If 
                             
                            Erase NewArray 
                            nR = 0 
                            nColRefSpalte = Empty 
                        End If 'UBound(ArrayData) > 1 
                    End With 'Range(...) 
                 
                End With '.Sheets(varTab) 
            End If 'CheckTab(Workbooks(.Name), varTab) 
        Next varTab 
        .Close True 'Datei speichern u. schließen 
    Else 
        .Close False 'Datei nicht speichern und schließen 
    End If 
End With 
 
End Sub 
 
'Hilfsfunktion zum prüfen ob Tabelle vorhanden ist 
Function CheckTab(oWB As Workbook, ByVal strTabName$) As Boolean 
On Error Resume Next 
CheckTab = oWB.Sheets(strTabName).Index <> 0 
End Function 
kommt als Code in Modul2
Option Explicit 
 
Option Private Module 
'Teile des Originalcode von Nepumuk. *********************************************************** 
  
Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" ( _
    ByVal lpFileName As String, _
    lpFindFileData As WIN32_FIND_DATA) As Long 
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" ( _
    ByVal hFindFile As Long, _
    lpFindFileData As WIN32_FIND_DATA) As Long 
Private Declare Function FindClose Lib "kernel32" ( _
    ByVal hFindFile As Long) As Long 
  
Private Enum FILE_ATTRIBUTE 
    FILE_ATTRIBUTE_READONLY = &H1 
    FILE_ATTRIBUTE_HIDDEN = &H2 
    FILE_ATTRIBUTE_SYSTEM = &H4 
    FILE_ATTRIBUTE_DIRECTORY = &H10 
    FILE_ATTRIBUTE_ARCHIVE = &H20 
    FILE_ATTRIBUTE_NORMAL = &H80 
    FILE_ATTRIBUTE_TEMPORARY = &H100 
End Enum 
  
Private Const INVALID_HANDLE_VALUE = -1& 
Private Const MAX_PATH = 260& 
  
Private Type FILETIME 
    dwLowDateTime As Long 
    dwHighDateTime As Long 
End Type 
  
Private Type WIN32_FIND_DATA 
    dwFileAttributes As Long 
    ftCreationTime As FILETIME 
    ftLastAccessTime As FILETIME 
    ftLastWriteTime As FILETIME 
    nFileSizeHigh As Long 
    nFileSizeLow As Long 
    dwReserved0 As Long 
    dwReserved1 As Long 
    cFileName As String * MAX_PATH 
    cAlternate As String * 14 
End Type 
  
Private Declare Function MoveWindow Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal x As Long, _
    ByVal y As Long, _
    ByVal nWidth As Long, _
    ByVal nHeight As Long, _
    ByVal bRepaint As Long) As Long 
Private Declare Function GetSystemMetrics Lib "user32.dll" ( _
    ByVal nIndex As Long) As Long 
Private Declare Function GetWindowRect Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByRef lpRect As RECT) As Long 
Private Declare Function SHBrowseForFolder Lib "shell32" ( _
    lpbi As InfoT) As Long 
Private Declare Function CoTaskMemFree Lib "ole32" ( _
    ByVal hMem As Long) As Long 
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" ( _
    ByVal lpStr1 As String, _
    ByVal lpStr2 As String) As Long 
Private Declare Function SHGetPathFromIDList Lib "shell32" ( _
    ByVal pList As Long, _
    ByVal lpBuffer As String) As Long 
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
    ByVal lpClassname As String, _
    ByVal lpWindowName As String) As Long 
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
    ByVal hwnd As Long, _
    ByVal Msg As Long, _
    wParam As Any, _
    lParam As Any) As Long 
  
Private Type InfoT 
    hwnd As Long 
    Root As Long 
    DisplayName As Long 
    Title As Long 
    Flags As Long 
    FName As Long 
    lParam As Long 
    Image As Long 
End Type 
  
Private Type RECT 
    Left As Long 
    Top As Long 
    Right As Long 
    Bottom As Long 
End Type 
  
Public Enum BIF_Flag 
    BIF_RETURNONLYFSDIRS = &H1 
    BIF_DONTGOBELOWDOMAIN = &H2 
    BIF_STATUSTEXT = &H4 
    BIF_RETURNFSANCESTORS = &H8 
    BIF_EDITBOX = &H10 
    BIF_VALIDATE = &H20 
    BIF_NEWDIALOGSTYLE = &H40 
    BIF_BROWSEINCLUDEURLS = &H80 
    BIF_BROWSEFORCOMPUTER = &H1000 
    BIF_BROWSEFORPRINTER = &H2000 
    BIF_BROWSEINCLUDEFILES = &H4000 
    BIF_SHAREABLE = &H8000 
End Enum 
  
Private Const SM_CXFULLSCREEN = &H10 
Private Const SM_CYFULLSCREEN = &H11 
  
Private Const BFFM_SETSELECTION = &H466 
Private Const BFFM_INITIALIZED = &H1 
  
Private s_BrowseInitDir As String 
  
Public Function fncGetFolder( _
        Optional ByVal sMsg As String = "Bitte wählen Sie ein Verzeichnis", _
        Optional ByVal lFlag As BIF_Flag = BIF_RETURNONLYFSDIRS, _
        Optional ByVal sPath As String = "C:\") As String 
    Dim xl As InfoT, IDList As Long, RVal As Long, FolderName As String 
    s_BrowseInitDir = sPath 
    With xl 
        .hwnd = FindWindow("XLMAIN", vbNullString) 
        .Root = 0 
        .Title = lstrcat(sMsg, "") 
        .Flags = lFlag 
        .FName = FuncCallback(AddressOf BrowseCallback) 
    End With 
    IDList = SHBrowseForFolder(xl) 
    If IDList <> 0 Then 
        FolderName = Space(256) 
        RVal = SHGetPathFromIDList(IDList, FolderName) 
        CoTaskMemFree (IDList) 
        FolderName = Trim$(FolderName) 
        FolderName = Left$(FolderName, Len(FolderName) - 1) 
    End If 
    fncGetFolder = FolderName 
End Function 
  
Private Function BrowseCallback( _
        ByVal hwnd As Long, _
        ByVal uMsg As Long, _
        ByVal wParam As Long, _
        ByVal lParam As Long) As Long 
    If uMsg = BFFM_INITIALIZED Then 
        Call SendMessage(hwnd, BFFM_SETSELECTION, ByVal 1&, ByVal s_BrowseInitDir) 
        Call CenterDialog(hwnd) 
    End If 
    BrowseCallback = 0 
End Function 
  
Private Function FuncCallback(ByVal nParam As Long) As Long 
    FuncCallback = nParam 
End Function 
  
Private Sub CenterDialog(ByVal hwnd As Long) 
    Dim WinRect As RECT, ScrWidth As Integer, ScrHeight As Integer 
    Dim DlgWidth As Integer, DlgHeight As Integer 
    GetWindowRect hwnd, WinRect 
    DlgWidth = WinRect.Right - WinRect.Left 
    DlgHeight = WinRect.Bottom - WinRect.Top 
    ScrWidth = GetSystemMetrics(SM_CXFULLSCREEN) 
    ScrHeight = GetSystemMetrics(SM_CYFULLSCREEN) 
    MoveWindow hwnd, (ScrWidth - DlgWidth) / 2, _
        (ScrHeight - DlgHeight) / 2, DlgWidth, DlgHeight, 1 
End Sub 
  
Sub FindFiles(ArrayData(), ByVal strFolderPath As String, _
        ByRef lngFilecount As Long, ArFileFilter, Optional SubFolder As Boolean = True) 
    Dim WFD As WIN32_FIND_DATA, lngSearch As Long, strDirName As String 
      
    lngSearch = FindFirstFile(strFolderPath & "*.*", WFD) 
      
    If lngSearch <> INVALID_HANDLE_VALUE Then 
        GetFilesInFolder ArrayData, strFolderPath, lngFilecount, ArFileFilter 
        Do 
            If (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) Then 
                strDirName = Left$(WFD.cFileName, InStr(WFD.cFileName, Chr(0)) - 1) 
                If SubFolder = False Then Exit Sub 'ohne Unterordner 
                If (strDirName <> ".") And (strDirName <> "..") Then _
                    FindFiles ArrayData, strFolderPath & strDirName & "\", lngFilecount, ArFileFilter 
            End If 
        Loop While FindNextFile(lngSearch, WFD) 
        FindClose lngSearch 
    End If 
End Sub 
  
Sub GetFilesInFolder(ArrayData(), ByVal strFolderPath As String, _
        ByRef lngFilecount As Long, ArFileFilter) 
Dim WFD As WIN32_FIND_DATA, lngSearch As Long, strFileName As String 
Dim FileFilter 
  
For Each FileFilter In ArFileFilter 
    lngSearch = FindFirstFile(strFolderPath & FileFilter, WFD) 
    If lngSearch <> INVALID_HANDLE_VALUE Then 
        Do 
            If (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) <> _
                FILE_ATTRIBUTE_DIRECTORY Then 
                strFileName = Left$(WFD.cFileName, InStr(WFD.cFileName, Chr(0)) - 1) 
                Redim Preserve ArrayData(lngFilecount) 
                ArrayData(lngFilecount) = strFolderPath & strFileName 'auflisten in Zelle 
                lngFilecount = lngFilecount + 1 
            End If 
        Loop While FindNextFile(lngSearch, WFD) 
        FindClose lngSearch 
    End If 
Next 
End Sub 
Gruß Tino
Anzeige
AW: ein Ansatz
CJ
Hallo Tino,
das ist echt harter Stoff.........
Ich habe mir gerade daheim etwas zum zippen runtergeladen und kann nun die Datei zur Verfügung stellen. Allerdings musste ich ein paar Hilfsformeln weiter hinten in der Tabelle löschen, da die Tabelle trotz zippen immer noch zu groß waren.
https://www.herber.de/bbs/user/79129.zip
Relevant sind nur die Spalten B bis AD 5 bis 500.
Ich habe im Code etwas davon gelesen, dass die Tabelle nicht schreibgeschützt sein darf, gilt das nur für den einzulesenden Bereich oder für die gesamte Tabelle?
Ich habe nämlich einige Zellen gesperrt, da sie wichtige Formeln beinhalten - zur Berechnung des Budgets, aber die brauche ich nicht in der Haupttabelle, sondern nur die Zeilen 1 bis 500 B:AD in den einzelnen Tabellenblättern.
Das soll die Hauptdatei werden, aber die anderen Tabellen sehen exakt genauso aus!
Muss der Code dann nur in der Haupttabelle hinterlegt werden?
Den genauen Pfad für die Speicherung der Dienstorte kenne ich noch nicht, würde ich dann ergänzen, sobald ich es weiß, wenn Du mir behilflich sein kannst und die Stellen an denen der Pfad eingegeben werden muss, markieren kannst.
Werden die Daten mit irgendeinem der angegeben Makros markiert (also so dass die neuen erkennbar sind)? Wenn ja, muss dann in die Dienstort-Tabellen auch noch etwas automatisch eingetragen werden?
Und zu guter letzt: Hast Du vielleicht noch eine Idee, zu meinem heute geposteten Problem mit der automatischen Nummerierung der Zeilen in der Spalte A? Dabei darf aber jede Nummer nur einmal vorkommen - über die gesamten Tabellenblätter verteilt.
Am liebsten wäre es mir, wenn ich den Namen der Firma eingeb, und der dann die nächste frei verfügbare Nummer in die Zelle daneben schreibt.
Vielen lieben Dank im Voraus!
Beste Grüße
CJ
Anzeige
AW: ein Ansatz
Tino
Hallo,
ok. habe den Code so angepasst das er die Zeilen erst ab Zeile 5, Spalte 2 (also B5) nimmt.
Der Code geht davon aus, dass die Überschrift in der Zeile 4 steht und
dort setzte ich ans Ende der Tabelle eine neue Überschrift "Ex-Read".
In der Spalte wird das heutige Datum eingetragen,
damit wird gekennzeichnet dass diese Zeile gelesen wurde.
Wenn dort nichts steht geht der Code davon aus, dass diese Zeile noch nicht gelesen wurde. (dies erfolgt in den Dienstdateien)
Sollten diese Tabellen geschützt sein kann man im Code auch noch einbauen,
dass er den Schutz umgeht.
Den Pfad zu den Dateien kannst Du in der Zeile anpassen.
strOrdner = "G:\1 Forum\Dienstorte\"
In diesen Ordner und den Unterordnern werden alle Excel- Dateien daraufhin ausgelesen.
Der Code kommt entsprechend in zwei Module in die Übersichtsdatei und kann dort mittels Button oder so gestartet werden.
PS: ich würde dies erst anhand ein paar Beispieldateien (Kopie vom Original) testen
ob alles berücksichtigt wurde.
kommt als Code in Modul1
Option Explicit 
  
Dim oApp As Excel.Application 
  
Sub Start_Daten_Sammeln() 
Dim ArrayTabNamen(), ArrayFiles(), varNewInhalt 
Dim strOrdner$, varTab 
Dim nFileCount& 
  
'Tabellen die gelesen werden sollen, diese müssen auch in der Übersicht vorhanden sein 
ArrayTabNamen = Array("EGZ 2011", "EGZ 2012", "EGZ Projekt 50plus 2011", "EGZ Projekt 50plus 2012", "16e Fälle", "EQ") 
 
'Ordner anpassen wo die Dateien liegen ********************** 
strOrdner = "G:\1 Forum\Dienstorte\" 
'************************************************************ 
 
If Right$(strOrdner, 1) <> "\" Then strOrdner = strOrdner & "\" 
 
'Dateien suchen, die in diesen Ordner und Unterordner liegen 
FindFiles ArrayFiles, strOrdner, nFileCount, Array("*.xls"), True 
'Dateien gefunden? 
If nFileCount = 0 Then 
    MsgBox "keine Dateien gefunden!" 
    Exit Sub 
End If 
  
  
  
For nFileCount = Lbound(ArrayFiles) To Ubound(ArrayFiles) 
    'Ist diese Datei die Übersichtsdatei? 
    If LCase(ArrayFiles(nFileCount)) <> LCase(ThisWorkbook.FullName) Then 
        'Daten aus den Tabellen lesen 
        Daten_Einlesen ArrayFiles(nFileCount), ArrayTabNamen 
    End If 
Next nFileCount 
  
On Error Resume Next 
oApp.Quit 
Set oApp = Nothing 
End Sub 
  
Sub Daten_Einlesen(ByVal strFile$, ArrayTabellen()) 
Dim varTab, ArrayData(), NewArray(), nColRefSpalte 
Dim n&, nn&, nR& 
  
If oApp Is Nothing Then 
    Set oApp = New Excel.Application 
    oApp.ScreenUpdating = False 
    oApp.EnableEvents = False 
    oApp.DisplayAlerts = False 
End If 
  
With oApp.Workbooks.Open(Filename:=strFile) 
    If Not .ReadOnly Then 'Datei darf nicht Schreibgeschützt sein 
        For Each varTab In ArrayTabellen 
            'prüfen ob es diese Tabelle in der Datei gibt 
            If CheckTab(oApp.Workbooks(.Name), varTab) Then 
                With .Sheets(varTab) 
                    'in Zeile 4 die Überschrift Ex-Read suchen 
                    nColRefSpalte = Application.Match("Ex-Read", .Rows(4), 0) 
                    'Spalte Ex-Read gefunden? nein -> wird angelegt 
                    If Not IsNumeric(nColRefSpalte) Then 
                        With .Cells(4, .Columns.Count).End(xlToLeft).Offset(0, 1) 
                            .Value = "Ex-Read" 
                            .Font.Bold = True 
                            nColRefSpalte = .Column 
                        End With 
                    End If 
                    nColRefSpalte = nColRefSpalte - 1 
                    With .Range(.Cells(4, 2), .Cells(.Rows.Count, 2).End(xlUp)).Resize(, nColRefSpalte) 
                        ArrayData = .Value2 
                        If Ubound(ArrayData) > 1 Then 
                            Redim Preserve NewArray(1 To Ubound(ArrayData) - 1, 1 To nColRefSpalte - 1) 
                            For n = 2 To Ubound(ArrayData) 
                                If ArrayData(n, nColRefSpalte) = "" Then 
                                    nR = nR + 1 
                                    For nn = 1 To Ubound(ArrayData, 2) - 1 
                                        NewArray(nR, nn) = ArrayData(n, nn) 
                                    Next nn 
                                    ArrayData(n, nColRefSpalte) = Date 
                                End If 
                            Next n 
                              
                            If nR > 0 Then 
                                .Value = ArrayData 
                                With ThisWorkbook.Sheets(varTab) 
                                    With .Cells(.Rows.Count, 2).End(xlUp).Offset(1, 0) 
                                        .Cells.Resize(nR, Ubound(NewArray, 2)) = NewArray 
                                    End With 
                                End With 
                            End If 
                              
                            Erase NewArray 
                            nR = 0 
                            nColRefSpalte = Empty 
                        End If 'UBound(ArrayData) > 1 
                    End With 'Range(...) 
                  
                End With '.Sheets(varTab) 
            End If 'CheckTab(Workbooks(.Name), varTab) 
        Next varTab 
        .Close True 'Datei speichern u. schließen 
    Else 
        .Close False 'Datei nicht speichern und schließen 
    End If 
End With 
  
End Sub 
  
'Hilfsfunktion zum prüfen ob Tabelle vorhanden ist 
Function CheckTab(oWB As Workbook, ByVal strTabName$) As Boolean 
On Error Resume Next 
CheckTab = oWB.Sheets(strTabName).Index <> 0 
End Function 
 
 
kommt als Code in Modul2
Option Explicit 
  
Option Private Module 
'Teile des Originalcode von Nepumuk. *********************************************************** 
   
Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" ( _
    ByVal lpFileName As String, _
    lpFindFileData As WIN32_FIND_DATA) As Long 
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" ( _
    ByVal hFindFile As Long, _
    lpFindFileData As WIN32_FIND_DATA) As Long 
Private Declare Function FindClose Lib "kernel32" ( _
    ByVal hFindFile As Long) As Long 
   
Private Enum FILE_ATTRIBUTE 
    FILE_ATTRIBUTE_READONLY = &H1 
    FILE_ATTRIBUTE_HIDDEN = &H2 
    FILE_ATTRIBUTE_SYSTEM = &H4 
    FILE_ATTRIBUTE_DIRECTORY = &H10 
    FILE_ATTRIBUTE_ARCHIVE = &H20 
    FILE_ATTRIBUTE_NORMAL = &H80 
    FILE_ATTRIBUTE_TEMPORARY = &H100 
End Enum 
   
Private Const INVALID_HANDLE_VALUE = -1& 
Private Const MAX_PATH = 260& 
   
Private Type FILETIME 
    dwLowDateTime As Long 
    dwHighDateTime As Long 
End Type 
   
Private Type WIN32_FIND_DATA 
    dwFileAttributes As Long 
    ftCreationTime As FILETIME 
    ftLastAccessTime As FILETIME 
    ftLastWriteTime As FILETIME 
    nFileSizeHigh As Long 
    nFileSizeLow As Long 
    dwReserved0 As Long 
    dwReserved1 As Long 
    cFileName As String * MAX_PATH 
    cAlternate As String * 14 
End Type 
   
Private Declare Function MoveWindow Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal x As Long, _
    ByVal y As Long, _
    ByVal nWidth As Long, _
    ByVal nHeight As Long, _
    ByVal bRepaint As Long) As Long 
Private Declare Function GetSystemMetrics Lib "user32.dll" ( _
    ByVal nIndex As Long) As Long 
Private Declare Function GetWindowRect Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByRef lpRect As RECT) As Long 
Private Declare Function SHBrowseForFolder Lib "shell32" ( _
    lpbi As InfoT) As Long 
Private Declare Function CoTaskMemFree Lib "ole32" ( _
    ByVal hMem As Long) As Long 
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" ( _
    ByVal lpStr1 As String, _
    ByVal lpStr2 As String) As Long 
Private Declare Function SHGetPathFromIDList Lib "shell32" ( _
    ByVal pList As Long, _
    ByVal lpBuffer As String) As Long 
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
    ByVal lpClassname As String, _
    ByVal lpWindowName As String) As Long 
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
    ByVal hwnd As Long, _
    ByVal Msg As Long, _
    wParam As Any, _
    lParam As Any) As Long 
   
Private Type InfoT 
    hwnd As Long 
    Root As Long 
    DisplayName As Long 
    Title As Long 
    Flags As Long 
    FName As Long 
    lParam As Long 
    Image As Long 
End Type 
   
Private Type RECT 
    Left As Long 
    Top As Long 
    Right As Long 
    Bottom As Long 
End Type 
   
Public Enum BIF_Flag 
    BIF_RETURNONLYFSDIRS = &H1 
    BIF_DONTGOBELOWDOMAIN = &H2 
    BIF_STATUSTEXT = &H4 
    BIF_RETURNFSANCESTORS = &H8 
    BIF_EDITBOX = &H10 
    BIF_VALIDATE = &H20 
    BIF_NEWDIALOGSTYLE = &H40 
    BIF_BROWSEINCLUDEURLS = &H80 
    BIF_BROWSEFORCOMPUTER = &H1000 
    BIF_BROWSEFORPRINTER = &H2000 
    BIF_BROWSEINCLUDEFILES = &H4000 
    BIF_SHAREABLE = &H8000 
End Enum 
   
Private Const SM_CXFULLSCREEN = &H10 
Private Const SM_CYFULLSCREEN = &H11 
   
Private Const BFFM_SETSELECTION = &H466 
Private Const BFFM_INITIALIZED = &H1 
   
Private s_BrowseInitDir As String 
   
Public Function fncGetFolder( _
        Optional ByVal sMsg As String = "Bitte wählen Sie ein Verzeichnis", _
        Optional ByVal lFlag As BIF_Flag = BIF_RETURNONLYFSDIRS, _
        Optional ByVal sPath As String = "C:\") As String 
    Dim xl As InfoT, IDList As Long, RVal As Long, FolderName As String 
    s_BrowseInitDir = sPath 
    With xl 
        .hwnd = FindWindow("XLMAIN", vbNullString) 
        .Root = 0 
        .Title = lstrcat(sMsg, "") 
        .Flags = lFlag 
        .FName = FuncCallback(AddressOf BrowseCallback) 
    End With 
    IDList = SHBrowseForFolder(xl) 
    If IDList <> 0 Then 
        FolderName = Space(256) 
        RVal = SHGetPathFromIDList(IDList, FolderName) 
        CoTaskMemFree (IDList) 
        FolderName = Trim$(FolderName) 
        FolderName = Left$(FolderName, Len(FolderName) - 1) 
    End If 
    fncGetFolder = FolderName 
End Function 
   
Private Function BrowseCallback( _
        ByVal hwnd As Long, _
        ByVal uMsg As Long, _
        ByVal wParam As Long, _
        ByVal lParam As Long) As Long 
    If uMsg = BFFM_INITIALIZED Then 
        Call SendMessage(hwnd, BFFM_SETSELECTION, ByVal 1&, ByVal s_BrowseInitDir) 
        Call CenterDialog(hwnd) 
    End If 
    BrowseCallback = 0 
End Function 
   
Private Function FuncCallback(ByVal nParam As Long) As Long 
    FuncCallback = nParam 
End Function 
   
Private Sub CenterDialog(ByVal hwnd As Long) 
    Dim WinRect As RECT, ScrWidth As Integer, ScrHeight As Integer 
    Dim DlgWidth As Integer, DlgHeight As Integer 
    GetWindowRect hwnd, WinRect 
    DlgWidth = WinRect.Right - WinRect.Left 
    DlgHeight = WinRect.Bottom - WinRect.Top 
    ScrWidth = GetSystemMetrics(SM_CXFULLSCREEN) 
    ScrHeight = GetSystemMetrics(SM_CYFULLSCREEN) 
    MoveWindow hwnd, (ScrWidth - DlgWidth) / 2, _
        (ScrHeight - DlgHeight) / 2, DlgWidth, DlgHeight, 1 
End Sub 
   
Sub FindFiles(ArrayData(), ByVal strFolderPath As String, _
        ByRef lngFilecount As Long, ArFileFilter, Optional SubFolder As Boolean = True) 
    Dim WFD As WIN32_FIND_DATA, lngSearch As Long, strDirName As String 
       
    lngSearch = FindFirstFile(strFolderPath & "*.*", WFD) 
       
    If lngSearch <> INVALID_HANDLE_VALUE Then 
        GetFilesInFolder ArrayData, strFolderPath, lngFilecount, ArFileFilter 
        Do 
            If (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) Then 
                strDirName = Left$(WFD.cFileName, InStr(WFD.cFileName, Chr(0)) - 1) 
                If SubFolder = False Then Exit Sub 'ohne Unterordner 
                If (strDirName <> ".") And (strDirName <> "..") Then _
                    FindFiles ArrayData, strFolderPath & strDirName & "\", lngFilecount, ArFileFilter 
            End If 
        Loop While FindNextFile(lngSearch, WFD) 
        FindClose lngSearch 
    End If 
End Sub 
   
Sub GetFilesInFolder(ArrayData(), ByVal strFolderPath As String, _
        ByRef lngFilecount As Long, ArFileFilter) 
Dim WFD As WIN32_FIND_DATA, lngSearch As Long, strFileName As String 
Dim FileFilter 
   
For Each FileFilter In ArFileFilter 
    lngSearch = FindFirstFile(strFolderPath & FileFilter, WFD) 
    If lngSearch <> INVALID_HANDLE_VALUE Then 
        Do 
            If (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) <> _
                FILE_ATTRIBUTE_DIRECTORY Then 
                strFileName = Left$(WFD.cFileName, InStr(WFD.cFileName, Chr(0)) - 1) 
                Redim Preserve ArrayData(lngFilecount) 
                ArrayData(lngFilecount) = strFolderPath & strFileName 'auflisten in Zelle 
                lngFilecount = lngFilecount + 1 
            End If 
        Loop While FindNextFile(lngSearch, WFD) 
        FindClose lngSearch 
    End If 
Next 
End Sub 
 
 
Gruß Tino
Anzeige
AW: ein Ansatz
CJ
Hallo Tino!
Schon mal vorab vielen Dank für Deine Unterstützung.
Ich werde den Code später ausprobieren und Dir dann eine Rückmeldung geben!
Ich habe aber vorab noch ein paar Fragen:
1. Den Code schreibe ich nur in die Übersichtsdatei?!
2. Muss es zwei verschiedene CommandButtons geben, da es ja auch zwei Module sind? Wenn ja, wie mache ich das? Ich habe zwar schon mit CommandButtons gearbeitet, aber der Code hierfür musste ich ja aus den Modulen in den CommandButton ziehen.
3. Den Schreibschutz wird es in den Dienstort-Dateien definitiv geben. Kannst Du mir - wenn bei mir alles funktioniert - noch sagen, wie ich den Schreibschutz umgehen kann?
4. Ich hatte Dich auch noch gefragt, ob Dir zu meinem anderen hier im Forum geposteten Problem eine Lösung einfällt - ich suche nach einer Lösung für eine automatische Zuteilung von Nummern in den Dienstortdateien. In jeder Dienstortdatei darf die Nummer, die vergeben wurde, nur einmal vorkommen. Also wenn in Tabellenblatt "EGZ 2011" die Nummer 1 in Zeile 5 vergeben wurde, darf diese Nummer in Tabellenblatt "EGZ 2012" nicht noch einmal vergeben werden. Und diese Nummer soll dann vergeben werden, wenn in die benachbarte Zelle etwas eingetragen wird. Hast Du hier auch eine Idee? Wäre sehr froh, wenn dieses Problem auch noch irgendwie gelöst werden könnte - möchte die Nummern ungern per Hand eingeben.
Ganz lieben Dank im Voraus!
Viele Grüße
CJ
Anzeige
AW: ein Ansatz
Tino
Hallo,
1. dieser Code muss nur in die Übersichtsdatei
2. nein du brauchst nur einen Button für die Start_Daten_Sammeln
3. schreibe nach der Zeile With .Sheets(varTab) diese Code Zeile
.Protect Password:="Kennwort", UserInterfaceOnly:=True
Kennwort natürlich entsprechend anpassen.
4. mal schauen wie ich heute noch Zeit finde, kann es nicht versprechen.
Gruß Tino
AW: ein Ansatz
CJ
Hallo Tino!
Ich habe gerade alle Codes in die Gesamtübersicht eingefügt.
Leider bekomme ich immer die Aussage "Keine Dateien gefunden". Ich habe in die Dienstort-Datei Achern ein Beispiel in Zeile 5 eingegeben.
Die Gesamtübersicht ist im Ordner: C:\Benutzer\Chr\Eigene Dokumente\EGZ\EGZ Gesamt
Die Excel-Liste für Achern ist: C:\Benutzer\Chr\Eigene Dokumente\EGZ\Achern
So wird es in der Firma auch sein. Die Excel-Liste für die Gesamtdatei heißt: EGZ Gesamtübersicht 2012
Die für einen beispielhaften Dienstort heißt: EGZ Übersicht Achern 2012
Die Anpassung an den Ordner habe ich im oberen Drittel vorgenommen:
Option Explicit
Dim oApp As Excel.Application
Sub Start_Daten_Sammeln()
Dim ArrayTabNamen(), ArrayFiles(), varNewInhalt
Dim strOrdner$, varTab
Dim nFileCount&
'Tabellen die gelesen werden sollen, diese müssen auch in der Übersicht vorhanden sein
ArrayTabNamen = Array("EGZ 2011", "EGZ 2012", "EGZ Projekt 50plus 2011", "EGZ Projekt 50plus 2012", "16e Fälle", "EQ")
'Ordner anpassen wo die Dateien liegen **********************
strOrdner = "C:\Benutzer\Chr\Eigene Dokumente\EGZ\Achern"
'************************************************************
If Right$(strOrdner, 1) "\" Then strOrdner = strOrdner & "\"
'Dateien suchen, die in diesen Ordner und Unterordner liegen
FindFiles ArrayFiles, strOrdner, nFileCount, Array("*.xls"), True
'Dateien gefunden?
If nFileCount = 0 Then
MsgBox "keine Dateien gefunden!"
Exit Sub
End If
Habe ich irgend etwas falsch gemacht?
Viele liebe Grüße
CJ
Anzeige
AW: ein Ansatz
Tino
Hallo,
sind es xls, xlst oder xlsm Dateien?
Zur Zeit werden nur *.xls Dateien gesucht, evtl. dies in Array(*.xls) anpassen.
Gruß Tino
AW: ein Ansatz
CJ
Hallo!
Darüber hatte ich gestern Abend auch schon nachgedacht, als ich mir den Code noch einmal durchgelesen habe. Es handelt sich aber um ganz normale xls-Dateien. Ich versuche es später in der Firma noch einmal und melde mich dann.
Viele Grüße
CJ
AW: ein Ansatz
CJ
Hallo Tino!
Also ich habe es gerade noch einmal in der Firma versucht - jetzt bekomme ich gar keine Meldung mehr. Er sucht, aber er sagt nicht mehr, dass er keine Daten gefunden hat und er schreibt auch keine in die Liste.
Die Datei kann ich mittlerweile nicht mehr hochladen, da sie trotz zippen mehr als 300kb hat!
Wenn Dir spontan noch etwas einfällt, dann schreibe es. Ich versuche auch noch einmal über das Problem nachzudenken.
Vielen lieben Dank für Deine Geduld!
Viele Grüße
CJ
AW: ein Ansatz
Tino
Hallo,
dann muss etwas anders sein wie im Beispiel.
Ich baue noch ein Beispiel auf damit du sehen kannst wie es laufen soll.
Gruß Tino
hier nochmal deine Beispieldateien
Tino
Hallo,
habe die Tabellen mal etwas gestaucht damit die nicht so groß sind.
Wenn Du die Mappe Uebersicht öffnest und den Button drückst werden die Dienstorte eingelesen.
Zu Deinem anderen Problem, evtl. stimmt dann der Pfad nicht!
https://www.herber.de/bbs/user/79149.zip
Gruß Tino
AW: hier nochmal deine Beispieldateien
CJ
Hallo Tino!
Erst einmal ein GANZ großes Lob an Dich für Deine Hilfe und Deine Geduld!
Ich habe die Dateien jetzt auf meinem Rechner genauso gespeichert, wie Du sie genannt hast und dann nur den Pfad aktualisiert. Es FUNKTIONIERT! :-))))
Jetzt will ich nachher das Ganze an den Kopien der Originaldateien ausprobieren.
Die Listen heißen nun nicht Dienstorte, sondern zum Beispiel "EGZ Übersicht Achern". Muss ich da noch etwas ändern?
Ich habe nämlich in dem Code folgende Zeile gelesen:
'Testpfad für Beispiel
strOrdner = IIf(Right$(ThisWorkbook.Path, 1) = "\", ThisWorkbook.Path, ThisWorkbook.Path & "\") & "Dienstorte"
Muss hier anstatt "Dienstorte" die richtige Bezeichnung des Ordners/Liste geschrieben werden?
Vielen herzlichen Dank schon einmal!
CJ
AW: hier nochmal deine Beispieldateien
Tino
Hallo,
wie die Dateien benannt sind ist egal,
mir ist nur kein besserer eingefallen, müssen nur xls Dateien sein. (kann man aber auch anpassen).
In diesen Zusammenhang ist mir noch eingefallen,
ist bei Dir die Ordner- Option von Windows, Erweiterung oder Extension bei bekannten Dateitypen ausblenden aktiviert? Dies könnte Probleme bereiten, habe ich jetzt aber noch nicht getestet!
Den Pfad müsstest Du natürlich später wieder anpassen, Bsp. strOrdner = "D:\Ordner\Noch ein Ordner\"
Gruß Tino
AW: hier nochmal deine Beispieldateien
CJ
Hallo Tino!
Sorry, dass ich erst heute Rückmeldung geben kann, aber die letzten beide Tage waren sehr stressig und ich hatte keine Zeit alles auszuprobieren.
Wenn ich nur Deine Beispielübersichtsdatei verwende, funktioniert das einlesen auch von einer anderen schon fertigen Tabelle. Wenn ich aber Modul 1 und 2 in meine richtige Übersichtsdatei kopiere, liest er die Daten nicht ein.
Ich habe schon folgendes überprüft:
- Der Pfad stimmt.
- habe sicherheitshalber den Schreibschutz deaktiviert (obwohl ich Deine ergänzende Zeile hineinkopiert hatte)
- Es sind .xls Dateien und die Endung wird auch angezeigt
- bei mir sind noch weitere Tabellenblätter dazu gekommen, die habe ich aber bei den arrays mit eingetragen.
Ich würde am Montag in der Firma einfach noch versuchen Deine Übersichtsdatei zu nehmen und meine Struktur wieder herzustellen. Vielleicht funktioniert ja das. Zu Hause auf meinem Rechner funktioniert nämlich gar nichts - hier habe ich allerdings auch Excel 2010 und Windows7 - in der Firma nur 2003. Gibt es bei unterschiedlichen Programmversionen Fehlerquellen?
Könnte eine Fehlerquelle die bestehenden anderen Makros sein? Sind zwar keine großen Sachen - nur Sortier-Buttons und Löschfunktionen.
Ich würde Dir ja - nur mal zur Ansicht - die fertige Übersichtsdatei (mit allen Makros und Formeln, Tabellenblättern) schicken, aber hier kann ich sie nicht hochladen, da sie trotz zippen mehr als 300kb hat.
Viele Grüße
CJ
da helfen nur Bsp.- Dateien
Tino
Hallo,
ich kann Dir leider auch nicht sagen was an Deinen Originaldateien anders ist und wo es hängt!
Vielleicht kannst Du die Dateien so abspecken das es doch reicht um diese hochzuladen,
es werden ja nicht alle Spalten benötigt und Formatierungen usw. sind auch nicht relevant.
Nur die Struktur und evtl. Makros, Tabellenschutz (Kennwort verraten) usw. sollte schon drin bleiben.
Gruß Tino
AW: da helfen nur Bsp.- Dateien
CJ
Hallo!
Also, ich habe die endgültige Datei so abgespeckt, dass ich sie hochladen kann.
https://www.herber.de/bbs/user/79196.zip
Es sind alle Spalten ab R gelöscht - eigentliche Tabelle geht bis AT. Die Daten sollen auch bis zu dieser Spalte eingelesen werden.
Ich habe auch alle bedingten Formatierungen gelöscht. Die Makros sind so, wie in der Originaldatei.
Die Gesamtübersicht heißt "EGZ Gesamtübersicht 2012" - in diese sollen die Listen der Dienstorte eingelesen werden - , die Listen für die Dienstorte heißen "EGZ Übersicht Achern 2012", "EGZ Übersicht Kehl 2012" usw.
Ich habe die Liste hier "EGZGesamtuebersicht" genannt, da er mir sonst immer hier beim Upload sagt, ungültiger Dateiname.
Das Passwort lautet LRA - dies ist nur für die vorübergehenden Tabellen, wird später noch geändert.
Wie schon gesagt, in der Firma handelt es sich um Excel 2003 - falls dies etwas ausmacht?!
Vielen lieben Dank für Deine Hilfe!
Viele Grüße
CJ
AW: da helfen nur Bsp.- Dateien
Tino
Hallo,
hier die Datei zurück.
Pfad müsstest Du später wieder anpassen.
In den Ordner Dienstorte habe ich eine 'EGZ Übersicht Achern 2012.xls' reingestellt.
Die Daten die ich zu testzwecke eingefügt habe müsstest Du nochmal in dieser löschen und
die Spalte Ex-Read auch löschen oder zumindest die Daten in der Spalte ab Zeile 5.
sonst wird diese Zeile nicht mehr gelesen.
Das mit dem Kennwort für den Tabellenschutz habe ich in dieser Zeile eingebaut.
If .ProtectContents Then .Protect Password:="LRD", UserinterfaceOnly:=True
Es wird geprüft ob die Tabelle geschützt ist,
wenn ja dann wird der Schutz nur für VBA aufgehoben. (entsprechendes Kennwort anpassen)
https://www.herber.de/bbs/user/79198.zip
Gruß Tino
AW: da helfen nur Bsp.- Dateien
CJ
Hallo Tino!
Habe gerade die Daten auf meinen Rechner gezogen. Leider zeigt er mir einen Laufzeitfehler 9 an. "Index außerhalb des gültigen Bereichs".
Ich hatte vorher in den Code geschaut und mir ist aufgefallen, dass ich keinen Pfad (C:\Eigene Dokumente\ etc) mehr eingeben musste. Ist das korrekt?
Viele Grüße
CJ
AW: da helfen nur Bsp.- Dateien
Tino
Hallo,
den Pfad musst du schon anpassen, hab ich doch geschrieben.
Gruß Tino
AW: da helfen nur Bsp.- Dateien
CJ
Hallo!
Pfad hatte ich in der Zwischenzeit wie Du es mir beim ersten Mal gesagt hattest, angepasst, Laufzeitfehler bleibt.
Habe ich ihn an der richtigen Stelle eingefügt? Wenn ja, dann würde ich es am Montag noch einmal in der Firma versuchen. Zu Hause hat es ja noch kein einziges Mal geklappt. Auf Arbeit hat Deine letzte Beispieldatei funktioniert, nur das Kopieren in die Übersichtsdatei nicht.
Option Explicit
Dim oApp As Excel.Application
Sub Start_Daten_Sammeln()
Dim ArrayTabNamen(), ArrayFiles(), varNewInhalt
Dim strOrdner$, varTab
Dim nFileCount&
'Tabellen die gelesen werden sollen, diese müssen auch in der Übersicht vorhanden sein
ArrayTabNamen = Array("EGZ 2011", "EGZ 2012", "EGZ Projekt 50plus 2011", "EGZ Projekt 50plus 2012", "16e Fälle", "EQ")
''Ordner anpassen wo die Dateien liegen **********************
''Beispiel
'strOrdner = "C:\Users\Chr\Documents\Gesamt\Dienstorte\"
'Testpfad für Beispiel
strOrdner = IIf(Right$(ThisWorkbook.Path, 1) = "\", ThisWorkbook.Path, ThisWorkbook.Path & "\") & "Dienstorte"
'************************************************************
If Right$(strOrdner, 1) "\" Then strOrdner = strOrdner & "\"
'Dateien suchen, die in diesen Ordner und Unterordner liegen
FindFiles ArrayFiles, strOrdner, nFileCount, Array("*.xls"), True
'Dateien gefunden?
If nFileCount = 0 Then
MsgBox "keine Dateien gefunden!"
Exit Sub
End If
Viele Grüße
CJ
AW: da helfen nur Bsp.- Dateien
Tino
Hallo,
den Pfad musst du bei Testpfad für Beispiel die Zeile darunter anpassen.
Du hast ihn im Kommentar angepasst!
Gruß Tino
ich antworte mal hier weiter......
CJ
Hallo Tino!
Ich habe jetzt den Code angepasst, hoffe es ist jetzt richtig? (dies ist echt nicht meine Uhrzeit :-)) Kann nicht mehr darüber nachdenken! Vielleicht ist es aber auch noch alles ein wenig zu viel für einen Anfänger wie mich! :-)))
Vorab aber schon mal: Es funktioniert auch nicht, nur diesmal findet er keine Daten. Habe den Pfad jetzt schon 3mal überprüft, er stimmt.
Option Explicit
Dim oApp As Excel.Application
Sub Start_Daten_Sammeln()
Dim ArrayTabNamen(), ArrayFiles(), varNewInhalt
Dim strOrdner$, varTab
Dim nFileCount&
'Tabellen die gelesen werden sollen, diese müssen auch in der Übersicht vorhanden sein
ArrayTabNamen = Array("EGZ 2011", "EGZ 2012", "EGZ Projekt 50plus 2011", "EGZ Projekt 50plus 2012", "16e Fälle", "EQ")
''Ordner anpassen wo die Dateien liegen **********************
''Beispiel
'strOrdner = "C:\Users\Chr\Documents\Gesamt\Dienstorte\"
'Testpfad für Beispiel
strOrdner = IIf(Right$("C:\Users\Chr\Documents\Gesamt\Dienstorte\", 1) = "\", ThisWorkbook.Path, ThisWorkbook.Path & "\") & "Dienstorte"
'************************************************************
If Right$(strOrdner, 1) "\" Then strOrdner = strOrdner & "\"
'Dateien suchen, die in diesen Ordner und Unterordner liegen
FindFiles ArrayFiles, strOrdner, nFileCount, Array("*.xls"), True
'Dateien gefunden?
If nFileCount = 0 Then
MsgBox "keine Dateien gefunden!"
Exit Sub
End If
Viele liebe Grüße
CJ
AW: ich antworte mal hier weiter......
Tino
Hallo,
die grünen Texte mit dem Hochkomma davor sind Kommentare und kein Programmcode.
Du musst den Pfad nach dem Kommentar 'Testpfad für Beispiel anpassen oder löschen und
Deinen Pfad zu einer Programmzeile machen.
Option Explicit

Dim oApp As Excel.Application

Sub Start_Daten_Sammeln()
Dim ArrayTabNamen(), ArrayFiles(), varNewInhalt
Dim strOrdner$, varTab
Dim nFileCount&

'Tabellen die gelesen werden sollen, diese müssen auch in der Übersicht vorhanden sein 
ArrayTabNamen = Array("EGZ 2011", "EGZ 2012", "EGZ Projekt 50plus 2011", "EGZ Projekt 50plus 2012", "16e Fälle", "EQ")

''Ordner anpassen wo die Dateien liegen ********************** 
''Beispiel 
strOrdner = "C:\Users\Chr\Documents\Gesamt\Dienstorte\"

'************************************************************ 

If Right$(strOrdner, 1) <> "\" Then strOrdner = strOrdner & "\"

'Dateien suchen, die in diesen Ordner und Unterordner liegen 
FindFiles ArrayFiles, strOrdner, nFileCount, Array("*.xls"), True
'Dateien gefunden? 
If nFileCount = 0 Then
MsgBox "keine Dateien gefunden!"
Exit Sub
End If
Gruß Tino
AW: ich antworte mal hier weiter......
CJ
Hallo Tino!
Also ich hatte heute Nacht auch schon verschiedene Szenarien durchgespielt, aber bin zu keinem befriedigenden Ergebnis gekommen.
Ich habe jetzt den Testpfad gelöscht und nur noch
''Ordner anpassen wo die Dateien liegen **********************
''Beispiel
strOrdner = "C:\Users\Chr\Documents\Gesamt\Dienstorte\"
drin stehen. Hier bekomme ich wieder den Laufzeitfehler. Ich habe schon google gefragt, welche möglichen Ursachen dies haben kann. Am häufigsten kam vor, dass er den Pfad nicht findet. Bei windows7 ist mir das bisher auch sehr schwer gefallen, hatte aber heute Nacht schon auf der Microsoft-Seite nachgeschaut und verschiedene Pfadmöglichkeiten gefunden. Als ich hier die Datei hochgeladen habe, hat er mir den Pfad in englisch angezeigt. Daher habe ihn jetzt auch so eingetragen und bekomme dann den Laufzeitfehler.
Ich habe gerade noch einmal den deutschen Pfad ausprobiert, jetzt findet er keine Daten! Es ist zum Verrücktwerden! :-(
Aber wie schon gesagt, hatte ich in der Firma, wo wir - glaube ich - Windows 2003 haben, den Pfad in Deiner letzten Beispieldatei angepasst und da funktionierte der Pfad. Daher würde ich es auf jeden Fall noch einmal morgen früh in der Firma versuchen.
Wenn ich jedoch den Testpfad so anpasse - wie ich ihn verstehe, dann sagt er mir, dass keine Daten vorhanden sind.
'Testpfad für Beispiel
strOrdner = IIf(Right$("C:\Users\Chr\Documents\Gesamt\Dienstorte\", 1) = "\", ThisWorkbook.Path, ThisWorkbook.Path & "\") & "Dienstorte"
Muss ich bei ThisWorkbook.Path auch noch etwas anpassen?
Ganz lieben Dank für Deine Geduld!
Viele Grüße
CJ
AW: ich antworte mal hier weiter......
Tino
Hallo,
strOrdner = IIf(Right$( ThisWorkbook.Path ,1) = "\", ThisWorkbook.Path, ThisWorkbook.Path & "\") & Dienstorte"
Diese Zeile verstehst Du falsch
ThisWorkbook.Path = der Pfad wo die Datei liegt wo auch der Code drin ist.
Also liegt die Datei auf C:\ gibt dir ThisWorkbook.Path C:\ zurück,
liegt diese auf D:\Ordner\ gibt dir ThisWorkbook.Path D:\Ordner zurück.
Die IIf-Funktion prüft ob am Ende des Pfades ein \ steht und wenn nicht wird es angefügt.
(siehe auch in der VBA Hilfe unter IIf-Funktion)
An die Rückgabe der IIF wird einfach der Ordner Dienstorte drangehängt.
Mach es so wie ich es Dir hier geschrieben habe.
https://www.herber.de/forum/messages/1253487.html
Gruß Tino

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige