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

was geht schneller

was geht schneller
03.09.2016 14:21:02
MB12
Hallo zusammen,
ich möchte aus allen identisch aufgebauten Dateien (ca 500) im Ordner X Tabelle1 die Zahl in Zelle A1 in mein aktives Sheet schreiben (Überwachung, Anzahl noch nicht erledigter Vorgänge)
Welcher Weg ist schneller:
-mit VBA nacheinander die Dateien öffnen und wieder schließen oder
- mit Formel, z.B.:
='C:\Users\MB\Desktop\Protokolle\[1.xlsx]Tabelle1'!$A$1
die Zahlen aus den geschlossenen Dateien kopieren.
Die beiden Wege habe ich bereits ausprobiert, kann aber die Dauer nicht testen, da die Dateien noch nicht existieren.
Kann mir anhand dieser Angaben jemand eine Voraussage machen?
Danke schön und liebe Grüße, Margarete

27
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: was geht schneller
03.09.2016 14:45:10
Michael
Hi Margarete,
schreib Dir halt schnell ein Makro, das 500 Dateien erzeugt und in einen Ordner schreibt.
Oder lege einfach 1 an, gehe in den Win-Explorer und markiere alle Dateien, kopiere sie und füge sie ein.
512 = 2 hoch 9, d.h. Du mußt das nicht mal 10x hintereinander machen, und Du hast 500 Dateien...
Schöne Grüße,
Michael
Nachtrag
03.09.2016 14:51:21
Michael
Vor lauter Flapsigkeit...
Also, wenn Du mich fragst, würde ich NIE 500 "gleiche" Dateien anlegen: das schreit entweder nach einer Datenbank oder EINER Tabelle: selbst wenn Du pro Datei meinetwegen 100 Zellen mit Daten hast: dann haste eben eine Liste mit 100 Spalten: so what?
"Gleichartige Daten" gehören sich IMMER in eine Tabelle: hier kann man suchen, sortieren, filtern usw.
Eine andere Sache ist der Zugriff auf die Daten bzw. die ANSICHT oder, auf gut deutsch, das user-Interface: das funktioniert prinzipiell umso einfacher, je strukturierter die Daten sind.
Schöne Grüße,
M.
Anzeige
GetObject, Formel oder Native Excel...
03.09.2016 15:07:01
Case
Hallo Margarete, :-)
bei 500 Dateien würde ich mit "GetObject" öffnen, den Zellinhalt auslesen und ohne speichern wieder schliessen - hier wird es mit Formeln langsamer laufen.
Bei weniger Dateien spielt es keine Rolle - da kann man je nach Gusto vorgehen.
Bei sehr vielen Dateien ist "Native Excel" unschlagbar. Habe ich im Einsatz und kann Daten auslesen UND schreiben. Excel muss nicht mal installiert sein.
Ist allerdings nicht kostenlos. Es gibt verschiedenen Anbieter. Dürfte für Dich jetzt wahrscheinlich uninteressant sein - habe es nur der Vollständigkeit halber erwähnt.
Servus
Case

