Makro für die Bennenung von Arbeitsblättern (mit Überprüfung, ob der gewählter Name schon vorhanden ist)
Guten Morgen!
Ich habe folgendes Problem und hoffe, daß mir diesbzgl. jemand den entscheidenden Hinweis geben kann (leider funktioniert die SF heute morgen nicht bzw. das System ist überlastet).
Über ein Makro soll ein bestehendes Tabellenblatt ausgewertet und die Auswertung in ein noch neu zu erstellendes Blatt eingetragen werden. Dieses neue Blatt soll den Namen des Blattes bekommen, aus dem das Makro ausgelöst wurde, zzgl. eines Zusatzes (in meinem Fall wäre dies "Auswertung Blatt 1", wenn das Makro aus Blatt 1 gestartet worden ist).
Die Erstellung des neuen Blattes inkl. der erstmaligen Benennung funktioniert auch genau wie geplant, allerdings ergibt sich dabei ein Problem, welches ich bisher nicht lösen konnte.
Löst man das Makro nämlich weitere Male aus, ergibt sich logischerweise eine Fehlermeldung, da der gewählte Blattname bereits vorhanden ist. Mein Ziel wäre an dieser Stelle eine Überprüfung, ob der gewählte Blattname bereits existiert und wenn dies der Fall ist, der neue Name noch mit einem Zahlenzusatz, i.e. (2),... , versehen wird, entsprechend der bereits vorhanden Blätter mit dem identischen Namen (m.E. ist das einfache Zählen der allg. vorhandenen Blätter und hieraus den numerischen Zusatz zu bilden keine Option, da eine Auswertung mit verschiedenen Parametern erfolgen kann und somit die Übersichtlichkeit verloren gehen würde).
Es wäre klasse, wenn mir jemand bezüglich meines Problems helfen könnte, da ich selbst von der Makroprogrammierung nicht wirklich viel Ahnung habe und das meiste per trail-and-error umsetze.
Eine kleine Zusatzfrage hätte ich dann auch noch: wie muß der Code aussehen, um die, in diesem Fall Auswertungsblätter, alle hinter einem bestimmten Blatt (ein leeres Blatt soll "Auswertungen >>>" genannt werden und dahinter werden alle getätigten Auswertungen entsprechend aufgelistet) einzufügen?
Vielen Dank und schönen Gruß
Noc06
Ich habe folgendes Problem und hoffe, daß mir diesbzgl. jemand den entscheidenden Hinweis geben kann (leider funktioniert die SF heute morgen nicht bzw. das System ist überlastet).
Über ein Makro soll ein bestehendes Tabellenblatt ausgewertet und die Auswertung in ein noch neu zu erstellendes Blatt eingetragen werden. Dieses neue Blatt soll den Namen des Blattes bekommen, aus dem das Makro ausgelöst wurde, zzgl. eines Zusatzes (in meinem Fall wäre dies "Auswertung Blatt 1", wenn das Makro aus Blatt 1 gestartet worden ist).
Die Erstellung des neuen Blattes inkl. der erstmaligen Benennung funktioniert auch genau wie geplant, allerdings ergibt sich dabei ein Problem, welches ich bisher nicht lösen konnte.
Löst man das Makro nämlich weitere Male aus, ergibt sich logischerweise eine Fehlermeldung, da der gewählte Blattname bereits vorhanden ist. Mein Ziel wäre an dieser Stelle eine Überprüfung, ob der gewählte Blattname bereits existiert und wenn dies der Fall ist, der neue Name noch mit einem Zahlenzusatz, i.e. (2),... , versehen wird, entsprechend der bereits vorhanden Blätter mit dem identischen Namen (m.E. ist das einfache Zählen der allg. vorhandenen Blätter und hieraus den numerischen Zusatz zu bilden keine Option, da eine Auswertung mit verschiedenen Parametern erfolgen kann und somit die Übersichtlichkeit verloren gehen würde).
Es wäre klasse, wenn mir jemand bezüglich meines Problems helfen könnte, da ich selbst von der Makroprogrammierung nicht wirklich viel Ahnung habe und das meiste per trail-and-error umsetze.
Eine kleine Zusatzfrage hätte ich dann auch noch: wie muß der Code aussehen, um die, in diesem Fall Auswertungsblätter, alle hinter einem bestimmten Blatt (ein leeres Blatt soll "Auswertungen >>>" genannt werden und dahinter werden alle getätigten Auswertungen entsprechend aufgelistet) einzufügen?
Vielen Dank und schönen Gruß
Noc06
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Kommentar vom Moderator Biber am 01.11.2010 um 17:41:24 Uhr
Set rgc+=1
#711
#711
Content-ID: 154097
Url: https://administrator.de/contentid/154097
Ausgedruckt am: 16.11.2024 um 23:11 Uhr
17 Kommentare
Neuester Kommentar
Hallo Noc06!
Etwa so:
Anmerkung: Es wird vorausgesetzt, dass es keine fehlerhaften Namen bestehender Auswertungsblätter (etwa aufgrund manueller Änderungen) gibt - ein Blatt "Auswertung Blatt 1 ()" etwa würde einen Fehler verursachen, der über "
Grüße
bastla
Etwa so:
Sub AddSheet()
Pre = "Auswertung " 'Präfix für neue Tabellennamen
After = "Auswertungen >>>" 'Blatt, nach dem das neue Blatt eingefügt werden soll
NewSheet = Pre & ActiveSheet.Name
Counter = 1
LNew = Len(NewSheet) 'Länge des neuen Tabellennamens (wird mehrfach benötigt und daher hier nur einmal ermittelt)
For Each Sheet In Sheets 'alle Blätter durchgehen
ThisName = Sheet.Name 'Name des betrachteten Blattes
If Left(ThisName, LNew) = NewSheet Then 'beginnt der Name dieses Blattes so wie jener des neu zu erstellenden Blattes?
If ThisName <> NewSheet Then 'ja, ist aber nicht gleich (daher bereits mit Laufnummer)
Nr = Val(Evaluate(Mid(Sheet.Name, LNew + 1))) 'Laufnummer ermitteln ...
If Nr >= Counter Then Counter = Nr + 1 '... und erhöhen
Else 'Blatt mit dem selben Namen wie das neu zu erstellende Blatt existiert
If Counter < 2 Then Counter = 2 'Laufnummer nur auf 2 setzen, wenn noch noch nicht mindestens 2
End If
End If
Next
Worksheets.Add After:=Sheets(After) 'Blatt nach dem vorgegebenen Blatt einfügen ...
'... und benennen (nur wenn Laufnummer > 1 auch mit Zusatz)
If Counter > 1 Then ActiveSheet.Name = NewSheet & " (" & CStr(Counter) & ")" Else ActiveSheet.Name = NewSheet
End Sub
On Error
" abgefangen werden müsste ...Grüße
bastla
Hallo Noc06!
Wenn's nur darum geht einen neuen Tabellennamen zu generieren, dann in etwa so:
Wobei ich aufgrund der nicht bekannten Stellenzahl (1...1000?) der Einfachheit halber einen Punkt plus Ziffer verwendet habe z.B.
wird "Tabelle" zu "Auswertung Tabelle.1", "Auswertung Tabelle.2" ...
oder "Tabelle1" zu "Auswertung Tabelle1.1", "Auswertung Tabelle1.2" ...
Gruß Dieter
Wenn's nur darum geht einen neuen Tabellennamen zu generieren, dann in etwa so:
Sub test()
Dim s As String
s = GetSheetName("Tabelle1")
End Sub
Private Function GetSheetName(ByRef SheetName) As String
Dim Wks As Worksheet, aName As Variant, sName As String
sName = "Auswertung " & SheetName & ".0"
On Error Resume Next
Do
aName = Split(sName, ".")
sName = aName(0) & "." & CInt(aName(1)) + 1
Set Wks = Nothing
Set Wks = Sheets(sName)
Loop While Not Wks Is Nothing
GetSheetName = sName
End Function
wird "Tabelle" zu "Auswertung Tabelle.1", "Auswertung Tabelle.2" ...
oder "Tabelle1" zu "Auswertung Tabelle1.1", "Auswertung Tabelle1.2" ...
Gruß Dieter
Hallo Noc06!
Nö, Du kannst das Private auch weglassen. Das bewirkt im Grunde nur, dass die Funktion nur innerhalb des aktuellen Code-Blattes von einer anderen Sub oder Funktion aufgerufen werden.
Stünde die Funktion z.B. in einem Modul mit Private-Angabe, dann kann die Funktion nicht aus anderen Modulen, Formularen... aufgerufen werden. Und in der Excel-Ansicht unter Makros, wäre sie auch nicht sichtbar.
Gruß Dieter
Nö, Du kannst das Private auch weglassen. Das bewirkt im Grunde nur, dass die Funktion nur innerhalb des aktuellen Code-Blattes von einer anderen Sub oder Funktion aufgerufen werden.
Stünde die Funktion z.B. in einem Modul mit Private-Angabe, dann kann die Funktion nicht aus anderen Modulen, Formularen... aufgerufen werden. Und in der Excel-Ansicht unter Makros, wäre sie auch nicht sichtbar.
Gruß Dieter
Hallo Hallo Noc06!
... daher könntest Du die Zeilem 1 bis 15 auf
ändern ...
Grüße
bastla
erst im übernächsten Auswertungslauf
... ist relativ einfach zu erklären, da in Zeile 8 der Name des neuen Blattes ausgehend vom (zu diesem Zeitpunkt gültigen) Namen des aktuellen Blattes festgelegt wird und erst in Zeile 14 das aktuelle Blatt umbenannt wird ...... daher könntest Du die Zeilem 1 bis 15 auf
Dim NewTableName As String
Dim Quelle, Ziel As Worksheet
Set Quelle = ThisWorkbook.ActiveSheet
ActiveSheet.Name = Range("B8") ' aktuelles Blatt hat nach dieser Zeile sicher den Projektnamen
Pre = "Auswertung " 'Präfix für neue Tabellennamen
After = "Auswertungen >>>" 'Blatt, nach dem das neue Blatt eingefügt werden soll
NewSheet = Pre & ActiveSheet.Name
Grüße
bastla
Hallo Noc06!
Wenn Du Variablendeklarationen (mit "
Die Zeile
erzeugt übrigens (da in VBA und nicht in einem aktuellen VB verwendet) die Variable "Quelle" nicht mit dem Type "
Weiters könntest Du auf das Auswählen der Zellen verzichten und anstelle von
gleich
schreiben.
Die Zeile 69 schließlich ist so auch nicht sinnvoll - das würde übersetzt etwa bedeuten: "Wenn ich die Augen zumache, kann mich keiner sehen ..." - also entweder ein vernünftiges Errorhandling (mit "
oder (in der Testphase auf jeden Fall zu bevorzugen) den Fehler und den resultierenden den Abbruch des Makros "zulassen". Abgesehen davon wäre der Fehler im Fall des Falles schon nach Zeile 33 abzufangen, denn wenn diese Zeile fehlerfrei bleibt, kann es eigentlich keine Namenskollision mehr geben ...
Grüße
bastla
jetzt funktioniert es genauso wie es soll!
Na dann könnten wir uns noch ja noch einigen Kleinigkeiten widmen - vor allem:Wenn Du Variablendeklarationen (mit "
Dim
") vornimmst, dann aber konsequent für alle verwendeten Variablen - dazu ist es sinnvoll, vorweg "Option Explicit
" zu setzen, da Du so keine Deklaration vergessen kannst und außerdem Schreibfehler bei Variablennamen leicht entdeckst ...Die Zeile
Dim Quelle, Ziel As Worksheet
Worksheet
", sondern als "Variant
" (was sich aber erfreulicher Weise nicht weiter auswirkt) - exakt wäre:Dim Quelle As Worksheet, Ziel As Worksheet
Ziel.Cells.Select
With Selection.Interior
With Ziel.Cells.Interior
Die Zeile 69 schließlich ist so auch nicht sinnvoll - das würde übersetzt etwa bedeuten: "Wenn ich die Augen zumache, kann mich keiner sehen ..." - also entweder ein vernünftiges Errorhandling (mit "
On Error Goto
" oder zumindest einer Abfrage (in der nächsten Zeile)If Err.Number <> 0 Then
Grüße
bastla
Hallo Noc06!
Grüße
bastla
das ganze Worksheet wieder schließt (so daß alle anderen Blätter erst gar nicht sichtbar sind)
... erschiene mir umgekehrt sinnvoller: Die Blätter müssten beim Beenden versteckt und vom AutoOpen-Makro wieder sichtbar gemacht werden (--> kein Makro - keine Blätter); habe ich so allerdings auch noch nicht umgesetzt ...Grüße
bastla
Hallo Noc06!
Ich fange mal bei Workbook_Open an. Und da hast Du ja schon einige Denkfehler drinnen
1. Codezeile 39-41: Es können nicht alle Tabellenblätter mit Visible = False unsichtbar gemacht werden. Es muss immer mindestens 1 Tabellenblatt sichtbar sein.
2. Codezeile 45-47: Würden sich erübrigen, wenn 1. funktionieren würde
3. Codezeile 50: unsichtbare Sheet's können nicht selektiert werden.
Bei Workbook_BeforeClose erspare ich mir das kommentieren...
Sorry, aber insgesamt ziemlich sinnloser Code, von daher dann das Ganze eher so:
Wobei die Arbeitsmappe inklusive Code mindestens 1 mal abgespeichert werden muss
Gruß Dieter
Ich fange mal bei Workbook_Open an. Und da hast Du ja schon einige Denkfehler drinnen
1. Codezeile 39-41: Es können nicht alle Tabellenblätter mit Visible = False unsichtbar gemacht werden. Es muss immer mindestens 1 Tabellenblatt sichtbar sein.
2. Codezeile 45-47: Würden sich erübrigen, wenn 1. funktionieren würde
3. Codezeile 50: unsichtbare Sheet's können nicht selektiert werden.
Bei Workbook_BeforeClose erspare ich mir das kommentieren...
Sorry, aber insgesamt ziemlich sinnloser Code, von daher dann das Ganze eher so:
Option Explicit
Const MsgSave = "Wollen Sie Ihre Änderungen vor dem Schließen der Arbeitsmappe abspeichern"
Private Sub Workbook_Open()
Sheets("Disclaimer").Visible = True
Sheets("MakroHinweis").Visible = xlVeryHidden
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If ActiveWorkbook.Saved = True Then
Call WorkbookCleanUp
ElseIf MsgBox(MsgSave, vbYesNo Or vbQuestion, "Änderungen abspeichen...") = vbNo Then
ActiveWorkbook.Saved = True
Else
Call WorkbookCleanUp
End If
End Sub
Private Sub WorkbookCleanUp()
Dim Wks As Worksheet
Application.ScreenUpdating = False
Sheets("MakroHinweis").Visible = True
For Each Wks In Sheets
If Wks.Name <> "MakroHinweis" Then Wks.Visible = xlVeryHidden
Next
ActiveWorkbook.Save
Application.ScreenUpdating = True
End Sub
Gruß Dieter
Hallo Noc06!
Ganz schön verwirrend
Ich schlage folgende Lösung vor:
In meinem Code in Codezeile 24 diese Codezeile einfügen:
Und im Sheet "Disclaimer" diesen Code einfügen:
Das war's eigentlich schon
Gruß Dieter
[edit] Mhm, war ich wohl etwas zu langsam [/edit]
Ganz schön verwirrend
Ich schlage folgende Lösung vor:
In meinem Code in Codezeile 24 diese Codezeile einfügen:
Sheets("Disclaimer").CheckBox1 = False
Und im Sheet "Disclaimer" diesen Code einfügen:
Private Sub CheckBox1_Click()
Dim Wks As Worksheet
If CheckBox1 = True Then
Application.ScreenUpdating = False
For Each Wks In Sheets
If Wks.Name <> "MakroHinweis" Then Wks.Visible = True
Next
Application.ScreenUpdating = True
End If
End Sub
Das war's eigentlich schon
Gruß Dieter
[edit] Mhm, war ich wohl etwas zu langsam [/edit]