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

VBA xls in xlsx

VBA xls in xlsx
27.02.2020 15:37:42
Maik
Hallo ich brauche wiedermal eure Hilfe.
Wir haben ein Programm was uns den Stundenplan in excel xls ausgibt.
Leider kann man das Programm nicht umstellen und ein Update ist nicht zu erwarten.
Wir haben also einen Ordner mit ca 100 xls Dateien die ich gerne via VBA wenn das geht in xlsx umwandeln
am besten wäre auch wenn er die alten xls dateien gleich löscht.
Grund das beim öffnen der xls Dateien immer fehler kommen die dann immer mühselig weggeklickt werden müssen.
Das wollen die user aber nicht.
Ich habe dazu auch schon scripte im Netz gefunden leider funktionieren die nicht
Egal welches skript der Fehler kommt immer bei:
Die Dateien liegen in C:\test\
Set xlFile = Workbooks.Open(objFile.Path, , True)
Beispiel:
Sub ChangeFileFormat()
Dim strCurrentFileExt   As String
Dim strNewFileExt       As String
Dim objFSO              As Object
Dim objFolder           As Object
Dim objFile             As Object
Dim xlFile              As Workbook
Dim strNewName          As String
Dim strFolderPath       As String
strCurrentFileExt = ".xls"
strNewFileExt = ".xlsx"
strFolderPath = "C:\test\"
If Right(strFolderPath, 1)  "\" Then
strFolderPath = strFolderPath & "\"
End If
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.getfolder(strFolderPath)
For Each objFile In objFolder.Files
strNewName = objFile.Name
If Right(strNewName, Len(strCurrentFileExt)) = strCurrentFileExt Then
Set xlFile = Workbooks.Open(objFile.Path, , True)
strNewName = Replace(strNewName, strCurrentFileExt, strNewFileExt)
Application.DisplayAlerts = False
Select Case strNewFileExt
Case ".xlsx"
xlFile.SaveAs strFolderPath & strNewName, XlFileFormat.xlOpenXMLWorkbook
Case ".xlsm"
xlFile.SaveAs strFolderPath & strNewName, XlFileFormat. _
xlOpenXMLWorkbookMacroEnabled
End Select
xlFile.Close
Application.DisplayAlerts = True
End If
Next objFile
ClearMemory:
strCurrentFileExt = vbNullString
strNewFileExt = vbNullString
Set objFSO = Nothing
Set objFolder = Nothing
Set objFile = Nothing
Set xlFile = Nothing
strNewName = vbNullString
strFolderPath = vbNullString
End Sub

25
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA xls in xlsx/xlsm
27.02.2020 15:58:57
Fennek
Hallo,
bei der Umwandlung in xlsx gehen die Makro's verloren, ist das so geplant? (oder einfach als xlsm speicher)
mfg
(die "Schulweisheit" sagt, dass eine xlsx keine Makro's enthalten kann, es sei denn man legt es darauf an)
AW: VBA xls in xlsx
27.02.2020 15:59:38
Nepumuk
Hallo Maik,
teste mal:
Option Explicit

Public Sub ChangeFileFormat()
    
    Const FOLDER_PATH As String = "C:\test\"
    
    Dim strFilename As String
    Dim enmAutomationSecurity As MsoAutomationSecurity
    Dim objWorkbook As Workbook
    
    With Application
        .Calculation = xlCalculationManual
        .DisplayAlerts = False
        enmAutomationSecurity = .AutomationSecurity
        .AutomationSecurity = msoAutomationSecurityForceDisable
        .EnableEvents = False
        .ScreenUpdating = False
    End With
    
    strFilename = Dir$(FOLDER_PATH & "*.xls")
    
    Do Until strFilename = vbNullString
        
        If LCase$(Right$(strFilename, 4)) = ".xls" Then
            
            Set objWorkbook = Workbooks.Open(Filename:=FOLDER_PATH & strFilename)
            
            strFilename = Left$(strFilename, Len(strFilename) - 3) & "xlsx"
            
            Call objWorkbook.SaveAs(Filename:=FOLDER_PATH & strFilename, FileFormat:=xlOpenXMLWorkbook)
            
            Call objWorkbook.Close(SaveChanges:=False)
            
        End If
        
        strFilename = Dir$
        
    Loop
    
    Set objWorkbook = Nothing
    
    With Application
        .Calculation = xlCalculationAutomatic
        .DisplayAlerts = True
        .AutomationSecurity = enmAutomationSecurity
        .EnableEvents = True
        .ScreenUpdating = True
    End With
End Sub

Gruß
Nepumuk
Anzeige
AW: VBA xls in xlsx
27.02.2020 19:46:27
Hochheim
Guten Tag und schon mal vielen Dank wiedermal.
Zu hause funktioniert das natürlich wieder mal super.
Aber hier bekomme ich auch keine Fehlermeldung bei einer xls
Auf Arbeit schon daher muss ich das noch testen.
Wird bei dem Script die Dateiendung nur umgeschrieben oder richtig neu gespeichert?
Wenn ich auf Arbeit die Datei händisch einfach auf xlsx änder bringt er trotzdem eine Fehlermeldung beim öffnen. Die man Natürlich wegklicken kann. Wenn ich die Datei aber öffne und speichern unter auf xlsx speicher ist bei nächsten öffnen alles super.
Zu der Frage mit den Makros.
In der excel sind keine drin nur text und Tabellen Halt ein Stundenplan.
Ach so kann man dort noch mit anhängen das alle xls nach dem ändern gelöscht werden ?
Anzeige
AW: VBA xls in xlsx
27.02.2020 19:53:24
Nepumuk
Hallo Maik,
mit löschen der Ursprungsdatei:
Option Explicit

Public Sub ChangeFileFormat()
    
    Const FOLDER_PATH As String = "C:\test\"
    
    Dim strFilename As String, strOldName As String
    Dim enmAutomationSecurity As MsoAutomationSecurity
    Dim objWorkbook As Workbook
    
    With Application
        .Calculation = xlCalculationManual
        .DisplayAlerts = False
        enmAutomationSecurity = .AutomationSecurity
        .AutomationSecurity = msoAutomationSecurityForceDisable
        .EnableEvents = False
        .ScreenUpdating = False
    End With
    
    strFilename = Dir$(FOLDER_PATH & "*.xls")
    
    Do Until strFilename = vbNullString
        
        If LCase$(Right$(strFilename, 4)) = ".xls" Then
            
            strOldName = FOLDER_PATH & strFilename
            
            Set objWorkbook = Workbooks.Open(Filename:=strOldName)
            
            strFilename = Left$(strFilename, Len(strFilename) - 3) & "xlsx"
            
            Call objWorkbook.SaveAs(Filename:=FOLDER_PATH & strFilename, FileFormat:=xlOpenXMLWorkbook)
            
            Call objWorkbook.Close(SaveChanges:=False)
            
            Call Kill(PathName:=strOldName)
            
        End If
        
        strFilename = Dir$
        
    Loop
    
    Set objWorkbook = Nothing
    
    With Application
        .Calculation = xlCalculationAutomatic
        .DisplayAlerts = True
        .AutomationSecurity = enmAutomationSecurity
        .EnableEvents = True
        .ScreenUpdating = True
    End With
End Sub

Gruß
Nepumuk
Anzeige
AW: VBA xls in xlsx
28.02.2020 06:54:43
Maik
So ich hab das mal auf Arbeit getestet.
So bald der Ordner leer ist passiert nichts.
Er läuft durch gibt aber keine Fehlermeldung.
Sobald ich xls Dateien reinlege kommt Debuggen Laufzeitfehler 1004
Set objWorkbook = Workbooks.Open(Filename:=strOldName)
AW: VBA xls in xlsx
28.02.2020 08:30:37
Maik
Es liegt daran das er die Datei als beschädigt erkennt.
Kann man das umgehen oder vor dem ändern auf xlsx die Datei Reparieren?
Wie gesagt es sind immer ganz viele Stundenpläne die am tag ausgegeben werden.
Das Problem ist das Programm dieses ist aber nicht änderbar.
AW: VBA xls in xlsx
28.02.2020 08:38:09
Nepumuk
Hallo Maik,
teste mal so:
Set objWorkbook = Workbooks.Open(Filename:=strOldName, CorruptLoad:=xlRepairFile)
Gruß
Nepumuk
Anzeige
AW: VBA xls in xlsx
28.02.2020 10:23:00
Maik
Das hat super Funktioniert.
Jetzt die nächste Aufgabe Sorry schon mal für die vielen Anfragen.
Aber wenn nicht in der Materie steckt versucht man sich ja zu helfen.
Meine Dateien haben z.B. den Namen
"Kurs 104-21-19_20200224bis20200301.xlsx
ist es möglich die Dateien also alle nicht nur eine umzubenennen so das die ersten 5 Zeichen und die letzten 20 Zeichen gelöscht werden. So das am Ende "104-21-19.xlsx" da steht?
Das ganze habe ich denn noch mit Dozenten und Fächer. Aber das würde sich ja denn mit kopieren und angleichen des scriptes lösen lassen.
AW: VBA xls in xlsx
28.02.2020 10:34:55
Nepumuk
Hallo Maik,
so:
Option Explicit

Public Sub ChangeFileFormat()
    
    Const FOLDER_PATH As String = "H:\test\" 'Anpassen !!!
    
    Dim strFilename As String, strOldName As String
    Dim enmAutomationSecurity As MsoAutomationSecurity
    Dim objWorkbook As Workbook
    
    With Application
        .Calculation = xlCalculationManual
        .DisplayAlerts = False
        enmAutomationSecurity = .AutomationSecurity
        .AutomationSecurity = msoAutomationSecurityForceDisable
        .EnableEvents = False
        .ScreenUpdating = False
    End With
    
    strFilename = Dir$(FOLDER_PATH & "*.xls")
    
    Do Until strFilename = vbNullString
        
        If LCase$(Right$(strFilename, 4)) = ".xls" Then
            
            strOldName = FOLDER_PATH & strFilename
            
            Set objWorkbook = Workbooks.Open(Filename:=strOldName, CorruptLoad:=xlRepairFile)
            
            strFilename = Mid$(Split(strFilename, "_")(0), 6) & ".xlsx"
            
            Call objWorkbook.SaveAs(Filename:=FOLDER_PATH & strFilename, FileFormat:=xlOpenXMLWorkbook)
            
            Call objWorkbook.Close(SaveChanges:=False)
            
            Call Kill(PathName:=strOldName)
            
        End If
        
        strFilename = Dir$
        
    Loop
    
    Set objWorkbook = Nothing
    
    With Application
        .Calculation = xlCalculationAutomatic
        .DisplayAlerts = True
        .AutomationSecurity = enmAutomationSecurity
        .EnableEvents = True
        .ScreenUpdating = True
    End With
End Sub

Gruß
Nepumuk
Anzeige
AW: VBA xls in xlsx
28.02.2020 11:34:09
Maik
Wiedermal Oberklasse
Wie ich schon sagte habe ich noch Dozenten und Räume.
Die sind jeweils in anderen Ordnern.
Somit würde ich das script kopieren und nacheinander in den Ordnern ablaufen lassen.
Wo finde ich die stelle die ich angleichen muss um jetzt vorne mehr oder weniger zeichen zu löschen.
Dozent_Maik, Hochheim - MaikH_20200224bis20200301.xlsx
da müssen jetzt vorne 7 Zeichen weg und am Ende bleibt es wie gehabt 20 Zeichen die weg müssen oder wie du denke ich mal geschrieben hast alles ab einschließlich "_"
Das Problem bei Dozent wie auch gleich bei Raum ist das hier schon am Anfang hinter dem Namen ein _ mitgegeben wird.
Raum_201.1.01 UMSA_20200224bis20200301.xlsx
Hier das gleiche Problem das hinter Raum wohl der erste _ ist
sonst ist es wie bei Kurse auch 5 Zeichen vorne und 20 Zeichen am ende.
Also bräuchte ich 3 Scripte von dir Bitte :-) oder du sagst mir mal wo ich was ändere damit es klappt.
Danach sollen die Dateien noch mehrfach kopiert werden aber ich denke mal das gibt mir das Internet auch her.
Das Programm dahingehend nicht umgeschrieben werden das die Zeichensetzung anders ist.
Anzeige
AW: VBA xls in xlsx
28.02.2020 12:02:42
Maik
Also auch bei kurse ist ein _ nach Kurse.
ich habe das bei meiner tesdatei händisch geändert.
Es ist also immer Kürzel_Name_Datum.xslx
Kürzel und Datum muss immer weg.
Raum_203.3.1_Datum.xlsx
Dozent_Maik usw _Datum.xlsx
Kurs_301-20-21_Datum.xlsx
schön wäre wenn du in dem Script ein Kommentar hinterlässt was ich wo ändere um es anzupassen.
AW: VBA xls in xlsx
29.02.2020 08:48:24
Nepumuk
Hallo Maik,
ich kann dir nicht ganz folgen. Kannst du eine Tabelle hochladen mit ein paar Beispielnamen in Ist und Soll?
Gruß
Nepumuk
AW: VBA xls in xlsx
29.02.2020 10:24:57
Hochheim
Ich habe mal eine excel angehängt.
Ich hoffe es ist ersichtlich was es werden soll.
Für einen der es schreibt ist es immer einfach zu verstehen.
Wir haben das vorher auch so gemacht wie in der Excel abfolge. Aber mit einer batch und einem Frendprogramm zum Dateien umbenennen.
Problem: Die Dateien sind immer noch xls und kaputt. Jeder Dozent beschwert sich immer 4 mal auf ja klicken zu müssen um die Datei zu Reparieren und zu öffnen.
Das große Problem ist aber das wir bald keine Berechtigungen mehr haben fremde exe Dateien auszuführen somit fällt das Umbennungsprogramm weg.
Daher mein Anliegen an ein VBA Script.
Es wäre schön wenn du mal ein Paar Kommentare in den Zeilen mit reinschreibst damit ich ein bisschen verstehe was da passiert. Ich möchte mich etwas näher mit dem VBA beschäftigen.
https://www.herber.de/bbs/user/135534.xlsx
Anzeige
AW: VBA xls in xlsx
29.02.2020 12:50:18
Nepumuk
Hallo Maik,
teste mal:
Option Explicit

Public Sub ChangeFileFormat()
    
    Dim strFileName As String, strOldName As String, strNewName As String
    Dim strFolder As String
    Dim vntItem As Variant
    Dim enmAutomationSecurity As MsoAutomationSecurity
    Dim objWorkbook As Workbook
    
    'Sicherungsordner leeren
    Call Kill(PathName:="C:\Sicherung\Kurse\" & "*.xls")
    Call Kill(PathName:="C:\Sicherung\Dozenten\" & "*.xls")
    Call Kill(PathName:="C:\Sicherung\Räume\" & "*.xls")
    
    'Neue Dateien in die Sicherungsordner kopieren
    Call CopyFiles("C:\test\Kurse\", "C:\Sicherung\Kurse\")
    Call CopyFiles("C:\test\Dozenten\", "C:\Sicherung\Dozenten\")
    Call CopyFiles("C:\test\Räume\", "C:\Sicherung\Räume\")
    
    With Application
        .Calculation = xlCalculationManual 'Berechnung manuell
        .DisplayAlerts = False 'Meldungen aus
        enmAutomationSecurity = .AutomationSecurity 'Sicherheitseinstellung auslesen
        .AutomationSecurity = msoAutomationSecurityForceDisable 'Sicherheitseinstellung Hoch
        .EnableEvents = False 'Automatische Events aus
        .ScreenUpdating = False 'Bildschirmaktualisierung aus
    End With
    
    'Schleife über die Ordner
    For Each vntItem In Array("C:\test\Kurse\", "C:\test\Dozenten\", "C:\test\Räume\")
        
        'Schleifenvariable übergeben
        strFolder = vntItem
        
        'Erste xls - Datei suchen
        strFileName = Dir$(strFolder & "*.xls")
        
        'So lange weitersuchen bis keine Datei mehr gefunden wird
        Do Until strFileName = vbNullString
            
            'Wenn es eine .xls - Datei ist
            If LCase$(Right$(strFileName, 4)) = ".xls" Then
                
                'Ursprungspfad merken
                strOldName = strFolder & strFileName
                
                'Neuen Pfad erzeugen aus dem Namensteil zwischen den Unterstrichen
                strNewName = strFolder & Split(strFileName, "_")(1) & ".xlsx"
                
                'Datei öffnen und dabei reparieren
                Set objWorkbook = Workbooks.Open(Filename:=strOldName, CorruptLoad:=xlRepairFile)
                
                'Datei im neuen Format speichern
                Call objWorkbook.SaveAs(Filename:=strNewName, FileFormat:=xlOpenXMLWorkbook)
                
                'Datei schließen
                Call objWorkbook.Close(SaveChanges:=False)
                
                'Ursprungsdatei löschen
                Call Kill(PathName:=strOldName)
                
            End If
            
            'Nächste Datei suchen
            strFileName = Dir$
            
        Loop
    Next
    
    'Objekt zurücksetzen
    Set objWorkbook = Nothing
    
    'Konvertierte Dateien auf Server verschieben
    Call MoveFiles("C:\test\Kurse\", "W:\test\Kurse\")
    Call MoveFiles("C:\test\Dozenten\", "W:\test\Kurse\")
    Call MoveFiles("C:\test\Räume\", "W:\test\Kurse\")
    
    With Application
        .Calculation = xlCalculationAutomatic 'Berechnung automatisch
        .DisplayAlerts = True 'Meldungen ein
        .AutomationSecurity = enmAutomationSecurity 'Sicherheitseinstellung auf ursprünglichen Wert
        .EnableEvents = True 'Automatische Events ein
        .ScreenUpdating = True 'Bildschirmaktualisierung ein
    End With
End Sub

Private Sub CopyFiles(ByVal pvstrSourceFolder As String, pvstrDestinationFolder As String)
    
    Dim strFileName As String
    
    strFileName = Dir$(pvstrSourceFolder & "*.*")
    
    Do Until strFileName = vbNullString
        
        Call FileCopy(Source:=pvstrSourceFolder & strFileName, _
            Destination:=pvstrDestinationFolder & strFileName)
        
        strFileName = Dir$
        
    Loop
End Sub

Private Sub MoveFiles(ByVal pvstrSourceFolder As String, pvstrDestinationFolder As String)
    
    Dim strFileName As String
    
    strFileName = Dir$(pvstrSourceFolder & "*.*")
    
    Do Until strFileName = vbNullString
        
        Name pvstrSourceFolder & strFileName As pvstrDestinationFolder & strFileName
        
        strFileName = Dir$
        
    Loop
End Sub

Gruß
Nepumuk
Anzeige
AW: VBA xls in xlsx
29.02.2020 16:07:03
Hochheim
Vielen Dank ich teste es Montag auf Arbeit.
Wie Funktioniert das mit dem Split befehl woher weiß er das er alles zwischen den Unterstrichen behalten muss und wie würde es aussehen wenn man sagt die ersten 5 weg und die letzten 5 Zeichen weg so als Beispiel?
AW: VBA xls in xlsx
29.02.2020 16:19:56
Nepumuk
Hallo Maik,
die Split-Funktion trennt einen String am angegebenen Zeichen in deinem Fall der Unterstrich (wird kein zeichen angegeben dann am Leerzeichen). Die Funktion gibt ein Null-basiertes Array zurück. Beispiel:
x = Split("AAA_BBB_CCC","_") ergibt:
x(0) = "AAA"
x(1) = "BBB"
X(2) = "CCC"

Also:
x = Split("AAA_BBB_CCC","_")(1) ergibt:
x = "BBB"
Jetzt klarer?
Gruß
Nepumuk
Anzeige
AW: VBA xls in xlsx
02.03.2020 10:23:25
Maik
Hallo,
funktioniert wunderbar. 1a Klasse
Das Split habe ich auch verstanden.
Jetzt haben die Laute natürlich Blut geleckt und wollen immer mehr.
Ich weiß zwar nicht ob das realisierbar ist aber nun kam die Frage auf ob man das auch mit einem Relativen Pfad machen kann. Das heißt ich habe 3 Abfragen wo ist das Hauptverzeichnis, dann wo ist das Sicherungsverzeichnis und wo ist das Serververzeichnis angebe. Geht das ?
Theopraktisch müssen das ja denn 9 Abfragen sein. Also Hauptverzeichnis Kurse/Dozenten/Räume usw.
Oder geht das auch nur mit den Oberverzeichnissen wenn die Ordner da drin gleich bleiben.
Das 2te ist ein wegklickbares Fenster am Ende wenn alles Fertig ist.
AW: VBA xls in xlsx
02.03.2020 14:54:45
Nepumuk
Hallo Maik,
ich speichere die Dateien nach deren Umwandlung direkt im Netzwerkpfad.
Ist das Ok?
Option Explicit

Public Sub ChangeFileFormat()
    
    Const FOLDER_NAMES = "Kurse\ Dozenten\ Räume\"
    
    Dim strFileName As String, strOldName As String, strNewName As String
    Dim strFolder As String
    Dim strSourceFolder As String, strSaveFolder As String, strTargetFolder As String
    Dim vntItem As Variant
    Dim enmAutomationSecurity As MsoAutomationSecurity
    Dim objWorkbook As Workbook, objFileDialog As FileDialog
    
    Set objFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
    
    With objFileDialog
        .AllowMultiSelect = False
        .InitialFileName = "C:\" 'Anpassen !!!
        .ButtonName = "OK"
        .Title = "Bitte den Quellordner der Dateien auswählen"
        .InitialView = msoFileDialogViewLargeIcons
        If .Show Then
            strSourceFolder = .SelectedItems(1) & "\"
        Else
            Set objFileDialog = Nothing
            Exit Sub
        End If
    End With
    
    With objFileDialog
        .AllowMultiSelect = False
        .InitialFileName = "C:\" 'Anpassen !!!
        .ButtonName = "OK"
        .Title = "Bitte den Sicherungsordner der Dateien auswählen"
        .InitialView = msoFileDialogViewLargeIcons
        If .Show Then
            strSaveFolder = .SelectedItems(1) & "\"
        Else
            Set objFileDialog = Nothing
            Exit Sub
        End If
    End With
    
    With objFileDialog
        .AllowMultiSelect = False
        .InitialFileName = "W:\" 'Anpassen !!!
        .ButtonName = "OK"
        .Title = "Bitte den Netzwerk der Dateien auswählen"
        .InitialView = msoFileDialogViewLargeIcons
        If .Show Then
            strTargetFolder = .SelectedItems(1) & "\"
        Else
            Set objFileDialog = Nothing
            Exit Sub
        End If
    End With
    
    Set objFileDialog = Nothing
    
    'Sicherungsordner leeren
    For Each vntItem In Split(FOLDER_NAMES)
        Call Kill(PathName:=strSaveFolder & vntItem & "*.*")
    Next
    
    'Neue Dateien in die Sicherungsordner kopieren
    For Each vntItem In Split(FOLDER_NAMES)
        Call CopyFiles(strSourceFolder & vntItem, strSaveFolder & vntItem)
    Next
    
    With Application
        .Calculation = xlCalculationManual 'Berechnung manuell
        .DisplayAlerts = False 'Meldungen aus
        enmAutomationSecurity = .AutomationSecurity 'Sicherheitseinstellung auslesen
        .AutomationSecurity = msoAutomationSecurityForceDisable 'Sicherheitseinstellung Hoch
        .EnableEvents = False 'Automatische Events aus
        .ScreenUpdating = False 'Bildschirmaktualisierung aus
    End With
    
    'Schleife über die Ordner
    For Each vntItem In Split(FOLDER_NAMES)
        
        'Schleifenvariable übergeben
        strFolder = strSourceFolder & vntItem
        
        'Erste xls - Datei suchen
        strFileName = Dir$(strFolder & "*.xls")
        
        'So lange weitersuchen bis keine Datei mehr gefunden wird
        Do Until strFileName = vbNullString
            
            'Wenn es eine .xls - Datei ist
            If LCase$(Right$(strFileName, 4)) = ".xls" Then
                
                'Ursprungspfad merken
                strOldName = strFolder & strFileName
                
                'Neuen Pfad erzeugen aus dem Namensteil zwischen den Unterstrichen
                strNewName = strTargetFolder & vntItem & Split(strFileName, "_")(1)
                
                'Datei öffnen und dabei reparieren
                Set objWorkbook = Workbooks.Open(Filename:=strOldName, CorruptLoad:=xlRepairFile)
                
                'Datei im neuen Format speichern
                Call objWorkbook.SaveAs(Filename:=strNewName, FileFormat:=xlOpenXMLWorkbook)
                
                'Datei schließen
                Call objWorkbook.Close(SaveChanges:=False)
                
                'Ursprungsdatei löschen
                Call Kill(PathName:=strOldName)
                
            End If
            
            'Nächste Datei suchen
            strFileName = Dir$
            
        Loop
    Next
    
    'Objekt zurücksetzen
    Set objWorkbook = Nothing
    
    With Application
        .Calculation = xlCalculationAutomatic 'Berechnung automatisch
        .DisplayAlerts = True 'Meldungen ein
        .AutomationSecurity = enmAutomationSecurity 'Sicherheitseinstellung auf ursprünglichen Wert
        .EnableEvents = True 'Automatische Events ein
        .ScreenUpdating = True 'Bildschirmaktualisierung ein
    End With
    
    Call MsgBox(Space$(10) & "Fertig" & Space$(10), vbInformation, "Info")
    
End Sub

Private Sub CopyFiles(ByVal pvstrSourceFolder As String, pvstrDestinationFolder As String)
    
    Dim strFileName As String
    
    strFileName = Dir$(pvstrSourceFolder & "*.*")
    
    Do Until strFileName = vbNullString
        
        Call FileCopy(Source:=pvstrSourceFolder & strFileName, _
            Destination:=pvstrDestinationFolder & strFileName)
        
        strFileName = Dir$
        
    Loop
End Sub

Private Sub MoveFiles(ByVal pvstrSourceFolder As String, pvstrDestinationFolder As String)
    
    Dim strFileName As String
    
    strFileName = Dir$(pvstrSourceFolder & "*.*")
    
    Do Until strFileName = vbNullString
        
        Name pvstrSourceFolder & strFileName As pvstrDestinationFolder & strFileName
        
        strFileName = Dir$
        
    Loop
End Sub

Gruß
Nepumuk
AW: VBA xls in xlsx
03.03.2020 07:02:57
Maik
Hallo und wieder mal besten Dank für die Umsetzung.
Leider funktioniert diese Version nicht so richtig.
Das Problem ist das er die Dateien rüber kopiert auf dem Server aber es jetzt immer die xlsx Dateien und zusätzlich noch eine INSP-Datei gibt.
Ich müsste jetzt schauen was überhaupt gemacht wird. Bei 200 Dateien pro Ordner ist das schwer nach zu vollzieren.
Mit dem Script davor hat es 29 min gedauert.
jetzt sind es nur noch 9 min.
Da muss also irgendwas fehlen.
AW: VBA xls in xlsx
03.03.2020 07:37:40
Maik
Ich glaube er hat irgendwie ein Problem mit dem Kopieren in den Ordnern wo noch was drin ist.
Ich denke mal das er das jetzt ersetzen soll. Nun habe ich mal eine Datei umbenannt also zwischen den Unterstrichen mal ein paar 1en hinzugefügt.
Nun habe ich die Datei auf dem Server 3 mal im Ordner. einmal Normal, dann mit den 1en und dann nochmal ohne Endung xlsx
Im Sicherungsordner sind jetzt 2 Dateien. Einmal Original und einmal mit den 1en.
Meine Explorer ist nach dem Ende also ca 9 min bestätigt mit dem OK Button immer noch wild am Arbeiten. Passieren tut aber nichts mehr.
Besser ist die alte Variante wenn das geht. Erst den Sicherungsordnerinhalt löschen dann kopieren.
Im Originalverzeichnis umwandeln dann Serverordnerinhalt löschen und aus dem Originalornder auf dem Server verschieben.
Es kann ja sein das Kurse umbenannt werden dann hätte man da immer Leichen drin die man nicht haben will.
AW: VBA xls in xlsx
03.03.2020 12:02:08
Nepumuk
Hallo Maik,
es sollen "nur" die übergeordneten Ordner ausgewählt werden.
Option Explicit

Public Sub ChangeFileFormat()
    
    Const FOLDER_NAMES = "Kurse\ Dozenten\ Räume\"
    
    Dim strFileName As String, strOldName As String, strNewName As String
    Dim strFolder As String
    Dim strSourceFolder As String, strSaveFolder As String, strTargetFolder As String
    Dim vntSubfoler As Variant
    Dim enmAutomationSecurity As MsoAutomationSecurity
    Dim objWorkbook As Workbook, objFileDialog As FileDialog
    
    Set objFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
    
    With objFileDialog
        .AllowMultiSelect = False
        .InitialFileName = "C:\" 'Anpassen !!!
        .ButtonName = "OK"
        .Title = "Bitte den Quellordner der Dateien auswählen"
        .InitialView = msoFileDialogViewLargeIcons
        If .Show Then
            strSourceFolder = .SelectedItems(1) & "\"
        Else
            Set objFileDialog = Nothing
            Exit Sub
        End If
    End With
    
    With objFileDialog
        .AllowMultiSelect = False
        .InitialFileName = "C:\" 'Anpassen !!!
        .ButtonName = "OK"
        .Title = "Bitte den Sicherungsordner der Dateien auswählen"
        .InitialView = msoFileDialogViewLargeIcons
        If .Show Then
            strSaveFolder = .SelectedItems(1) & "\"
        Else
            Set objFileDialog = Nothing
            Exit Sub
        End If
    End With
    
    With objFileDialog
        .AllowMultiSelect = False
        .InitialFileName = "W:\" 'Anpassen !!!
        .ButtonName = "OK"
        .Title = "Bitte den Netzwerkordner der Dateien auswählen"
        .InitialView = msoFileDialogViewLargeIcons
        If .Show Then
            strTargetFolder = .SelectedItems(1) & "\"
        Else
            Set objFileDialog = Nothing
            Exit Sub
        End If
    End With
    
    Set objFileDialog = Nothing
    
    With Application
        .Calculation = xlCalculationManual 'Berechnung manuell
        .DisplayAlerts = False 'Meldungen aus
        enmAutomationSecurity = .AutomationSecurity 'Sicherheitseinstellung auslesen
        .AutomationSecurity = msoAutomationSecurityForceDisable 'Sicherheitseinstellung Hoch
        .EnableEvents = False 'Automatische Events aus
        .ScreenUpdating = False 'Bildschirmaktualisierung aus
    End With
    
    'Schleife über die Unterordner
    For Each vntSubfoler In Split(FOLDER_NAMES)
        
        'Sicherungsordner leeren
        Call Kill(PathName:=strSaveFolder & vntSubfoler & "*.*")
        
        'Neue Dateien in die Sicherungsordner kopieren
        Call CopyFiles(strSourceFolder & vntSubfoler, strSaveFolder & vntSubfoler)
        
        'Schleifenvariable übergeben
        strFolder = strSourceFolder & vntSubfoler
        
        'Erste xls - Datei suchen
        strFileName = Dir$(strFolder & "*.xls")
        
        'So lange weitersuchen bis keine Datei mehr gefunden wird
        Do Until strFileName = vbNullString
            
            'Wenn es eine .xls - Datei ist
            If LCase$(Right$(strFileName, 4)) = ".xls" Then
                
                'Ursprungspfad merken
                strOldName = strFolder & strFileName
                
                'Neuen Pfad erzeugen aus dem Namensteil zwischen den Unterstrichen
                strNewName = strFolder & Split(strFileName, "_")(1) & ".xlsx"
                
                'Datei öffnen und dabei reparieren
                Set objWorkbook = Workbooks.Open(Filename:=strOldName, CorruptLoad:=xlRepairFile)
                
                'Datei im neuen Format speichern
                Call objWorkbook.SaveAs(Filename:=strNewName, FileFormat:=xlOpenXMLWorkbook)
                
                'Datei schließen
                Call objWorkbook.Close(SaveChanges:=False)
                
                'Ursprungsdatei löschen
                Call Kill(PathName:=strOldName)
                
            End If
            
            'Nächste Datei suchen
            strFileName = Dir$
            
        Loop
        
        'Konvertierte Dateien auf Server verschieben
        Call MoveFiles(strFolder, strTargetFolder)
        
    Next
    
    'Objekt zurücksetzen
    Set objWorkbook = Nothing
    
    With Application
        .Calculation = xlCalculationAutomatic 'Berechnung automatisch
        .DisplayAlerts = True 'Meldungen ein
        .AutomationSecurity = enmAutomationSecurity 'Sicherheitseinstellung auf ursprünglichen Wert
        .EnableEvents = True 'Automatische Events ein
        .ScreenUpdating = True 'Bildschirmaktualisierung ein
    End With
End Sub

Private Sub CopyFiles(ByVal pvstrSourceFolder As String, pvstrDestinationFolder As String)
    
    Dim strFileName As String
    
    strFileName = Dir$(pvstrSourceFolder & "*.*")
    
    Do Until strFileName = vbNullString
        
        Call FileCopy(Source:=pvstrSourceFolder & strFileName, _
            Destination:=pvstrDestinationFolder & strFileName)
        
        strFileName = Dir$
        
    Loop
End Sub

Private Sub MoveFiles(ByVal pvstrSourceFolder As String, pvstrDestinationFolder As String)
    
    Dim strFileName As String
    
    strFileName = Dir$(pvstrSourceFolder & "*.*")
    
    Do Until strFileName = vbNullString
        
        Name pvstrSourceFolder & strFileName As pvstrDestinationFolder & strFileName
        
        strFileName = Dir$
        
    Loop
End Sub

Gruß
Nepumuk
AW: VBA xls in xlsx
03.03.2020 12:14:57
Nepumuk
Hallo Maik,
damit du nicht in einen Fehler läufst wenn der Sicherungsordner leer ist:
'Sicherungsordner leeren
If Dir$(strSaveFolder & vntSubfoler & "*.*") <> vbNullString Then _
    Call Kill(PathName:=strSaveFolder & vntSubfoler & "*.*")

Gruß
Nepumuk
AW: VBA xls in xlsx
04.03.2020 06:43:27
Maik
Hallo Nepumuk,
mit dem Sicherungsordner klappt alles.
Beim verschieben auf dem Server gibt es Probleme.
Er legt alles in den übergeordneten Ordner.
Ich gebe ja den Serverordner an in der die Ordner Dozenten, Räume und Kurse sind
Er speichert jetzt alles in dem Serverordner.
Wenn ich mal so das script überfliege sehe ich aber nicht das er den Inhalt der untergeordneten Serverordner vorher löscht. ist das richtig ?
Am besten wäre es wie beim ersten Script.
Sicherungsordner Inhalt der Unterordner löschen.
Kopieren der Originaldaten aus den jeweiligen Unterordnern in der jeweiligen Sicherungsorndern.
Ändern der Dateien XLS in xlsx in den jeweiligen Ordnern.
Dann erst löschen der Inhalte von den Serverunterordnern.
Verschieben der xlsx in den Serverunterordnern.
Butten mit fertig zum OK klicken
Und das ganze mit Abfrage der Ordner.
AW: VBA xls in xlsx
04.03.2020 14:51:10
Nepumuk
Hallo Maik,
es ging aus deinem Datenflussplan nicht hervor, dass die Netzwerkordner geleert und dass es der Ordner auch Unterordner enthält. Ich hab das jetzt eingebaut:
Option Explicit

Public Sub ChangeFileFormat()
    
    Const FOLDER_NAMES = "Kurse\ Dozenten\ Räume\"
    
    Dim strFileName As String, strOldName As String, strNewName As String
    Dim strFolder As String
    Dim strSourceFolder As String, strSaveFolder As String, strTargetFolder As String
    Dim vntSubFoler As Variant
    Dim enmAutomationSecurity As MsoAutomationSecurity
    Dim objWorkbook As Workbook, objFileDialog As FileDialog
    
    Set objFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
    
    With objFileDialog
        .AllowMultiSelect = False
        .InitialFileName = "C:\" 'Anpassen !!!
        .ButtonName = "OK"
        .Title = "Bitte den Quellordner der Dateien auswählen"
        .InitialView = msoFileDialogViewLargeIcons
        If .Show Then
            strSourceFolder = .SelectedItems(1) & "\"
        Else
            Set objFileDialog = Nothing
            Exit Sub
        End If
    End With
    
    With objFileDialog
        .AllowMultiSelect = False
        .InitialFileName = "C:\" 'Anpassen !!!
        .ButtonName = "OK"
        .Title = "Bitte den Sicherungsordner der Dateien auswählen"
        .InitialView = msoFileDialogViewLargeIcons
        If .Show Then
            strSaveFolder = .SelectedItems(1) & "\"
        Else
            Set objFileDialog = Nothing
            Exit Sub
        End If
    End With
    
    With objFileDialog
        .AllowMultiSelect = False
        .InitialFileName = "W:\" 'Anpassen !!!
        .ButtonName = "OK"
        .Title = "Bitte den Netzwerkordner der Dateien auswählen"
        .InitialView = msoFileDialogViewLargeIcons
        If .Show Then
            strTargetFolder = .SelectedItems(1) & "\"
        Else
            Set objFileDialog = Nothing
            Exit Sub
        End If
    End With
    
    Set objFileDialog = Nothing
    
    With Application
        .Calculation = xlCalculationManual 'Berechnung manuell
        .DisplayAlerts = False 'Meldungen aus
        enmAutomationSecurity = .AutomationSecurity 'Sicherheitseinstellung auslesen
        .AutomationSecurity = msoAutomationSecurityForceDisable 'Sicherheitseinstellung Hoch
        .EnableEvents = False 'Automatische Events aus
        .ScreenUpdating = False 'Bildschirmaktualisierung aus
    End With
    
    'Schleife über die Unterordner
    For Each vntSubFoler In Split(FOLDER_NAMES)
        
        'Sicherungsordner leeren
        If Dir$(strSaveFolder & vntSubFoler & "*.*") <> vbNullString Then _
            Call Kill(PathName:=strSaveFolder & vntSubFoler & "*.*")
        
        'Neue Dateien in die Sicherungsordner kopieren
        Call CopyFiles(strSourceFolder & vntSubFoler, strSaveFolder & vntSubFoler)
        
        'Schleifenvariable übergeben
        strFolder = strSourceFolder & vntSubFoler
        
        'Erste xls - Datei suchen
        strFileName = Dir$(strFolder & "*.xls")
        
        'So lange weitersuchen bis keine Datei mehr gefunden wird
        Do Until strFileName = vbNullString
            
            'Wenn es eine .xls - Datei ist
            If LCase$(Right$(strFileName, 4)) = ".xls" Then
                
                'Ursprungspfad merken
                strOldName = strFolder & strFileName
                
                'Neuen Pfad erzeugen aus dem Namensteil zwischen den Unterstrichen
                strNewName = strFolder & Split(strFileName, "_")(1) & ".xlsx"
                
                'Datei öffnen und dabei reparieren
                Set objWorkbook = Workbooks.Open(Filename:=strOldName, CorruptLoad:=xlRepairFile)
                
                'Datei im neuen Format speichern
                Call objWorkbook.SaveAs(Filename:=strNewName, FileFormat:=xlOpenXMLWorkbook)
                
                'Datei schließen
                Call objWorkbook.Close(SaveChanges:=False)
                
                'Ursprungsdatei löschen
                Call Kill(PathName:=strOldName)
                
            End If
            
            'Nächste Datei suchen
            strFileName = Dir$
            
        Loop
        
        'Serverordner leeren
        If Dir$(strTargetFolder & vntSubFoler & "*.*") <> vbNullString Then _
            Call Kill(PathName:=strTargetFolder & vntSubFoler & "*.*")
        
        'Konvertierte Dateien auf Server verschieben
        Call MoveFiles(strFolder, strTargetFolder & vntSubFoler)
        
    Next
    
    'Objekt zurücksetzen
    Set objWorkbook = Nothing
    
    With Application
        .Calculation = xlCalculationAutomatic 'Berechnung automatisch
        .DisplayAlerts = True 'Meldungen ein
        .AutomationSecurity = enmAutomationSecurity 'Sicherheitseinstellung auf ursprünglichen Wert
        .EnableEvents = True 'Automatische Events ein
        .ScreenUpdating = True 'Bildschirmaktualisierung ein
    End With
End Sub

Private Sub CopyFiles(ByVal pvstrSourceFolder As String, pvstrDestinationFolder As String)
    
    Dim strFileName As String
    
    strFileName = Dir$(pvstrSourceFolder & "*.*")
    
    Do Until strFileName = vbNullString
        
        Call FileCopy(Source:=pvstrSourceFolder & strFileName, _
            Destination:=pvstrDestinationFolder & strFileName)
        
        strFileName = Dir$
        
    Loop
End Sub

Private Sub MoveFiles(ByVal pvstrSourceFolder As String, pvstrDestinationFolder As String)
    
    Dim strFileName As String
    
    strFileName = Dir$(pvstrSourceFolder & "*.*")
    
    Do Until strFileName = vbNullString
        
        Name pvstrSourceFolder & strFileName As pvstrDestinationFolder & strFileName
        
        strFileName = Dir$
        
    Loop
End Sub

Gruß
Nepumuk
AW: VBA xls in xlsx
10.03.2020 18:46:21
Hochheim
Hallo Nepumuk,
ich möchte mich im Namen unserer Belegschaft bedanken.
Die ersten scharfen Tests liefen super.
Nun können alle Lehrer die Stundenpläne ohne Fehlermeldung öffnen.
Besten Dank.

26 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige