Anzeige
Archiv - Navigation
1888to1892
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

Stappelverarbeitung

Stappelverarbeitung
15.07.2022 21:01:46
Alex
Hallo Freunde!
Ich kämpfe schon seit Wochen (kein Profi, „Selbstbeibringer“ halt) mit einem Problem.
Ich habe ein Sammelordner. In diesem liegen einzelne Projektordner (beliebige Anzahl, beliebige Namen). In den Projektordnern liegen dazugehörige .xlsm-Dateien (beliebige Name, id-Endung von 1 bis 5).
Sammelordner
Projekt_1
Basis1_id1.xlsm
Basis1_id2.xlsm
…
Projekt_2
Basis2_id1.xlsm
Basis2_id2.xlsm
…
Projekt_3
Basis3_id1.xlsm
Basis3_id2.xlsm
…
Projekt_...
Basis_...
Ich möchte In der Datei Basis1_id1.xlsm ein Button erstellen, welche mir die Zahl aus Tabelle1 und Zelle A1 ausliest und 1 dazu addiert (so, dass z.B aus Ursprungswert 1 – 2 wird) und A1 überschreibt. Danach sollen alle xlsm-Dateien mit Endung „id1“, welche im Sammelordner und Unterordern liegen nacheinander geöffnet werden, gleiche Operation durchgeführt werden (Wert in A1-Zelle), gespeichert und geschlossen werden. Ausgangsmappe Basis1_id1 bleibt offen.
Soweit mit Onkel Internet habe ich es hinbekommen, so lange der Ordner „Projekt_1“ außerhalb des Sammelordners liegt.
Das Ziel ist, damit „Projekt_1“ sich, wie auch alle anderen Projekte im Sammelordner befindet.
Wenn es der Fall ist, erhalte ich immer eine Meldung:
Userbild
Auf „Ja“ zu drucken ist keine Option. Wenn ich auf „Nein“ gehe bekomme ich folgende Meldung:
Userbild
Wie erreiche ich, dass „Basis1_id1“ nicht wieder geöffnet wird (anders gesagt übersprungen wird).
Parallel eine Frage: wie kriege ich das hin, dass nur die Files mit Endung „id1“ bearbeitet werden?
Hier ist mein Code:

Sub Stappelverarbeitung_von_Innen()
'Basisdokument
Range("A1").Value = Range("A1").Value + 1
'Wetere Dokumente
Const sSourcePath As String = "C:\Users\-\aL\surv-aL\9-Konfig_Baustelle\Tests\Stappelverarbeitung\"
Dim fld, file
Dim fso As Object
Dim objFld As Object
Dim objSubFld As Object
Dim objFiles As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set objFld = fso.getfolder(sSourcePath)
Set objSubFld = objFld.SubFolders
For Each fld In objSubFld
Set objFiles = fld.Files
For Each file In objFiles
Application.Workbooks.Open(file.Path).Activate
'Operation
ActiveWorkbook.Sheets("Tabelle1").Range("A1").Value = ActiveWorkbook.Sheets("Tabelle1").Range("A1").Value + 1
ActiveWorkbook.Close SaveChanges:=True
Next
Next
End Sub
Ich bitte Euch ganz herzlich um die Hilfe!)
Mit recht herzlichen Gruß an alle
Alex

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Stappelverarbeitung
15.07.2022 21:10:42
Alex
"ein Button erstellen" heiß "Der Button ist schon da", nur der Script fehlt...
AW: Stappelverarbeitung
15.07.2022 21:41:35
ralf_b
seit Wochen? und dir ist nicht aufgefallen das Excel dir mitteilt das es keine zwei Dateien mit dem selben Namen zur gleichen Zeit geöffnet haben möchte?
Ändere den Dateinamen der Datei mit dem Code so das er nicht zweimal vorkommt. Und stelle sicher das die Datei mit dem Code nicht im durchsuchten Ordner liegt.

AW: Stappelverarbeitung
16.07.2022 06:14:43
Alex
Danke für Dein Antwort. "Seit Wochen" war natürlich ein rhetorischer Ausdruck. Klar, weiß ich, dass keine zwei Dateien mit dem selben Namen zur gleichen Zeit nicht geöffnet werden kann. Die Frage war, wie kann ich dem Excel sagen: "Öffne genau diese Datei nicht (weil sie eben schon geöffnet ist...), obwohl sie in angegebenen Verzeichniss liegt, geh zu nächsten Datei". Name der Quelldatei zu ändern ist keine Option. Die Quelldatei muss (!) in durchgesuchten Verzeichniss liegen. Es ist ja ein Teil der ganzen Sammlung.
Gruß
Alex
Anzeige
AW: Stappelverarbeitung
16.07.2022 11:26:38
ralf_b

 For Each file In objFiles
If file.Name  ThisWorkbook.Name Then
Application.Workbooks.Open(file.Path).Activate
'Operation
ActiveWorkbook.Sheets("Tabelle1").Range("A1").Value = ActiveWorkbook.Sheets("Tabelle1").Range("A1").Value + 1
ActiveWorkbook.Close SaveChanges:=True
End If
Next

AW: Stappelverarbeitung
17.07.2022 09:03:59
Alex
If file.Name ThisWorkbook.Name Then
...
End If
Schön wäre es, wenn diesen Script funktionierte.
Mit diesem Script habe ich schon vorher versucht. Kein Erfolg. Erstens gibt es die Meldung "400"
Userbild
Zweitens werden die restliche Dateien gar nicht geöffnet.
Gruß Alex
Anzeige
AW: Stappelverarbeitung
17.07.2022 18:02:38
ralf_b
dann probiere mal dies. Aber nur auf ner Kopie deiner Datenstruktur.

Sub Stappelverarbeitung_von_Innen()
Const sSourcePath As String = "C:\Users\-\aL\surv-aL\9-Konfig_Baustelle\Tests\Stappelverarbeitung\"
Dim fld, Name1 As String, Name2 As String
Dim bolUmbenannt As Boolean
Dim wbk As Workbook
Dim fso As Object
Dim objFld As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set objFld = fso.GetFolder(sSourcePath)
Application.ScreenUpdating = False
'Basisdokument
With ThisWorkbook.Sheets("Tabelle1").Range("A1")
' .Value = .Value + 1 wegen test auskommentiert
End With
For Each fld In objFld.SubFolders
Name1 = Dir(fld.Path & "\*id1.xlsm")    '
'Debug.Print fld.Path 'zum testen
If Name1  "" Then
'Debug.Print fld.Path & "\" & Name1 'zum testen
Set wbk = Application.Workbooks.Open(fld.Path & "\" & Name1) 'datei öffnen
If wbk Is Nothing Then                                    'wenn öffnen nicht geht weil doppelt
Name2 = Replace(Name1, "_id1", "_id1xx")
Name fld.Path & "\" & Name1 As fld.Path & "\" & Name2 'dann umbenennen
bolUmbenannt = True
Set wbk = Application.Workbooks.Open(fld.Path & "\" & Name2) 'und neu öffnen
If wbk Is Nothing Then 'wenns wieder nicht geht, fehleranzeige und Ausgabe in direktfenser
MsgBox "Datei kann nicht geöffnet werden"
'Debug.Print "Fehler in Datei : '" & fld.Path & "\" & Name1 & "'"
'  Name fld.Path & "\" & Name2 As fld.Path & "\" & Name1
GoTo skip
End If
End If
With wbk
With .Sheets("Tabelle1").Range("A1")
.Value = .Value + 1
'Debug.Print ".Value :" & .Value 'zum testen
End With
.Close SaveChanges:=True
If bolUmbenannt Then Name fld.Path & "\" & Name2 As fld.Path & "\" & Name1: bolUmbenannt = False
End With
End If
skip:
Next
End Sub

Anzeige
AW: Stappelverarbeitung
18.07.2022 16:16:21
Alex
Ausprobiert. Zuerst kommt die Meldung bei der Datei "Basis1_id1": "Nicht genügend Arbeitsspeicher".
Userbild
Nach OK-Betätigung wird Excel geschlossen.
In der restlichen Dateien gibt es leider keine Veränderung.
Gruß, Alex
AW: Stappelverarbeitung
18.07.2022 16:18:12
Alex
...ich bin aber trotzdem beeindruckt und dankbar.
AW: Stappelverarbeitung
18.07.2022 17:31:40
ralf_b
tchja was soll ich da sagen. Bei mir gibts den Fehler nicht. Ich hab ja auch deine Ordnerstruktur nicht.
Für den Stapelfehler habe ich erstmal keine Erklärung.
AW: Stappelverarbeitung
19.07.2022 07:35:37
Alex
Anbei ist Sammelordnel mit angelegten Testdateien. Der Pfad im Script habe ich gekürzt auf "C:\Users\-\Desktop\Stappelverarbeitung\" um überflussige Orner zu den Testzwecke zu Vermeiden. Also jezt soll der Sammelordner einfach auf dem Desktop liegen.
https://www.herber.de/bbs/user/154240.zip
Gruß, Alex
Anzeige
AW: Stappelverarbeitung
20.07.2022 09:10:43
Alex
Die Fehlermeldung "Nicht genügend Arbeitsspeicher..." kam dann, als ich versuchte von der Datei "Basis1_id1" im Ordner Projekt1 den Script zu starten. Ich habe vorher nicht verstanden, dass die alle Dateien, welche in einzelnen Projektordnern liegen, von der (einzige) Datei, welche außerhalb der Projektordnern liegt, gesteuert werden soll. So funktioniert es prima!
Das ist zwar nicht so, wie ich mir von Anfang an vorgestellt habe, aber so eine Aufbau von Sammelordner und Dateien bringt unerwartet einige Vorteile im Bezug auf ganzen Projekt. Und ich kann dein Vorschlag für weitere Entwicklung ganz gut denke ich nutzen.
Echt super! Besten Dank, und wie ich schon sagte, ich bin tief beeindruckt!
P.S. Es wäre trotzdem interessand, ob es möglich ist, direkt von einer aus Dateien in belibigem Projektordner zu steuern ohne extra Datei außerhalb der Projektordnern.
Anzeige
AW: Stappelverarbeitung
21.07.2022 10:16:00
Alex
DAS FUNKTIONIERT!!!)) HUMMER!
AW: Stappelverarbeitung
18.07.2022 17:38:46
Daniel
Hi
die Prüfung, ob eine Datei schon geöffnet ist, kannst du so machen:

dim wb as workbook
for each wb in Application.Workbooks
if wb.Name = Dateiname then Exit for
Next
If wb is nothing then
hier der Code, der laufen muss wenn die Datei nicht geöffnet ist
Else
hier der Code für den Fall, dass die Datei bereits geöffnet ist
End if
Gruß Daniel
AW: Stappelverarbeitung
19.07.2022 12:31:22
Alex
Danke Daniel,
ich probiere heute aus, und berichte, ob es bei mir geklappt hat.
Gruß Alex
Anzeige
AW: Stappelverarbeitung
19.07.2022 16:26:45
Alex
Hallo Daniel,
ich habe versucht Dein code und mein Ursprungscode zu vereinigen, so, wie mein Kentissvermögen mir erlaubt:

Sub Stappelverarbeitung_von_Innen_2()
Const sSourcePath As String = "C:\Users\-\aL\surv-aL\9-Konfig_Baustelle\Tests\Stappelverarbeitung\"
Dim fld, file
Dim fso As Object
Dim objFld As Object
Dim objSubFld As Object
Dim objFiles As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set objFld = fso.getfolder(sSourcePath)
Set objSubFld = objFld.SubFolders
For Each fld In objSubFld
Set objFiles = fld.Files
For Each file In objFiles
Dim wb As Workbook
Dim Dateiname As String
Dateiname = ThisWorkbook.Name
For Each wb In Application.Workbooks
If wb.Name = Dateiname Then Exit For
Next
If wb Is Nothing Then
'hier der Code, der laufen muss wenn die Datei nicht geöffnet ist
Application.wb.Open(file.Path).Activate
'Operation
wb.Sheets("Tabelle1").Range("A1").Value = wb.Sheets("Tabelle1").Range("A1").Value + 1
wb.Close SaveChanges:=True
Else
'hier der Code für den Fall, dass die Datei bereits geöffnet ist
ThisWorkbook.Range("A1").Value = Range("A1").Value + 1
End If
Next
Next
End Sub
...und irgendwas stimmt nicht. Aber kein Wunder! So fit in VBA bin ich nicht.
Es kommt eine Meldung:
Userbild
Gruß
Alex
P.S. Wenn Du mein Testverzechniss mit Dateien brauchst, kann ich es organisieren.
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige