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

Duplikate anhand Liste und bereinigen

Duplikate anhand Liste und bereinigen
19.10.2020 10:49:24
Blume
Hallo zusammen,
ich habe vor einiger Zeit ein herausragendes Makro bekommen:
Sub MA_Dateien_speichern()
Dim strName As String, varOrdner, varDateixlsm, varDateixlsx
Dim zeile As Long
Dim wkb As Workbook
Dim wkbMA As Workbook
Set wkb = ActiveWorkbook
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Bitte Ordner für zu erstellende Dateien auswählen/erstellen"
If .Show = -1 Then
varOrdner = .SelectedItems(1)
Else
Exit Sub
End If
End With
With wkb.Worksheets(8)
'Kürzel-Liste abarbeiten
For zeile = 5 To .Cells(.Rows.Count, 6).End(xlUp).Row 'startzeile ggf. anpassen.
strName = .Cells(zeile, 6).Text
varDateixlsm = varOrdner & Application.PathSeparator & strName & ".xlsm"
varDateixlsx = varOrdner & Application.PathSeparator & strName & ".xlsx"
If wkb.FileFormat = 52 Then 'xlOpenXMLTemplateMacroEnabled
'Datei ist Datei mit Makros
wkb.SaveCopyAs varDateixlsm
Set wkbMA = Application.Workbooks.Open(varDateixlsm)
With wkbMA.Worksheets(1)
.Range("D2").Value = strName
.Calculate
.Cells.Locked = True
.Protect Password:="Test"
End With
Application.DisplayAlerts = False
wkbMA.SaveAs varDateixlsx, FileFormat:=51
Application.DisplayAlerts = True
wkbMA.Close savechanges:=True
VBA.Kill varDateixlsm
Else
'Datei hat keine Makros
wkb.SaveCopyAs varDateixlsx
Set wkbMA = Application.Workbooks.Open(varDateixlsx)
With wkbMA.Worksheets(1)
.Range("D2").Value = strName
.Calculate
.Cells.Locked = True
.Protect Password:="Test"
End With
wkbMA.Save
wkbMA.Close savechanges:=True
End If
Next
End With
End Sub
Jetzt habe ich eine Frage zu einer Erweiterung.
Ist es möglich, dass man die Dateien wenn Sie nach den Kürzeln gesplittet bzw. dupliziert werden auch noch dazu in dem Worksheet "Protokoll" alle anderen Daten gelöscht werden, bis auf die Zeilen, wo Spalte C das gleiche Kürzel enthält wie in Worksheet "EIngabe" D". Damit würde man in den einzelnen Dateien viele sinnlose Zeilen sparen, was es für die Weiterverarbeitung vereinfachen würde. Ist so etwas möglich?

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Duplikate anhand Liste und bereinigen
20.10.2020 06:04:33
fcs
Hallo Blume,
versuche dein Glück mal mit folgender Anpassung.
LG
Franz
Sub MA_Dateien_speichern()
Dim strName As String, varOrdner, varDateixlsm, varDateixlsx
Dim Zeile As Long
Dim wkb As Workbook
Dim wkbMA As Workbook
Set wkb = ActiveWorkbook
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Bitte Ordner für zu erstellende Dateien auswählen/erstellen"
If .Show = -1 Then
varOrdner = .SelectedItems(1)
Else
Exit Sub
End If
End With
With wkb.Worksheets(8)
'Kürzel-Liste abarbeiten
For Zeile = 5 To .Cells(.Rows.Count, 6).End(xlUp).Row 'startzeile ggf. anpassen.
strName = .Cells(Zeile, 6).Text
varDateixlsm = varOrdner & Application.PathSeparator & strName & ".xlsm"
varDateixlsx = varOrdner & Application.PathSeparator & strName & ".xlsx"
If wkb.FileFormat = 52 Then 'xlOpenXMLTemplateMacroEnabled
'Datei ist Datei mit Makros
wkb.SaveCopyAs varDateixlsm
Set wkbMA = Application.Workbooks.Open(varDateixlsm)
With wkbMA.Worksheets(1)
.Range("D2").Value = strName
.Calculate
.Cells.Locked = True
.Protect Password:="Test"
End With
Call CleanUp_Protokoll(wks:=wkbMA.Worksheets("Protokoll"), strSuch:=strName)
Application.DisplayAlerts = False
wkbMA.SaveAs varDateixlsx, FileFormat:=51
Application.DisplayAlerts = True
wkbMA.Close savechanges:=True
VBA.Kill varDateixlsm
Else
'Datei hat keine Makros
wkb.SaveCopyAs varDateixlsx
Set wkbMA = Application.Workbooks.Open(varDateixlsx)
With wkbMA.Worksheets(1)
.Range("D2").Value = strName
.Calculate
.Cells.Locked = True
.Protect Password:="Test"
End With
Call CleanUp_Protokoll(wks:=wkbMA.Worksheets("Protokoll"), strSuch:=strName)
wkbMA.Save
wkbMA.Close savechanges:=True
End If
Next
End With
End Sub
Sub CleanUp_Protokoll(wks As Worksheet, ByVal strSuch As String)
Dim Zeile As Long, Zeile_1 As Long, Zeile_L As Long
Dim bolLoeschen As Boolean
Zeile_1 = 2 '2 als erste Zeile mit Name ggf. anpassen
Application.ScreenUpdating = False
With wks
Zeile_L = .Cells(.Rows.Count, 3).End(xlUp).Row
.Unprotect Paswsord:="Test"                    'erforderlich falls Blatt geschützt ist
'abweichende Namen in den Zellen in Spalte C löschen
For Zeile = Zeile_1 To Zeile_L
If .Cells(Zeile, 3)  strSuch Then
.Cells(Zeile, 3).ClearContents
bolLoeschen = True
End If
Next
If bolLoeschen = True Then
With .Range(.Cells(Zeile_1, 3), .Cells(Zeile_L, 3))
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete shift:=xlShiftUp
End With
End If
.Protect Password:="Test"                'erforderlich falls Blatt geschützt war
End With
Application.ScreenUpdating = True
End Sub

Anzeige
AW: Duplikate anhand Liste und bereinigen
20.10.2020 07:14:54
Blume
Halllo Franz,
vielen Dank für deine Hilf. Aktuell kommt noch Laufzeitfehler 91: Objektvariable oder With-Blockvariable nicht festgelegt. und der Debugger markiert das erste: With wkbMA.Worksheets(1)
Mir ist auch noch aufgefallen, dass dort, wo D2 zum ersten mal angesprochen wird, wahrscheinlich der Blattschutz aufgehoben werden muss, oder?
Könntest du mir hier nochmal helfen?
AW: Duplikate anhand Liste und bereinigen
20.10.2020 10:19:49
fcs
Hallo Blume,
die Fehlermeldung kann ich nicht nachvollziehen.
Wüsste auch nicht warum die her auftreten sollte.
Bei mir hat es an einem einfachen Datei-Nachbau ohne Probleme funktioniert.
Die Unprotect-Zeile hättest du aber auch mal selber einfügen können.
LG
Franz
Sub MA_Dateien_speichern()
Dim strName As String, varOrdner, varDateixlsm, varDateixlsx
Dim Zeile As Long
Dim wkb As Workbook
Dim wkbMA As Workbook
Set wkb = ActiveWorkbook
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Bitte Ordner für zu erstellende Dateien auswählen/erstellen"
If .Show = -1 Then
varOrdner = .SelectedItems(1)
Else
Exit Sub
End If
End With
With wkb.Worksheets(8)
'Kürzel-Liste abarbeiten
For Zeile = 5 To .Cells(.Rows.Count, 6).End(xlUp).Row 'startzeile ggf. anpassen.
strName = .Cells(Zeile, 6).Text
varDateixlsm = varOrdner & Application.PathSeparator & strName & ".xlsm"
varDateixlsx = varOrdner & Application.PathSeparator & strName & ".xlsx"
If wkb.FileFormat = 52 Then 'xlOpenXMLTemplateMacroEnabled
'Datei ist Datei mit Makros
wkb.SaveCopyAs varDateixlsm
Set wkbMA = Application.Workbooks.Open(varDateixlsm)
With wkbMA.Worksheets(1)
.Unprotect Password:="Test"
.Range("D2").Value = strName
.Calculate
.Cells.Locked = True
.Protect Password:="Test"
End With
Call CleanUp_Protokoll(wks:=wkbMA.Worksheets("Protokoll"), strSuch:=strName)
Application.DisplayAlerts = False
wkbMA.SaveAs varDateixlsx, FileFormat:=51
Application.DisplayAlerts = True
wkbMA.Close savechanges:=True
VBA.Kill varDateixlsm
Else
'Datei hat keine Makros
wkb.SaveCopyAs varDateixlsx
Set wkbMA = Application.Workbooks.Open(varDateixlsx)
With wkbMA.Worksheets(1)
.Unprotect Password:="Test"
.Range("D2").Value = strName
.Calculate
.Cells.Locked = True
.Protect Password:="Test"
End With
Call CleanUp_Protokoll(wks:=wkbMA.Worksheets("Protokoll"), strSuch:=strName)
wkbMA.Save
wkbMA.Close savechanges:=True
End If
Next
End With
End Sub
Sub CleanUp_Protokoll(wks As Worksheet, ByVal strSuch As String)
Dim Zeile As Long, Zeile_1 As Long, Zeile_L As Long
Dim bolLoeschen As Boolean
Zeile_1 = 3 '3 als erste Zeile mit Name ggf. anpassen
Application.ScreenUpdating = False
With wks
Zeile_L = .Cells(.Rows.Count, 3).End(xlUp).Row
.Unprotect Password:="Test"  'erforderlich falls Blatt geschützt ist
'abweichende Namen in den Zellen in Spalte C löschen
For Zeile = Zeile_1 To Zeile_L
If .Cells(Zeile, 3)  strSuch Then
.Cells(Zeile, 3).ClearContents
bolLoeschen = True
End If
Next
If bolLoeschen = True Then
With .Range(.Cells(Zeile_1, 3), .Cells(Zeile_L, 3))
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete shift:=xlShiftUp
End With
End If
.Protect Password:="Test"  'erforderlich falls Blatt geschützt war
End With
Application.ScreenUpdating = True
End Sub

Anzeige
AW: Duplikate anhand Liste und bereinigen
20.10.2020 17:22:52
Blume
Ja, das hätte ich selber gemacht, es war nur die Frage, ob es so richtig wäre.
Leider hängt es bei mir immer och. Es lädt ewig, dann ist aber immer nur eine Datei erstellt, nach langer Zeit breche ich den Vorgang dann ab. Dann hat es eine Datei erstellt, dort ist das Protokoll aber immer noch das komplette Protokoll.
Ich werde nach dem Fehler bei mir suchen, nur aktuell bin da etwas hilflos. Vielleicht hast du ja noch eine Idee.
Vielen Dank dir!
AW: Duplikate anhand Liste und bereinigen
20.10.2020 19:48:02
fcs
Hallo Blume,
wenn die Ausführung eines Makros sehr lang dauert, dann gibt es meist 3 mögliche Ursachen:
1. Die Bildschirmaktualisierung braucht Zeit
2. Es sind Ereignismakros vorhanden, die durchdie Aktivitäten des Makro immer neu gestartet werden
3. Es sind Formeln vorhanden, die wegen der Aktionen eines Makros immer eine Neuberechnung starten
Um das Makro auf Trab zu bringen sollten zu Beginn des Makros folgende Einstellungen gemacht werden:
  'Makrobremsen lösen
Dim StatusCalc As Long
With Application
.EnableEvents = False
StatusCalc = .Application.Calculation 'Status merken
.Calculation = xlCalculationManual
.ScreenUpdating = False
End With

Am Ende des Makros müssen diese Einstellungen wieder zurückgesetzt werden.
'Makrobremsen zurücksetzen
With Application
.EnableEvents = True
.Calculation = StatusCalc
.ScreenUpdating = True
End With
Nachfolgend dein Makro angepasst.
LG
Franz
Sub MA_Dateien_speichern()
Dim strName As String, varOrdner, varDateixlsm, varDateixlsx
Dim Zeile As Long
Dim wkb As Workbook
Dim wkbMA As Workbook
Dim StatusCalc As Long
Set wkb = ActiveWorkbook
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Bitte Ordner für zu erstellende Dateien auswählen/erstellen"
If .Show = -1 Then
varOrdner = .SelectedItems(1)
Else
Exit Sub
End If
End With
'Makrobremsen lösen
With Application
.EnableEvents = False
StatusCalc = .Application.Calculation 'Status merken
.Calculation = xlCalculationManual
.ScreenUpdating = False
End With
With wkb.Worksheets(8)
'Kürzel-Liste abarbeiten
For Zeile = 5 To .Cells(.Rows.Count, 6).End(xlUp).Row 'startzeile ggf. anpassen.
strName = .Cells(Zeile, 6).Text
varDateixlsm = varOrdner & Application.PathSeparator & strName & ".xlsm"
varDateixlsx = varOrdner & Application.PathSeparator & strName & ".xlsx"
If wkb.FileFormat = 52 Then 'xlOpenXMLTemplateMacroEnabled
'Datei ist Datei mit Makros
wkb.SaveCopyAs varDateixlsm
Set wkbMA = Application.Workbooks.Open(varDateixlsm)
With wkbMA.Worksheets(1)
.Unprotect Password:="Test"
.Range("D2").Value = strName
.Calculate
.Cells.Locked = True
.Protect Password:="Test"
End With
Call CleanUp_Protokoll(wks:=wkbMA.Worksheets("Protokoll"), strSuch:=strName)
Application.DisplayAlerts = False
wkbMA.SaveAs varDateixlsx, FileFormat:=51
Application.DisplayAlerts = True
wkbMA.Close savechanges:=True
VBA.Kill varDateixlsm
Else
'Datei hat keine Makros
wkb.SaveCopyAs varDateixlsx
Set wkbMA = Application.Workbooks.Open(varDateixlsx)
With wkbMA.Worksheets(1)
.Unprotect Password:="Test"
.Range("D2").Value = strName
.Calculate
.Cells.Locked = True
.Protect Password:="Test"
End With
Call CleanUp_Protokoll(wks:=wkbMA.Worksheets("Protokoll"), strSuch:=strName)
wkbMA.Save
wkbMA.Close savechanges:=True
End If
Next
End With
'Makrobremsen zurücksetzen
With Application
.EnableEvents = True
.Calculation = StatusCalc
.ScreenUpdating = True
End With
End Sub
Sub CleanUp_Protokoll(wks As Worksheet, ByVal strSuch As String)
Dim Zeile As Long, Zeile_1 As Long, Zeile_L As Long
Dim bolLoeschen As Boolean
Zeile_1 = 3 '3 als erste Zeile mit Name ggf. anpassen
With wks
Zeile_L = .Cells(.Rows.Count, 3).End(xlUp).Row
.Unprotect Password:="Test"  'erforderlich falls Blatt geschützt ist
'abweichende Namen in den Zellen in Spalte C löschen
For Zeile = Zeile_1 To Zeile_L
If .Cells(Zeile, 3)  strSuch Then
.Cells(Zeile, 3).ClearContents
bolLoeschen = True
End If
Next
If bolLoeschen = True Then
With .Range(.Cells(Zeile_1, 3), .Cells(Zeile_L, 3))
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete shift:=xlShiftUp
End With
End If
.Protect Password:="Test"  'erforderlich falls Blatt geschützt war
End With
End Sub

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige