Registriert seit: 23.07.2019
Version(en): 2016
Hallo zusammen,
ich benötige ein Makro, welches mir aus einer Datei Daten kopiert, wenn eine bestimmte Bedingung erfüllt ist. Diese Daten sollen dann in einen bestimmten Bereich einer anderen Datei kopiert werden. Letzlich soll im Anschluss die Datei unter einem bestimmten Namen via speichern unter abgespeichert werden und im besten fall der Reiter nebst Bereich in den die Daten eingefügt wurden ausgeblendet werden. Die Krönung wäre dann, wenn die so entstandene neue Datei mit einem Passwort versehen werden könnte und ein Arbeitsmappenschutz mit einem weiteren Passwort eingerichtet werden würde.
Als Beispiel: Arbeitsmappe 1 enthält die zu kopierenden Daten Arbeitsmappe 2 ist die "Zielvorlage" in die die kopierten Daten eingefügt werden sollen Arbeitsmappe 3 ist dann die "neue Datei auf Grundlage der Zielvorlage"
1. In Arbeitsmappe 1 soll im ersten Reiter ab Zeile 2 in den Spalten Z bis AE Zeilenweise überprüft werden ob ein Kriterium vorliegt, bspw. ein bestimmter Name. 2. Sofern der Name in der jeweiligen Zeile in einer oder mehreren der Spalten enthalten ist, soll aus dieser Zeile der Inhalt aus dem Bereich A bis AD kopiert werden. 3. Die kopierten Daten sollen nun ohne leere Zwischeneinträge als Werte untereinander in Arbeitsmappe 2 im ersten Reiter im Bereich A6:AD30 eingefügt werden. 4. Das Kriterium (hier ein bestimmter Name) soll in Arbeitsmappe 2 im ersten Reiter in Zelle B1 eingefügt werden. 5. In Zelle E1 und B2 in Arbeitsmappe 2 im ersten Reiter soll der Monatserste des aktuellen Monats hinterlegt werden. 6. Die Datei soll nun unter einem neuen Namen im Format "aktuellerMonat_Fülltext_Kriterium" via speichern unter abgespeichert werden (also bspw. 08 fülltext Mustermann.xlsm) 7. Der erste Reiter der nun entstandenen Arbeitsmappe 3 soll mit einem Passwort versehen werden. 8. Der erste Reiter von Arbeitsmappe 3 soll ausgeblendet werden. 9. Arbeitsmappe 3 soll mit einem passwort zum öffnen versehen werden. 10. Arbeitsmappe 3 soll mit einem Arbeitsmappenschutz versehen werden, das passwort soll sich von dem in schritt 9 unterscheiden.
Ich hoffe mein Anliegen ist verständlich. Ich bin mir nicht sicher, ob alle meine Anforderungen überhaupt per VBA abgebildet werden können, es wäre jedoch sehr nett wenn sich einige Experten der Sache annehmen könnten.
Gruß
Stoffo
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
Hi Stoffo, ob das per VBA möglich ist kannst Du ganz einfach herausbekommen, indem Du mal die Aktion mit dem Makrorekorder aufzeichnest. Siehe dazu meinen Beitrag Excel-Word-MakrorekorderDen Code, ggf. auch noch die Datei, kannst Du dann hier einstellen und wir beschäftigen uns damit
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
Registriert seit: 23.07.2019
Version(en): 2016
13.08.2020, 10:12
(Dieser Beitrag wurde zuletzt bearbeitet: 13.08.2020, 10:12 von Stoffo.)
Hallo, zunächst vielen Dank für deine Antwort. Leider scheitere ich bereits am ersten Schritt meines geplanten Makros. Wie mache ich dem Makrorekorder begreiflich, dass er auf ein Kriterium prüfen soll? Anbei ein erster Versuch Code: ActiveWorkbook.Save End Sub Sub Makro2() ' ' Makro2 Makro '
' Sheets("Arbeitsmappe 1 Reiter 1").Select Range("A40:AD40").Select Range("AD40").Activate Selection.Copy Sheets("Arbeitsmappe 2 Reiter 1").Select Range("A6").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("B1").Select Application.CutCopyMode = False ActiveCell.FormulaR1C1 = "Kriterium" Range("B2").Select ActiveCell.FormulaR1C1 = "8/1/2020" Range("E1").Select ActiveCell.FormulaR1C1 = "8/1/2020" Range("E2").Select ChDir "Speicherpfad" ActiveWorkbook.SaveAs Filename:="Speicherpfad und Dateiname.xlsm", _ FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False Sheets("Arbeitsmappe 3 Reiter 1").Select ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True Sheets("Arbeitsmappe 3 Reiter 1").Select ActiveWindow.SelectedSheets.Visible = False ActiveWorkbook.Protect Structure:=True, Windows:=False ActiveWorkbook.Save End Sub
Gruß
Stoffo
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
13.08.2020, 10:35
(Dieser Beitrag wurde zuletzt bearbeitet: 13.08.2020, 10:36 von schauan.)
Hallöchen, ist doch schon mal gut für den ersten Schritt Du könntest vor dem Kopieren per Autofilter die Daten auf das gewünschte Maß einschränken und den gefilterten Bereich kopieren und einfügen. Das Kriterium würde dann erst mal fest in Deinem Code stehen und wir würden dann den Zellbezug draus machen je nachdem, wie viele Kriterien es sind und in den Autofilter passen, ggf. mit einer Schleife, wenn es zu viele Kriterien werden .
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
Registriert seit: 01.04.2020
Version(en): 2007
Hi Stoffo, individuelle Probleme verlangen nach individuelle Lösungen. Für Punkt 1 bis 3 hier mal ein VBA-Vorschlag zum Aufwärmen. Code: Sub KopierenStoffo() Dim rQu As Range, rZi As Range Dim Daten, Kopie Dim cZe As New Collection Dim iSp As Long, iZe As Long Const Suchtext As String = "Bestimmter Name" With ActiveWorkbook Set rQu = .Worksheets("Arbeitsmappe1").Range("A2").CurrentRegion Set rZi = .Worksheets("Arbeitsmappe2").Range("A6") End With Daten = rQu For iZe = 1 To UBound(Daten, 1) For iSp = 26 To 31 If Daten(iZe, iSp) = Suchtext Then cZe.Add iZe: Exit For Next iSp Next iZe ReDim Kopie(1 To cZe.Count, 1 To 30) For iZe = 1 To UBound(Kopie, 1) For iSp = 1 To UBound(Kopie, 2) Kopie(iZe, iSp) = Daten(cZe(iZe), iSp) Next iSp Next iZe rZi.Resize(UBound(Kopie, 1), UBound(Kopie, 2)) = Kopie End Sub
Den Code in ein allgemeines Modul kopieren. Du musst im Code noch den Suchtext richtig eintragen und ev. die Blattnamen "Arbeitsmappe1" und "Arbeitsmappe2" anpassen. Gruß, Raoul.
Folgende(r) 1 Nutzer sagt Danke an Raoul21 für diesen Beitrag:1 Nutzer sagt Danke an Raoul21 für diesen Beitrag 28
• Stoffo
Registriert seit: 23.07.2019
Version(en): 2016
Hallo ihr zwei, zunächst vielen Dank für die Unterstützung. @schauan: Code: Sub Makro1() ' ' Makro1 Makro '
' Sheets("Arbeitsmappe 1 Reiter 1").Select Range("AH1").Select '<-------- Hier wird mein Kriterium ausgewählt via DropDown ActiveWorkbook.Worksheets("Arbeitsmappe 1 Reiter 1").AutoFilter.Sort.SortFields. _ Clear ActiveWorkbook.Worksheets("Arbeitsmappe 1 Reiter 1").AutoFilter.Sort.SortFields. _ Add2 Key:=Range("AE1:AE79"), SortOn:=xlSortOnValues, Order:=xlDescending _ , DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Arbeitsmappe 1 Reiter 1").AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Range("A2:AD2").Select Range("AD2").Activate Selection.Copy Range("A6").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False ChDir "C:\irgendwas\nochwas\usw" ActiveWorkbook.SaveAs Filename:="C:\irgendwas\nochwas\usw\test.xlsm", _ FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False Range("B1").Select ActiveCell.FormulaR1C1 = "Kriterium" '<---- Hier wird das Kriterium von oben in Arbeitsmappe 2 Reiter 1 Zelle B1 eingefügt Range("B2").Select ActiveCell.FormulaR1C1 = "8/1/2020" '<---- Hier soll der jeweilige Monatserste des aktuellen Monats eingetragen werden Range("E1").Select ActiveCell.FormulaR1C1 = "8/1/2020" '<---- Hier soll der jeweilige Monatserste des aktuellen Monats eingetragen werden Range("E2").Select Sheets("Arbeitsmappe 3 Reiter 1").Select ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True Sheets("Arbeitsmappe 3 Reiter 1").Select ActiveWindow.SelectedSheets.Visible = False ActiveWorkbook.Protect Structure:=True, Windows:=False ActiveWorkbook.Save End Sub
so sieht es nun aus, ich verstehe darin leider nur Teile, bzw. sieht es für mich so aus als würde eingefügt werden bevor meine Arbeitsmappe 2 geöffnet wird. Darüber hinaus sehe ich zwar, dass der Reiter Ausgeblendet und mit passwort geschützt wird, jedoch würde ich im Makro das Passwort gerne vorgeben können. @Raoul21 gefällt mir erstmal ziemlich gut, leider kann ich es nicht testen da Du mich wohl missverstanden hast. Arbeitsmappe 1 und 2 sind keine Blattnamen, sondern tatsächliche Arbeitsmappen (Workbooks). Ich weiss jedoch nicht, inwiefern ich deinen Code abändern muss um Arbeitsmappe 2 zu öffnen und in dieser im Reiter 1 (Worksheet) ab A6 einfüge.
Gruß
Stoffo
Registriert seit: 23.07.2019
Version(en): 2016
Hallo,
hat noch jemand eine Idee?
Gruß
Stoffo
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
Hallo Stoffo, wenn das Arbeitsmappen sind hast Du wohl beim Aufzeichnen nicht alle Hinweise beachtet, insbesondere den: Zitat:Bevor man mit einer Aufzeichnung beginnt, sollte man beachten, dass der Makrorekorder nur die Aktionen aufzeichnet, die man auch ausführt. Wenn z.B. ein Wechsel zwischen Blättern oder Dateien notwendig sein sollte und man tut das bereits vor der Aufzeichnung, fehlt das anschließend bei der Ausführung des Makros Ich dachte auch erst, was Dein Blatt für einen ungewöhnlichen Namen hat - Sheets("Arbeitsmappe 1 Reiter 1").Select - , aber (fast) nichts ist unmöglich. Wenn das nun Datei und Blatt sind, würde ein aufgezeichneter code so aussehen - die Datei würde bei mir in C:\Test liegen: Code: Sub Makro1() ' ' Makro1 Makro '
' Workbooks.Open Filename:="C:\Test\Arbeitsmappe 1.xlsx" Sheets("Reiter 1").Select Workbooks.Open Filename:="C:\Test\Arbeitsmappe 2.xlsx" Sheets("Reiter 1").Select Windows("Arbeitsmappe 1.xlsx").Activate
End Sub
Damit das Aufzeichnen funktioniert müsstest Du, wie in meinem Beitrag beschrieben, in den beiden Mappen auf Reiter 1 eine andere Zelle auswählen die später am Beginn nicht verwendet wird, jeweils ein anderes Blatt aktivieren, notfalls extra einfügen, die Dateien speichern und schließen und dann erst aufzeichnen. Du musst auch mal die Reihenfolge überdenken. Dein Schritt 4 könnte man z.B. als ersten Schritt nehmen. Der Benutzer trägt den Namen ein und startet das Makro ... 5. kann man per Formel lösen. 7. ist ggf. nicht nötig, wenn Du die Struktur der Arbeitsmappe schützt. Der Blattschutz würde lediglich verhindern können, dass jemand mit einem Makro auf dem Blatt Daten ändert. Daten rausholen wäre auch bei Blattschutz möglich. Zudem solltest Du das Projekt schützen, damit keiner der den Aufbau der Datei noch nicht kennt, den Blattnamen auf diese Weise sieht.
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
Folgende(r) 1 Nutzer sagt Danke an schauan für diesen Beitrag:1 Nutzer sagt Danke an schauan für diesen Beitrag 28
• Stoffo
Registriert seit: 23.07.2019
Version(en): 2016
Hallo zusammen, nach einigem rumprobieren hier nun mein Ergebnis: Code: Sub KopierenStoffo() Dim rQu As Range, rZi As Range Dim Daten, Kopie Dim cZe As New Collection Dim iSp As Long, iZe As Long Dim ws As Worksheet Dim NeuerName As String, Speicherpfad As String Dim Vorname As String Dim Name As String Dim Suchtext As String Dim passwortEingabe As String Vorname = InputBox("Bitte den Vornamen eingeben:") Name = InputBox("Bitte den Nachnamen eingeben:") passwortEingabe = InputBox("Bitte ein Passwort zum Öffnen der Datei eingeben:") Suchtext = Name & ", " & Vorname Speicherpfad = "C:\" 'Hier wird der Speicherpfad festgelegt NeuerName = Format(Month(Date), "00") & " " & "Datei " & Name & " " & Year(Date) & ".xlsm" 'Hier wird der neue Dateiname vorgegeben
With ActiveWorkbook Set rQu = .Worksheets("Arbeitsmappe 1 Reiter 1").Range("A2").CurrentRegion With Application.Workbooks.Open("C:Dateipfad Arbeitsmappe 2") Set rZi = .Worksheets("Arbeitsmappe 2 Reiter 1").Range("A6") Set ws = .Worksheets("Arbeitsmappe 2 Reiter 1") End With End With Daten = rQu For iZe = 1 To UBound(Daten, 1) For iSp = 26 To 31 If Daten(iZe, iSp) = Suchtext Then cZe.Add iZe: Exit For Next iSp Next iZe ReDim Kopie(1 To cZe.Count, 1 To 30) For iZe = 1 To UBound(Kopie, 1) For iSp = 1 To UBound(Kopie, 2) Kopie(iZe, iSp) = Daten(cZe(iZe), iSp) Next iSp Next iZe rZi.Resize(UBound(Kopie, 1), UBound(Kopie, 2)) = Kopie With ActiveWorkbook ActiveSheet.Range("B1").Value = Vorname & Name 'Hier wird der Zelle B1 der Name zugewiesen ws.Range("B2") = ws.Range("E2") - Day(ws.Range("E2")) + 1 'Hier wird der Zelle B2 und E1 der Monatserste zugewiesen ws.Range("E1") = ws.Range("E2") - Day(ws.Range("E2")) + 1 'Hier wird der Zelle B2 und E1 der Monatserste zugewiesen Sheets("Reiter 1").Protect Password:="PasswortfürBlattschutz" 'Hier wird der Reiter 1 mit einem Passwort versehen Sheets("Reiter 1").Visible = False 'Hier wird der Reiter 1 ausgeblendet ActiveWorkbook.Protect "PasswortfürArbeitsmappe" 'Hier wird die Arbeitsmappe mit einem Passwort versehen ActiveWorkbook.SaveAs Filename:=Speicherpfad & NeuerName, Password:=passwortEingabe, FileFormat:=xlOpenXMLWorkbookMacroEnabled 'Hier wird die Arbeitsmappe unter neuem Namen und mit Passwort versehen End With End Sub
scheint zu tun was es soll, kann man aber bestimmt noch irgendwie verbessern (z.B. durch einen Errorhandler) habe mich damit aber noch nicht weiter beschäftigt. Vielen Dank an euch beide. Ohne Raoul21s Lösungsvorschlag für die Schritte 1-3 und schauans Hilfestellung/Motivation selbst aktiv nach Lösungen zu suchen wäre es wohl nicht zu diesem Ergebnis gekommen.
Gruß
Stoffo
Registriert seit: 01.04.2020
Version(en): 2007
Danke, freut mich, dass ich helfen konnte. Alles Gute.
|