Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1604to1608
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
Daten auslesen und in extra Tabelle Speichen
09.02.2018 18:51:06
Ha-Pe
Guten Abend
Brauch wieder mal Hilfe und Rat.
Ich möchte Daten aus mehreren Tabellen sammeln. Da ich eine Strees-/Arbeitsbelastung be-/auswerten soll.
Durch Forumsbeiträge bin ich auf einen Code gestoßen, der das macht. Also in die Mappe reinschauen, die Daten kopiert und sie dann in die Auswertetabelle einträgt. Um den Code für mein Vorhaben anzupassen fehlen mir leider die nötigen Kenntnisse.
Der Code macht zwischen den Daten der abgefragten Mappe immer 40 leere Zeilen. Außerdem macht der Code folgendes, wenn ich die Daten aus der Tabelle gelöscht habe und eine neue Datenabfrage mache, schreibt dieser die nun ausgelesenen Daten nicht wieder ab Zeile 1 sondern in die Zeile welche die letzte leere Zeile der vorigen Speicherung war.
Bei meinen Versuchen habe ich mit 5 Mappen a 25-30 Zeilen getestet. Da es aber 50 Mappen werden sind 40 Leerzeilen doch schon für mich eine Menge was an Platz weg ist.
1. Was muss ich verändern/machen damit die 40 leeren Zeilen nicht mehr zwischen den datensätzen sind?
2. Was ist zu verändern, das der Code bei leerem Tabellenblatt ab der Zeile 2 begint einzutragen bzw wenn schon Daten drin stehen ab der letzten leeren Zeile weiter einträgt?
Hier noch die gebastelte Testtabelle
https://www.herber.de/bbs/user/119684.xlsm
Achso, die Tabellen der Kollegen sind alle gleich aufgebaut
Zeile 1 sind Überschriften
Spalte
A: SpeicherDatum
B: SpeicherZeit
C: Arbeitsaufwand
D: Gund
E: Butto (welcher gedrückt wurde)
F: Arbeitsbereich
G: wer hat gespeichert
Hoffe ich hab's verständlich erklärt und es kann mir eine/r dabei helfen
Oder es gibt andere vielleicht bessere Lösungen
freundlicher Gruß
Ha-Pe

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Makro ist Kennwortgeschützt. o.w.T.
09.02.2018 19:07:32
Werner
AW: Daten auslesen und in extra Tabelle Speichen
09.02.2018 19:17:56
Ha-Pe
Guten Abend
ubs hatte ich vergessen.
hier nochmal ohne kennwortschutz
https://www.herber.de/bbs/user/119687.xlsm
Sorry dafür
freundlicher Gruß
Ha-Pe
AW: Daten auslesen und in extra Tabelle Speichen
09.02.2018 20:40:49
Ha-Pe
Guten Abend
ubs hatte ich vergessen.
hier nochmal ohne kennwortschutz
https://www.herber.de/bbs/user/119687.xlsm
Sorry dafür
freundlicher Gruß
Ha-Pe
AW: Daten auslesen und in extra Tabelle Speichen
09.02.2018 21:47:36
Werner
Hallo,
teste mal:
Private Sub CommandButton21_Click()
Dim strDateiname As String
Dim wksZiel As Worksheet, wkbQuelle As Workbook, wksQuelle As Worksheet
Dim loLetzte1 As Long
Dim loLetzte2 As Long
Dim inLetzte As Integer
Application.ScreenUpdating = False
strDateiname = Dir(ThisWorkbook.Path & "\*.xlsm")
Set wksZiel = ThisWorkbook.Worksheets("Tabelle1")
Do While strDateiname  ""
If strDateiname  ThisWorkbook.Name Then
Set wkbQuelle = Workbooks.Open(Filename:=ThisWorkbook.Path & "\" & strDateiname)
Set wksQuelle = wkbQuelle.Worksheets(2)
loLetzte1 = wksZiel.Cells(wksZiel.Rows.Count, 1).End(xlUp).Row + 1
'wenn in der Zieltabelle in Zeile 1 immer Daten/Überschriften
'vorhanden sind, dann brauchst du die folgende Zeile nicht
If wksZiel.Cells(2, 1) = "" Then loLetzteZiel = 2
With wksQuelle
loLetzte2 = .Cells(.Rows.Count, 1).End(xlUp).Row
inLetzte = .Cells(1, .Columns.Count).End(xlToLeft).Column
.Range(.Cells(2, 1), .Cells(loLetzte2, inLetzte)).Copy _
Destination:=wksZiel.Cells(loLetzte1, 1)
End With
wkbQuelle.Close True
End If
strDateiname = Dir
Loop
Set wkbQuelle = Nothing: Set wksQuelle = Nothing: Set wksZiel = Nothing
Application.ScreenUpdating = True
End Sub
Gruß Werner
Anzeige
AW: Daten auslesen und in extra Tabelle Speichen
09.02.2018 23:11:09
Ha-Pe
Hallo Werner
Wenn ich die Zeile wie in deinem Kommentar weglasse, dann funktioniert es.
Wenn ich die Zeile dabei lasse, sagte Excel, "Fehler beim Kompilieren, Variable nicht definiert".
Eine Sache hätte ich da noch. Um Duplikate weitestgehend zu vermeiden, ist es schwierig an diesem Code etwas zu ändern das die Daten aus den Quellen statt kopiert, ausgeschnitten werden bzw. nach dem kopieren und speichern in der Ziel Datei in den Quellen zu löschen. Oder macht es mehr Sinn nach dem auslesen in der Zieldatei die Duplikate zu finden und löschen?
Schon mal Dankeschön für die bisherige Hilfe
Gruß Ha-Pe
Anzeige
AW: Daten auslesen und in extra Tabelle Speichen
10.02.2018 08:32:50
Werner
Hallo Ha-Pe,
da würde ich einfach als erstes die Daten im Zielblatt leeren, dann kannst du nie doppelte Datensätze im Zielblatt haben.
Wenn du die Daten während dem Makrolauf, immer nachdem sie kopiert worden sind gleich löschen/leeren würdest, dann hast du das Problem, dass deine Quelldaten weg sind. Wenn jetzt, aus irgendwelchen Gründen, was schief läuft, dann sind deine Quelldaten weg.
Eine weitere Möglichkeit wäre (die sichere Vatiante) die Daten aus den Quellblättern zu holen, ins Zielblatt zu kopieren, das Zielblatt zu speichern und danach die Daten aus den Quellblättern zu löschen. Dann müsste man aber nochmal in einer Schleife über alle Quellblätter laufen und die alle nochmal öffnen, Daten leeren und wieder schließen. Da würde ich aber drauf verzichten, das ständige öffnen und schließen der Dateien ist nicht gerade besonders schnell.
Der Fehler mit der nicht deklarierten Variablen ist behoben - war ein Schreibfehler.
Option Explicit
Private Sub CommandButton21_Click()
Dim strDateiname As String
Dim wksZiel As Worksheet, wkbQuelle As Workbook, wksQuelle As Worksheet
Dim loLetzte1 As Long
Dim loSpalte As Long
Dim loLetzte2 As Long
Dim inLetzte As Integer
Application.ScreenUpdating = False
strDateiname = Dir(ThisWorkbook.Path & "\*.xlsm")
Set wksZiel = ThisWorkbook.Worksheets("Tabelle1")
'Daten im Zielblatt leeren
With wksZiel
loLetzte1 = .Cells(.Rows.Count, 1).End(xlUp).Row
loSpalte = .Cells(1, .Columns.Count).End(xlToLeft).Column
If loLetzte1 > 2 then
.Range(.Cells(2, 1), .Cells(loLetzte1, loSpalte)).ClearContents
End If
End With
Do While strDateiname  ""
If strDateiname  ThisWorkbook.Name Then
Set wkbQuelle = Workbooks.Open(Filename:=ThisWorkbook.Path & "\" & strDateiname)
Set wksQuelle = wkbQuelle.Worksheets(2)
loLetzte1 = wksZiel.Cells(wksZiel.Rows.Count, 1).End(xlUp).Row + 1
'wenn in der Zieltabelle in Zeile 1 immer Daten/Überschriften
'vorhanden sind, dann brauchst du die folgende Zeile nicht
If wksZiel.Cells(2, 1) = "" Then loLetzte1 = 2
With wksQuelle
loLetzte2 = .Cells(.Rows.Count, 1).End(xlUp).Row
inLetzte = .Cells(1, .Columns.Count).End(xlToLeft).Column
.Range(.Cells(2, 1), .Cells(loLetzte2, inLetzte)).Copy _
Destination:=wksZiel.Cells(loLetzte1, 1)
End With
wkbQuelle.Close True
End If
strDateiname = Dir
Loop
Set wkbQuelle = Nothing: Set wksQuelle = Nothing: Set wksZiel = Nothing
Application.ScreenUpdating = True
End Sub
Gruß Werner
Anzeige
AW: Daten auslesen und in extra Tabelle Speichen
10.02.2018 10:30:40
Ha-Pe
Guten Morgen Werner
Der Code funktioniert toll.
Danke auch für die Ausführungen zum Löschen in den Quelldateien. Da muss ich noch Überlegen wie und ob ich es mache.
Heute Nacht hatte ich über diese Sache der mit einigen Kollegen gesprochen und einige fragen, ob man das nicht vielleicht anonym machen könnte, also ohne Namen anzugeben. Den habe ich ja in der Quelldatei mit "Environ" speichern lassen. Den Mitarbeiternamen brauche ich um zu zählen wie viele Personen bei der gewerteten Arbeitsbelastung da sind.
Nach langen Überlegungen ist mir in den Sinn gekommen, dass man ja vielleicht den Mappen-/Dateinamen feststellen könnte, und den dann vor jede Zeile der Daten der Quelldatei setzen, z. Bsp. Spalte A, könne. Da kann der Kollege den Name seiner Datei selbst wählen, wenn er das will, und ich habe eine Größe/wert den man zählen kann.
Wäre es Zuviel verlangt mir auch hierbei bei einer Lösung zu helfen?
freundlicher Gruß
Ha-Pe
Anzeige
AW: Daten auslesen und in extra Tabelle Speichen
10.02.2018 10:37:58
Ha-Pe
Guten Morgen Werner
Der Code funktioniert toll.
Danke auch für die Ausführungen zum Löschen in den Quelldateien. Da muss ich noch Überlegen wie und ob ich es mache.
Heute Nacht hatte ich über diese Sache der mit einigen Kollegen gesprochen und einige fragen, ob man das nicht vielleicht anonym machen könnte, also ohne Namen anzugeben. Den habe ich ja in der Quelldatei mit "Environ" speichern lassen. Den Mitarbeiternamen brauche ich um zu zählen wie viele Personen bei der gewerteten Arbeitsbelastung da sind.
Nach langen Überlegungen ist mir in den Sinn gekommen, dass man ja vielleicht den Mappen-/Dateinamen feststellen könnte, und den dann vor jede Zeile der Daten der Quelldatei setzen, z. Bsp. Spalte A, könne. Da kann der Kollege den Name seiner Datei selbst wählen, wenn er das will, und ich habe eine Größe/wert den man zählen kann.
Wäre es Zuviel verlangt mir auch hierbei bei einer Lösung zu helfen?
freundlicher Gruß
Ha-Pe
Anzeige
AW: Daten auslesen und in extra Tabelle Speichen
10.02.2018 13:11:43
Werner
Hallo Ha-Pe,
wenn ich das richtig sehe, dann legt ja jeder Teilnehmer eine eigene Datei an. Um auszuwerten, wieviele Personen teilgenommen haben, kannst du ja in der Do - Loop - Schleife einfach zählen, wieviele Dateien geöffnet und importiert werden, dann hast du doch deine Teilnehmerzahl.
Vorbereitung: In deiner Zieltabelle die Überschrift für die Usernamen durch "Teilnehmer" oder "Anzahl" oder etwas ähnliches ersetzen.
Im jetzigen Makro wird die Spalte mit den Usernamen aus der Quelltabelle nicht mit in die Zieltabelle kopiert.
Am Schluß wird dann der Zählerwert in die Zeile 2, unter die Überschrift "Teilnehmer" / "Anzahl" geschrieben.
Option Explicit
Private Sub CommandButton21_Click()
Dim strDateiname As String
Dim wksZiel As Worksheet, wkbQuelle As Workbook, wksQuelle As Worksheet
Dim loLetzte1 As Long
Dim loSpalte As Long
Dim loLetzte2 As Long
Dim loLetzte As Long
Dim loZähler As Long
Application.ScreenUpdating = False
strDateiname = Dir(ThisWorkbook.Path & "\*.xlsm")
Set wksZiel = ThisWorkbook.Worksheets("Tabelle1")
'Daten im Zielblatt leeren
With wksZiel
loLetzte1 = .Cells(.Rows.Count, 1).End(xlUp).Row
loSpalte = .Cells(1, .Columns.Count).End(xlToLeft).Column
.Range(.Cells(2, 1), .Cells(loLetzte1, loSpalte)).ClearContents
End With
Do While strDateiname  ""
If strDateiname  ThisWorkbook.Name Then
Set wkbQuelle = Workbooks.Open(Filename:=ThisWorkbook.Path & "\" & strDateiname)
Set wksQuelle = wkbQuelle.Worksheets(2)
loLetzte1 = wksZiel.Cells(wksZiel.Rows.Count, 1).End(xlUp).Row + 1
'wenn in der Zieltabelle in Zeile 1 immer Daten/Überschriften
'vorhanden sind, dann brauchst du die folgende Zeile nicht
If wksZiel.Cells(2, 1) = "" Then loLetzte1 = 2
With wksQuelle
loLetzte2 = .Cells(.Rows.Count, 1).End(xlUp).Row
loLetzte = .Cells(1, .Columns.Count).End(xlToLeft).Column
'intLetzte - 1 = Spalte mit den Usernamen wird nicht mitkopiert
.Range(.Cells(2, 1), .Cells(loLetzte2, loLetzte - 1)).Copy _
Destination:=wksZiel.Cells(loLetzte1, 1)
loZähler = loZähler + 1
End With
wkbQuelle.Close True
End If
strDateiname = Dir
Loop
'Anzahl Schleifendurchläufe in Zelle schreiben
wksZiel.Cells(2, loSpalte) = loZähler
Set wkbQuelle = Nothing: Set wksQuelle = Nothing: Set wksZiel = Nothing
Application.ScreenUpdating = True
End Sub
Gruß Werner
Anzeige
AW: Daten auslesen und in extra Tabelle Speichen
10.02.2018 15:34:45
Ha-Pe
Hallo Werner
Auch dieser Code funktioniert top.
Ich habe auch zwischendurch weiter gesucht und probiert und eine Lösung gefunden.
Habe in der Quelldatei einfach statt dem Benutzernamen zu ermitteln den Befehl/Code gefunden um Namen der Mappe auszugeben. Und zwar mit ActiveWorkbook.Name .
Den Zähler den du da eingebaut hast kann ich super dafür benutzen, um festzustellen ob alle Kollegen ihre Mappen abgegeben bzw. im Ordner abgelegt haben.
Eine letzte Frage habe ich noch.
Wo muss ich bei diesem Code etwas ändern, damit der Zähler nicht in Spalte G ist sondern zwei oder drei Spalten weiter nach rechts rutscht?
Freundlicher Gruß
Ha-Pe
Anzeige
AW: Daten auslesen und in extra Tabelle Speichen
10.02.2018 15:54:41
Werner
Hallo Ha-Pe,
ist denn die Spalte und die Zeile in der du die Ausgabe des Zählers eintragen willst fix oder kann sich daran etwas ändern.
Sprich: Kann es sein, dass noch weitere Spalten in der Zielmappe dazu kommen oder nicht.
Derzeit wird die letzte belegte Spalte vom Code in Zeile 1 (Überschriften) ermittelt.
Wenn es eine fixe Zelle ist, dann könntest du sie auch direkt ansprechen:
wksZiel.Range("I2") = loZähler
Wenn es weiterhin über das Ermitteln der letzten belegte Spalte per Code laufen soll dann:
wksZiel.Cells(2, loSpalte).Offset(0, 2) = loZähler

Bedeutet:
ausgehend von der ermittelten letzten Spalte zwei Spalten weiter rechts -.Offset(0, 2)-
-erster Wert in der Klammer wäre der Zeilenversatz, negative Werte Versatz nach oben, positive Werte Versatz nach unten
-zweiter Wert in der Klammer wäre der Spaltenversatz, negative Werte Versatz nach links, positive Werte Versatz nach rechts
Gruß Werner
Anzeige
AW: Daten auslesen und in extra Tabelle Speichen
10.02.2018 16:24:12
Ha-Pe
Hallo Werner
Danke für die Erklärung
Jetzt habe ich es verstanden
Jetzt läuft es super
Aller besten Dank an dich und deine Geduld
wünsche Dir noch ein schönes Wochenende.
Freundliche Grüße
Ha-Pe
Gerne u. Danke für die Rückmeldung. o.w.T.
10.02.2018 17:13:49
Werner

303 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige