5k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo,

ich habe leider nicht ganz so viel Ahnung von Excel und wende mich mit meinem Anliegen daher an euch:

Ich habe mehrere Ordner, die nach der Kalenderwoche sortiert sind.
In diesen Ordnern liegen mehrere Stundenzettel als Exceldateien.

Ich möchte jetzt eine Übersichtsdatei haben, in dem Tabellen automatisch generiert werden. Was soll da drin stehen?

Die Tabellen sollen die jeweilige KW als Überschrift haben. (Die ist ja als Ordnername vorhanden). Dann in der Tabelle soll stehen die Baustellenanschrift: (Feld=D9) und dann die Stundenanzahl (Feld=J24)

Dann wenn er alle Dateien ausgelesen hat soll die Gesamtstunden der Woche unter der Tabelle stehen.

Dann wenn er mit dem einen Ordner bzw. Woche fertig ist, soll er für den nächsten Ordner (KW) eine neue Tabelle anfertigen.

Eine Schwierigkeit ist, das meisten eine verschiedene Anzahl von Exceltabellen im Ordner liegen.

Ich bedanke mich schonmal im vorraus für eure Mühe.

MfG Kaelan

23 Antworten

0 Punkte
Beantwortet von rainberg Profi (14.9k Punkte)
Hallo Kaelan,

so wie Du Dein Problem schilderst, kann ich Dir leider nicht helfen, aber aufgrund Deiner eigenen Feststellung

Ich habe leider nicht ganz so viel Ahnung von Excel

gestatte ich mir folgende Frage.

Ich kenne zwar den Gesamtumfang der Stundenzelltel und deren Grösse nicht, aber ist es den tatsächlich erforderlich, das Ganze in -zig Arbeitsmappen und noch dazu in verschiedenen Ordnern zu verstauen???

Damit erschwerst Du eine Auswertung dermaßen, dass ich nicht glaube, dass Du hier eine konkrete Lösung bekommst.

Kannst Du nicht versuchen alle Stundenzettel in 52 Arbeitsblättern der gleichen Mappe unter zu bringen und die Auswertung auf dem 53. Arbeitsblatt vor zu nehmen?

Gruß
Rainer
0 Punkte
Beantwortet von
Hallo,

ja leider ist es aus Organisatorischen Gründen notwendig alle Stundenzettel als einzelne Datei zu erstellen.

MfG Kaelan
0 Punkte
Beantwortet von
So das Grunggerüst habe ich fertig:
Private Sub Aktualisieren_Click()
Dim objFSO As Object
Dim objFolder As Object
Dim strPfad As String
Dim objSubfolder As Object, colSubfolders As Object
Dim i As Integer
i = 64
Dim Letter As String
Dim Letter1 As String
Dim Letter2 As String
Dim Letter3 As String
Dim Baustelle As String
Dim H As String
strPfad = "H:\Stundenzettel"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(strPfad)
Set colSubfolders = objFolder.Subfolders
Baustelle = "Baustellenaddresse"
H = "Stunden"
Range(Cells(1, 1), Cells(30, 156)).Select
Selection.ClearContents
For Each objSubfolder In colSubfolders
If i = 64 Then
i = i + 1
Letter = Chr(i)
Letter3 = Chr(i + 1)
Range(Letter & "1").Value = objSubfolder.Name
Range(Letter & "1").HorizontalAlignment = xlRight
Range(Letter & "2") = Baustelle
Range(Letter3 & "2") = H
Else
i = i + 3
Letter = Chr(i)
Letter3 = Chr(i + 1)
Range(Letter & "1").Value = objSubfolder.Name
Range(Letter & "1").HorizontalAlignment = xlRight
Range(Letter & "2") = Baustelle
Range(Letter3 & "2") = H
End If
Columns("A:Z").Select
Range(Selection, Selection.End(xlToRight)).Select
Cells.EntireColumn.AutoFit
Cells(1, 1).Select
Next objSubfolder
Set objFolder = Nothing
Set colSubfolders = Nothing
Set objFSO = Nothing
End Sub


Ich habe mir einen button angelegt und das scrip oben liest die ordner namen aus und generiert mir schon mal die Tabellen, so wie ich sie gerne hätte.

aber ich weis jetzt nicht wie ich die dateien auslesen kann, die in den Ordnern vorhanden sind.
0 Punkte
Beantwortet von
ist es möglich alle dateien die in einem Ordner sind auszulesen mit einem s-verweis zuverknüpfen( mit nem s-verweis bekomme ich doch einzelne zelleninhalte aus einer datei in eine andere oder?) und wenn alle dateien abgearbeitet sind den nächsten ordner zu bearbeiten?
0 Punkte
Beantwortet von theblackbird_ Mitglied (605 Punkte)
Moin,

Fuer
... nicht ganz so viel Ahnung von Excel...
sieht das Grundgeruest doch soo schlecht schon nicht aus. Nur testest Du da scheinbar mit einem Verzeichnis, welches nur ein paar Wochen (-Verzeichnisse) enthaelt. Kann das sein? Meiner Meinung nach muesste der Code spaetestens bei KW10 in einen Fehler laufen, da ab dort dann zweistellige Spaltenbezeichner aufzurufen waeren (AA, AB, usw. usf.) Arbeite hier doch besser gleich mit Cells(). Ich habe Dein Grundgeruest dahingehend einmal leicht abgeaendert:
Private Sub NAktualisieren_Click()
Dim objFSO As Object
Dim objFolder As Object
Dim strPfad As String
Dim objSubfolder As Object, colSubfolders As Object
Dim i As Integer
i = 0 ' 64
Dim Letter As String
Dim Letter1 As String
Dim Letter2 As String
Dim Letter3 As String
Dim Baustelle As String
Dim H As String
strPfad = "H:\Stundenzettel\"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(strPfad)
Set colSubfolders = objFolder.Subfolders
Baustelle = "Baustellenaddresse"
H = "Stunden"
Range(Cells(1, 1), Cells(30, 156)).Select
Selection.ClearContents
For Each objSubfolder In colSubfolders
If i = 0 Then ' = 64 Then
i = i + 1
' Letter = Chr(i)
' Letter3 = Chr(i + 1)
' Range(Letter & "1").Value = objSubfolder.Name
' Range(Letter & "1").HorizontalAlignment = xlRight
' Range(Letter & "2") = Baustelle
' Range(Letter3 & "2") = H
Else
i = i + 3
End If
' Letter = Chr(i)
' Letter3 = Chr(i + 1)
Cells(1, i).Value = objSubfolder.Name ' Range(Letter & "1").Value = objSubfolder.Name
Cells(1, i).HorizontalAlignment = xlRight ' Range(Letter & "1").HorizontalAlignment = xlRight
Cells(2, i).Value = Baustelle ' Range(Letter & "2") = Baustelle
Cells(2, i + 1).Value = H 'Range(Letter3 & "2") = H
' End If
Columns("A:Z").Select
Range(Selection, Selection.End(xlToRight)).Select
Cells.EntireColumn.AutoFit
Cells(1, 1).Select
Next objSubfolder
Set objFolder = Nothing
Set colSubfolders = Nothing
Set objFSO = Nothing
End Sub


Wenn Du nun schon einmal in jedem Unterverzeichnis bist (For Each objSubfolder), und dieses dann nur ExcelFiles enthaelt, welche eben gewuenschte Stundenzettel darstellen, koenntest Du mit einer weiteren ForEach-Schleife (For Each objFile in objSubfolder.Files) diese Files durchlaufen, oeffen (Workbooks.Open(), die benoetigten Werte herauskopieren und wieder schliessen (Workbook.Close()).

Wenn es moeglich ist, dann stelle doch einmal ein paar dieser Stundenzettel (mit verfremdeten Daten) z.B. als ZIP-File online. (z.B. bei www.file-upload.net/ DownloadLink dann hier bekannt geben.) Das wuerde potentiellen Helfern das Nachbauen einer entsprechenden FileStruktur abnehmen/vereinfachen, und auch gleich evtl. Probleme zu Tage foerdern, die Dir evtl. noch nicht aufgefallen sind.

Cu
TheBlackBird ®

btw:
- Wenn moeglich (hier in diesem Code sehr wohl moeglich) .Select vermeiden (Hier mal schoen erklaert.)
- .AutoFit wuerde ich aus der Schleife herausnehmen (also hinter das "Next objSubfolder" schreiben), da es nur einmal nach dem Aufsammeln aller Daten benoetigt werden sollte.
0 Punkte
Beantwortet von
Hallo,

ähm ich habe schon mehr rausgefunden und bin nun soweit:


Private Sub Aktualisieren_Click()
Dim objFSO As Object
Dim objFolder As Object
Dim strPfad As String
Dim objSubfolder As Object, colSubfolders As Object
Dim i As Integer
i = 64
Dim Letter As String
Dim Letter1 As Integer
Dim Letter2 As String
Dim Letter3 As String
Dim Baustelle As String
Dim strDatei As String
Dim Hilfe As String
Dim Hilfe2 As String
Dim Gesamt As String
Dim H As String
strPfad = "H:\Stundenzettel"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(strPfad)
Set colSubfolders = objFolder.Subfolders
Baustelle = "Baustellenaddresse"
H = "Stunden"
Gesamt = "Wochenstunden"
Range(Cells(1, 1), Cells(30, 156)).Select
Selection.ClearContents
For Each objSubfolder In colSubfolders
If i = 64 Then
i = i + 1
Letter = Chr(i)
Letter2 = Chr(i)
Letter3 = Chr(i + 1)
Range(Letter & "1").Value = objSubfolder.Name
Range(Letter & "1").HorizontalAlignment = xlRight
Range(Letter & "2") = Baustelle
Range(Letter3 & "2") = H
Letter1 = 4
strDatei = Dir("H:\Stundenzettel\" & objSubfolder.Name & "\")
Do Until strDatei = ""
Hilfe2 = "='H:\Stundenzettel\" & objSubfolder.Name & "\[" & strDatei & "]Tabelle1'!D9"
Range(Letter2 & Letter1) = Hilfe2
Hilfe = "='H:\Stundenzettel\" & objSubfolder.Name & "\[" & strDatei & "]Tabelle1'!J24"
Range(Letter3 & Letter1) = Hilfe
Letter1 = Letter1 + 1
strDatei = Dir
Loop
Letter1 = Letter1 + 1
Range(Letter2 & Letter1) = Gesamt
Else
i = i + 3
Letter = Chr(i)
Letter2 = Chr(i)
Letter3 = Chr(i + 1)
Range(Letter & "1").Value = objSubfolder.Name
Range(Letter & "1").HorizontalAlignment = xlRight
Range(Letter & "2") = Baustelle
Range(Letter3 & "2") = H
Letter1 = 4
strDatei = Dir("H:\Stundenzettel\" & objSubfolder.Name & "\")
Do Until strDatei = ""
Hilfe2 = "='H:\Stundenzettel\" & objSubfolder.Name & "\[" & strDatei & "]Tabelle1'!D9"
Range(Letter2 & Letter1) = Hilfe2
Hilfe = "='H:\Stundenzettel\" & objSubfolder.Name & "\[" & strDatei & "]Tabelle1'!J24"
Range(Letter3 & Letter1) = Hilfe
Letter1 = Letter1 + 1
strDatei = Dir
Loop
Letter1 = Letter1 + 1
Range(Letter2 & Letter1) = Gesamt
End If
Next objSubfolder
Columns("A:Z").Select
Range(Selection, Selection.End(xlToRight)).Select
Cells.EntireColumn.AutoFit
Cells(1, 1).Select
Set objFolder = Nothing
Set colSubfolders = Nothing
Set objFSO = Nothing
End Sub


Der liest jetzt auch schon die richtigen Daten aus. nur mit dem Befahl Cell() habe ich jetzt noch nicht übernommen. Ich hoffe ich bekomme das Überhaupt hin. Ich verliere gern ma den Überblick^^.

Danke auf jeden fall schon ma für deine Mühe.

Du wirst sehen das ich die Gesamtstunden ausrechnen möchte. Das soll 2 zeilen unter der Liste passieren egal wie viele Einträge die Tabelle hat. Da komme ich momentan überhaupt nicht weiter.

MfG Kaelan
0 Punkte
Beantwortet von
Ich habe die Cells() von dir mal übernommen. Aber jetzt schreibt er gar nichts mehr in die Zellen rein. Woran kann das liegen?
0 Punkte
Beantwortet von
Ok habe den Fehler gefunden
0 Punkte
Beantwortet von
Private Sub Aktualisieren_Click()
Dim objFSO As Object
Dim objFolder As Object
Dim strPfad As String
Dim objSubfolder As Object, colSubfolders As Object
Dim i As Integer
Dim j As Integer
j = 1
i = 0
Dim Baustelle As String
Dim strDatei As String
Dim Stundenanzahl As String
Dim Baustellenname As String
Dim Gesamt As String
Dim H As String
strPfad = "H:\Stundenzettel"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(strPfad)
Set colSubfolders = objFolder.Subfolders
Baustelle = "Baustellenaddresse"
H = "Stunden"
Gesamt = "Wochenstunden"
Range(Cells(1, 1), Cells(30, 156)).Select
Selection.ClearContents
For Each objSubfolder In colSubfolders
If i = 0 Then
i = i + 1
Cells(1, i).Value = objSubfolder.Name
Cells(1, i).HorizontalAlignment = xlRight
ActiveCell.BorderAround ColorIndex:=0, Weight:=xlMedium
Cells(2, i).Value = Baustelle
ActiveCell.BorderAround ColorIndex:=0, Weight:=xlMedium
Cells(2, i + 1).Value = H
i = 4
strDatei = Dir("H:\Stundenzettel\" & objSubfolder.Name & "\")
Do Until strDatei = ""
Baustellenname = "='H:\Stundenzettel\" & objSubfolder.Name & "\[" & strDatei & "]Tabelle1'!D9"
Cells(i, 1) = Baustellenname
Stundenanzahl = "='H:\Stundenzettel\" & objSubfolder.Name & "\[" & strDatei & "]Tabelle1'!J24"
Cells(i, 2) = Stundenanzahl
i = i + 1
strDatei = Dir
Loop
i = i + 1
Cells(i, 1) = Gesamt
i = 4
Else
j = j + 3
Cells(1, j).Value = objSubfolder.Name
Cells(1, j).HorizontalAlignment = xlRight
Cells(2, j).Value = Baustelle
Cells(2, j + 1).Value = H

strDatei = Dir("H:\Stundenzettel\" & objSubfolder.Name & "\")
Do Until strDatei = ""
Baustellenname = "='H:\Stundenzettel\" & objSubfolder.Name & "\[" & strDatei & "]Tabelle1'!D9"
Cells(i, j) = Baustellenname
Stundenanzahl = "='H:\Stundenzettel\" & objSubfolder.Name & "\[" & strDatei & "]Tabelle1'!J24"
Cells(i, j + 1) = Stundenanzahl
i = i + 1
strDatei = Dir
Loop
i = i + 1
Cells(i, j) = Gesamt
i = 4
End If
Next objSubfolder
Columns("A:Z").Select
Range(Selection, Selection.End(xlToRight)).Select
Cells.EntireColumn.AutoFit
Cells(1, 1).Select
Set objFolder = Nothing
Set colSubfolders = Nothing
Set objFSO = Nothing
End Sub


Das ist jetzt der Code noch mal umgeschrieben mit den Cells() anstatt Range() danke noch mal für den Tip.

Es ist soweit alles funktionsfähig nur möchte ich jetzt noch gerne, dass er automatisch die Gesamtstundenzahl ausrechnet. Da weiß ich leider nicht wie ich das machen soll, da ja beliebig viele Zellen genutzt werden können, um die Einzelstunden zu zeigen.

Dann wäre es noch super wenn ich jede Tabelle einen Rahmen geben könnte.

Habt ihr noch weitere super Tips für mich?

MfG Kaelan

P.S.: Das ich das jeze so schnell alles hinbekomme habe liegt nur an Google^^ Aber jetzt glaube ich das ich an die Grenzen gestoßen bin.
0 Punkte
Beantwortet von theblackbird_ Mitglied (605 Punkte)
Moin,

Fuer "nicht ganz so viel Ahnung" und Google sieht das doch wahrlich nicht soo schlecht aus. ;-)

Die gewuenschten Daten hast Du beisammen. Glueckwunsch!
Mit ein wenig mehr Suchen bei Google bekommst Du die Summe der einzelnen Wochen auch noch hin.

Ich werde mich nach dem Aufstehen dennoch mal hinsetzen und versuchen, Dein Ergebnis und die restlichen "Kleinigkeiten" mal in Code zusammen zu fassen. malSchauen ob das Ergebnis Deinen Wuenschen entsprechen wird, und ob es von Dir nachvollzogen werden kann. ;-)

Cu
TheBlackBird ®

btw:
- wenn Du den Pfad schon in eine Variable packst, warum verwendest Du diese dann nicht auch durchgehend? (z.B. bei "strDatei = Dir()" ?
...