Anzeige
Antwort an alle...
03.09.2016 15:35:19
MB12
Hallo Ihr Lieben,
der Schnelligkeit halber (ha!) nur eine Antwort an Euch beide:
1. @Case: werde micht mit "GetObject" beschäftigen, danke für den Tipp. Nicht kostenlose Lösung kriege ich nicht durch.
2. Michael: klar, werde das testen, das ist schnell erledigt.
3. Michael: Separate Dateien sind erforderlich: Jede Datei ist ein Protokoll von Übergabegesprächen. Wenn einzelne Punkte vorab nicht erledigt werden konnten, stellen diese eine LOP (List of open points) dar, die bis zu einem vereinbarten Termin abgearbeitet sein müssen.
Das müssen wir überwachen.
Mein Vorschlag könnte in diese Richtung gehen:
In den Protokollen in B1:
=ZÄHLENWENNS(F6:F24;"offen";G6:G24;" In der Datei "Überwachung" hole ich mir per Makro
Sub DateinamenAuflisten()
'Dateinamen in einem bestimmten Verzeichnis auflisten
'Die Angabe des Verzeichnises erfolgt in DOS Konvention
'Eingefügt werden die Daten ab der aktiven Zelle
Dim Dateiname As String, i As Integer
Dateiname = Dir$("c:\Users\MB\Desktop\Protokolle\*.*") 'Test
Do While Dateiname  ""
ActiveCell.Offset(i, 0) = Dateiname
i = i + 1
Dateiname = Dir$()
Loop
End Sub
alle Dateinamen.
Dann kann ich z.B. mit Formeln - Idee von
http://excelformeln.de/tips.html?welcher=107
(allerdings habe ich das abgeändert, kann ich auch noch aufzeichnen) die Zahlen einkopieren.
Wenn ich es dann noch komfortabler will, lege ich dazu noch die Hyperlinks zu den Dateien rein, bei denen eine Zahl >0 erscheint.
Wird dann zB 1x pro Woche überprüft.
Hört sich das vernünftig an?
Grüßle
Margarete
Anzeige
AW: Per VBA mit Formeln...
03.09.2016 17:37:41
MB12
Hallo lieber "Fast-Nachbar" Ralf (30 Jahre Vellberg),
ob Formel oder nicht - ist mir im Endeffekt gleichgültig. Ich hatte ursprünglich den Ehrgeiz, mir alles selbst zusammenzubasteln.
Inzwischen habe ich die Formellösung mit einer größeren Anzahl Dateien getestet und festgestellt, dass ich immer wieder #Bezug-Fehlermeldungen bekomme, die erst verschwinden, wenn ich jede einzelne Datei nochmal geöffnet hatte- fliegt also raus, da jeden Tag neue Dateien hinzukommen, die leider "unsaubere" Dateinamen haben werden, also nicht immer einem vorgegebenen Muster folgen werden (ca 20 verschiedene Mitarbeiter).
Ich hatte schon die Vorgehensweise mit dem "ExecuteExcel4Macro" gefunden und gedacht, dass das passen könnte, da ich aus jeder Datei nur den Wert einer Zelle kopieren muss (z.B. aus B1).
Deine Beispiele sind für einen Anfänger wie mich beeindruckend, aber ich wäre bei der Anpassung überfordert.
Falls du noch etwas Zeit hättest: Könntest du mal mit der Beispieldatei spielen?
https://www.herber.de/bbs/user/108001.xlsm
Herzlichen Dank, Margarete
Anzeige
Beispiel - Formeln mit VBA...
03.09.2016 20:22:07
Case
Hallo Margarete, :-)
das ist ja nun wirklich Nachbarschaft. ;-)
Habe Dir mal ein Beispiel gemacht. Wenn Du damit nicht klar kommst, melde dich. Sind 100 Dateien zum testen. Habe es deswegen bei mir hochgeladen (700 KB).
Dateiname mit Hyperlink in Spalte A - es wird nur der Dateiname angezeigt, der jeweilige Wert aus A1 in Spalte B.
Formeln mit VBA...
Servus
Case

und das war Nachbarschaftshilfe!
03.09.2016 21:19:51
MB12
Hallo lieber Ralf,
sooo habe ich das Ganze geplant!!
Habe bereits alles angepasst, und es funktioniert perfekt. Und das ganze am Samstag Abend, meinen herzlichen Dank und Hochachtung.
Du kannst dir sicher vorstellen, dass ich parallel weitergearbeitet hatte, da ich nicht wusste, ob du überhaupt Zeit hast. Bis zu den Dateinamen und -inhalt aus B1 war ich gekommen, aber das mit Gewurschtel (2 Makros zusammengefügt, beim zweiten i durch y ersetzt, da ich das i nicht redimensionieren konnte), Hyperlinks waren auch noch nicht da, die ganze Beschleunigung (screen updating, calculationmanual usw) hätte ich noch suchen müssen usw usw.
Habe heute wieder viel gelernt, und dann noch ein tolles Ergebnis erhalten!
Liebe Grüße aus Honhardt, Margarete
Anzeige
AW: und das war Nachbarschaftshilfe!
03.09.2016 22:57:48
Case
Hallo Margarete, :-)
super, dass es klappt - und viele Grüße zurück aus Sulzdorf. ;-)
Servus
Case

AW: und das war Nachbarschaftshilfe!
06.09.2016 09:23:46
MB12
Hallo Ralf,
Eine Ergänzung wird erforderlich: Die Quelldateien können sich täglich ändern (Terminvergleich mit HEUTE(), so dass der abgefragte Wert in B1 sich ebenfalls ändert. Dafür habe ich folgende Lösung gefunden:
...
In das Modul "DieseArbeitsmappe":
Option Explicit
Private Sub Workbook_Open()
Call RefreshWorkbooks
End Sub

In ein Standardmodul:
Option Explicit
Option Private Module
Public Sub RefreshWorkbooks()
Dim objWorkbook As Workbook
Dim strFolder As String, strThisworkbookName As String
Dim strFilename As String
strFolder = ThisWorkbook.Path & "\"
strThisworkbookName = ThisWorkbook.Name
With Application
.EnableEvents = False
.ScreenUpdating = False
.ShowWindowsInTaskbar = False
End With
strFilename = Dir$(strFolder & "*.xls*")
Do Until strFilename = vbNullString
If strFilename  strThisworkbookName Then
Set objWorkbook = Workbooks.Open(Filename:= _
strFolder & strFilename, UpdateLinks:=3)
Call objWorkbook.Close(SaveChanges:=True)
Set objWorkbook = Nothing
End If
strFilename = Dir$
Loop
With Application
.EnableEvents = True
.ScreenUpdating = True
.ShowWindowsInTaskbar = True
End With
End Sub
aus: office-loesung.de Isabelle 02.05.2013
Hier sind Quelldateien und Zieldatei im selben Ordner, bei mir nicht.
Habe die Codes einfach mal in die Datei eingefügt: es wird bereits bei
Dim objWorbook As Workbook
gemeckert, und mir ist klar, dass ich noch einiges bei Thisworkbook usw anpassen muss.
Könntest du das mal durchgehen? Ich würde dieses Makro separat einem Button zuweisen und vor deinem Makro jeweils ablaufen lassen.
Hier die Datei und eine Quelldatei
https://www.herber.de/bbs/user/108038.xlsm
https://www.herber.de/bbs/user/108039.xlsx
Sorry für den Zusatzaufwand und beste Grüße aus CR
Margarete
Anzeige
ach ja, das leidige OffenStellen...
06.09.2016 11:21:34
MB12
.
Ein weiteres Beispiel...
06.09.2016 11:22:01
Case
Hallo Margarete,
... wenn Du zum refreshen öffnen musst, dann können wir doch gleich in dem Zuge alles erledigen? Dauert durch öffnen und speichern natürlich länger.
Beispiel...
Servus
Case

so ein süsses kleines Makro (grins)
06.09.2016 12:01:01
MB12
Hallo Case,
klasse, das wird auf jeden Fall gehen, habe auch schon mit den Kollegen gesprochen. Bei einer Aktualisierung pro Woche kann man ruhig eine längere Laufdauer in Kauf nehmen.
Nochmal meinen besten Dank.
Gruß, Margarete
Anzeige
@Luc
06.09.2016 13:22:32
MB12
Hallo Luc,
danke schön!! Habe jetzt vorsichtshalber den gesamten Thread gespeichert. Spätestens am WE werde ich das nacharbeiten.
Gruß von der Arbeitsfront
Margarete
Anzeige
Auf 'dort' kannst Du zZ noch antworten! ;-) owT
06.09.2016 14:37:08
Luc:-?
:-?
Die Geschichte mit dem Finger &der ganzen Hand...
07.09.2016 19:41:19
MB12
Hallo Case,
meine Kollegen fragen jetzt, ob man bei der Quelldatei auch Unterordner einfügen könnte, sie hätten die Protokolle gerne für jeden Produktbereich (insg. 4) separat gespeichert.
Ich würde es vermutlich stümperhaft hinbekommen, aber: wenn schon perfekt, dann möglichst alles.
Hier nochmal dein Code:
Option Explicit
Option Private Module
Const strSheetQ As String = "Tabelle1" ' DIE Tabelle wird ausgelesen"
Const strSheetZ As String = "Protokoll" ' Die Tabelle in DIESER Datei
Const strCellQ As String = "B1" ' Diese Zelle wird ausgelesen
Public Sub Main()
Dim strThisworkbookName As String
Dim objWorkbook As Workbook
Dim strFolder As String
Dim strFilename As String
Dim lngLastRow As Long
Dim lngCalc As Long
On Error GoTo Fin
'  strFolder = ThisWorkbook.Path & "\"
strFolder = Environ("USERPROFILE") & "\Desktop\Protokolle\" ' MB angepasst
strThisworkbookName = ThisWorkbook.Name
With Application
lngCalc = .Calculation
.Calculation = xlCalculationManual
.EnableEvents = False
.ScreenUpdating = False
.ShowWindowsInTaskbar = False
.DisplayAlerts = False
End With
With ThisWorkbook.Worksheets(strSheetZ)
.Rows("2:" & .Rows.Count).Clear
strFilename = Dir$(strFolder & "*.xls*")
Do Until strFilename = vbNullString
If strFilename  strThisworkbookName Then
Set objWorkbook = Workbooks.Open(Filename:= _
strFolder & strFilename, UpdateLinks:=3)
Call objWorkbook.Save
lngLastRow = IIf(Len(.Cells(.Rows.Count, 2)), _
.Rows.Count, .Cells(.Rows.Count, 2).End(xlUp).Row) + 1
.Cells(lngLastRow, 1).Value = strFilename
.Cells(lngLastRow, 1).Hyperlinks.Add Anchor:=.Cells(lngLastRow, 1), _
Address:=strFolder & strFilename
.Cells(lngLastRow, 2).Value = objWorkbook.Worksheets(strSheetQ).Range("B1")
Call objWorkbook.Close(SaveChanges:=False)
Set objWorkbook = Nothing
End If
strFilename = Dir$()
Loop
End With
Fin:
With Application
.EnableEvents = True
.ScreenUpdating = True
.ShowWindowsInTaskbar = True
.Calculation = lngCalc
.DisplayAlerts = True
.CutCopyMode = True
End With
If Err.Number  0 Then MsgBox "Error: " & _
Err.Number & " " & Err.Description
End Sub
Falls du keine Zeit/Lust haben solltest, dann schick mich - du weißt schon, wohin.
Auf jeden Fall ein großes Danke schön
Gruß, Margarete
Anzeige
faule Sache
08.09.2016 13:51:41
Michael
Hi Margarete,
anbei die faule Lösung, bei der Du die 4 von den Kollegen gewünschten Verzeichnisse fix in eine Konstante eingibst, die dann wiederum mit split in ein Array verwandelt wird, das dann in der For-Schleife abgearbeitet wird.
Option Explicit
Option Private Module
Const strSheetQ As String = "Tabelle1" ' DIE Tabelle wird ausgelesen"
Const strSheetZ As String = "Protokoll" ' Die Tabelle in DIESER Datei
Const strCellQ As String = "B1" ' Diese Zelle wird ausgelesenPublic Sub Main()
' die ändern sich doch sowieso nicht, oder?
Const UO = "C:\A\A?C:\A\B?C:\A\C?C:\A\D" ' alle 4 Pfade
Dim arrUO, iUO&
Dim strThisworkbookName As String
Dim objWorkbook As Workbook
Dim strFolder As String
Dim strFilename As String
Dim lngLastRow As Long
Dim lngCalc As Long
On Error GoTo Fin
'  strFolder = ThisWorkbook.Path & "\"
'    strFolder = Environ("USERPROFILE") & "\Desktop\Protokolle\" ' MB angepasst
strThisworkbookName = ThisWorkbook.Name
With Application
lngCalc = .Calculation
.Calculation = xlCalculationManual
.EnableEvents = False
.ScreenUpdating = False
.ShowWindowsInTaskbar = False
.DisplayAlerts = False
End With
arrUO = Split(UO, "?")
With ThisWorkbook.Worksheets(strSheetZ)
.Rows("2:" & .Rows.Count).Clear
For iUO = LBound(arrUO) To UBound(arrUO)     ' *****
If arrUO(iUO)  "" Then               ' falls ein ? falsch gesetzt wurde
strFilename = Dir$(arrUO(iUO) & "*.xls*")  ' *******
Do Until strFilename = vbNullString
If strFilename  strThisworkbookName Then
Set objWorkbook = Workbooks.Open(Filename:= _
strFolder & strFilename, UpdateLinks:=3)
Call objWorkbook.Save
lngLastRow = IIf(Len(.Cells(.Rows.Count, 2)), _
.Rows.Count, .Cells(.Rows.Count, 2).End(xlUp).Row) + 1
.Cells(lngLastRow, 1).Value = strFilename
.Cells(lngLastRow, 1).Hyperlinks.Add Anchor:=.Cells(lngLastRow, 1), _
Address:=strFolder & strFilename
.Cells(lngLastRow, 2).Value = objWorkbook.Worksheets(strSheetQ).Range("B1")
Call objWorkbook.Close(SaveChanges:=False)
Set objWorkbook = Nothing
End If
strFilename = Dir$()
Loop
End If                                    ' *****
Next                                       ' *****
End With
Fin:
With Application
.EnableEvents = True
.ScreenUpdating = True
.ShowWindowsInTaskbar = True
.Calculation = lngCalc
.DisplayAlerts = True
.CutCopyMode = True
End With
If Err.Number  0 Then MsgBox "Error: " & _
Err.Number & " " & Err.Description
End Sub
So geht das mit minimalen Änderungen. Der Punkt ist, daß "Dir" nicht rekursiv funktioniert, d.h. man kann es nicht ohne Weiteres bei verschachtelten Unterverzeichnissen einsetzen.
WAS man tun könnte, um die Variabilität zu erhalten, ist, das Array nicht aus der Konstanten zu füllen, sondern mit einer eingangs zu positionierenden Dir-Schleife, die NUR die Verzeichnisse unterhalb von strFolder einliest (sieh Dir mal die Hilfe von Dir an bzw. überleg Dir standardisierte Verzeichnisnamen, z.B. UV_AbtA, UV_AbtB usw.)
Viel Spaß,
Michael
AW: faule Sache - naja, kommt darauf an,..
08.09.2016 17:50:10
MB12
was man als "faul" bezeichnet.
Hi Michael,
lieben Dank für die Hilfe - ich weiß, du wolltest mich nicht hängen lassen, falls Case keine Zeit gehabt hätte. Diese Lösung werde ich genauer durcharbeiten. Ich hatte sowieso geplant, gleiche Ordnernamen zu vergeben, also Protokolle_AAA, Protokolle_BBB usw.
Gerade weil ich mich mit DIR bisher überhaupt nicht auskenne, hatte ich Manschetten, selbst an dem Code rumzuschrauben. Die gegoogelten Vorschläge hätten m.E. nicht zu Case's Code gepasst.
Das Problem ist hier, dass es "menscheln" wird, also kann ich davon ausgehen, dass eine Anzahl x der Protokolle nicht im korrekten Unterordner, sondern im Hauptordner landen wird.
Deshalb werde ich jetzt erst mal zur Präsentation die von Case angepasste Lösung verwenden.
Einen wunderschönen Herbstabend vom Dorf
Margarete
Hier nun mit Unterordner...
08.09.2016 15:28:22
Case
Hallo Margarete, :-)
anbei eine Möglichkeit mit Rekursion: ;-)
Mit Unterordner...
Servus
Case

AW: Hier nun mit Unterordner & Unter-Unterordner
08.09.2016 17:56:07
MB12
Hallo lieber Ralf,
auf die Franken kann man sich einfach verlassen (soll nicht heißen, dass das bei Nicht-Franken anders sein muss)!
Habs bereits laufen lassen und es funktioniert (natürlich!).
Michael kennt das schon von mir: Ich werde jetzt mal beide Codes ohne /mit Unterordner nebeneinanderkopieren, damit ich in etwa verstehe, was du geändert bzw. hinzugefügt hast.
Wie oft habe ich mich schon bei dir bedankt? Egal: DANKE DANKE
Schönen Abend nach Su'dorf (habe vor Jahren kurze Zeit in der Föhrenstr. gewohnt)
Grüßle, Margarete
Franken?
09.09.2016 07:48:32
Case
Hallo Margarete, :-)
ich komme eigentlich aus Schleswig bzw. Stettin - also nix mit Franken. ;-)
Und habe mal im Hofbauernweg gewohnt - ist ja direkt neben der Föhrenstraße. ;-)
Servus
Case

siehste -
09.09.2016 19:12:03
MB12
Hallo Ralf,
auch mich hat's erst mit 26 nach Franken verschlagen. Werde nie vergessen, wie ich gleich in den ersten Wochen im Entenbäck in Anwesenheit eines "echten" einem Touri gegenüber erklärt hatte, Hall gehöre zu Schwaben. Das gab ein Autschn!
Davon abgesehen fühle ich mich hier in der Region sauwohl.
Schönes WE für den Ex-Hofbauern
Grüßle, Margarete
Native Excel?
05.09.2016 15:07:02
Michael
Hi zusammen,
@Margarete: schön, daß Dir Case geholfen hat: ich war am Wochenende schwer beschäftigt...
@Case: welches N.E. verwendest Du? Ich hatte vor einiger Zeit schon mal in Sachen Pascal herumgesucht, insbesondere die "Free"-Version, weil Delphi mittlerweile unerschwinglich ist... Aber so recht was wirklich Schnelles und Griffiges hatte ich nicht gefunden: das Einzige, was interessant klang, schien nicht mehr verfügbar zu sein (div. broken links).
Das Schöne an Pascal ist halt (im Vergleich zu .net), daß man EINE .exe hat und Ende.
Schöne Grüße,
Michael
AW: Native Excel?
05.09.2016 18:24:21
MB12
Hallo Michael,
ist doch klar, das Leben kann nicht nur aus Herber bestehen :-)
Übrigens: Bei Fragen zu deinem aktuellen Lernprojekt könnte ich mich evt. ab und zu revanchieren. Hast ja meine Kontaktdaten.
Gruß, Margarete
AW: Native Excel?
06.09.2016 07:00:27
Case
Hallo Michael, :-)
ich arbeite seit einigen Jahren mit...
NikaSoft...
Bin damit sehr zufrieden. ;-)
Servus
Case

AW: Native Excel?
06.09.2016 15:23:41
Michael
Hallo Case,
klar, das hatte ich schon gefunden; mich hat nur interessiert, ob Du die .net oder die Delphi-Variante verwendest bzw. im letzteren Fall, ob das mit Free Pascal auch brav rennt: aber schlimmstenfalls sende ich den Jungs mal ne mail.
Danke & gute Zeit,
Michael

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige