PDA

Vollständige Version anzeigen : Code nur ausführen wenn Blatt existiert, sonst weiter mit nächster Zeile


Santhes
25.06.2015, 15:39
Tag allerseits,

es geht um folgendes.
In meiner Datei werden Stundenzettel angelegt, ausgefüllt und zum Teil auch automatisch berechnet.
Das Anlegen eines Neuen SZ funktioniert über Zwei DropDown Felder (Monat und Jahr) und die Navigation, dank eurer Hilfe, per ListBox welche auf dem Arbeitsblatt eingebettet ist.
Nun soll in das ganze noch etwas Ordnung gebracht werden, da man, wenn die SZ durcheinander angelegt werden(was oft der Fall ist) immer ewig suchen muss.

Die finde ich, beste Lösung hierfür, ist ein einfaches Sortieren der Arbeitsblätter welches ich per VBA erledigen lassen will.

Hier mein Code:


Sub test()

Sheets("Grundlage").Move Before:=Sheets(2)
Sheets("Feiertage").Move Before:=Sheets(3)
Sheets("Einstellungen").Move Before:=Sheets(4)
Sheets("ToDo").Move Before:=Sheets(5)

Sheets("Januar 2014").Move Before:=Sheets(6)
Sheets("Februar 2014").Move Before:=Sheets(7)
Sheets("März 2014").Move Before:=Sheets(8)
Sheets("April 2014").Move Before:=Sheets(9)
Sheets("Mai 2014").Move Before:=Sheets(10)
Sheets("Juni 2014").Move Before:=Sheets(11)
Sheets("Juli 2014").Move Before:=Sheets(12)
Sheets("August 2014").Move Before:=Sheets(13)
Sheets("September 2014").Move Before:=Sheets(14)
Sheets("Oktober 2014").Move Before:=Sheets(15)
Sheets("November 2014").Move Before:=Sheets(16)
Sheets("Dezember 2014").Move Before:=Sheets(17)

Sheets("Januar 2015").Move Before:=Sheets(18)
Sheets("Februar 2015").Move Before:=Sheets(19)
Sheets("März 2015").Move Before:=Sheets(20)
Sheets("April 2015").Move Before:=Sheets(21)
Sheets("Mai 2015").Move Before:=Sheets(22)
Sheets("Juni 2015").Move Before:=Sheets(23)
Sheets("Juli 2015").Move Before:=Sheets(24)
Sheets("August 2015").Move Before:=Sheets(25)
Sheets("September 2015").Move Before:=Sheets(26)
Sheets("Oktober 2015").Move Before:=Sheets(27)
Sheets("November 2015").Move Before:=Sheets(28)
Sheets("Dezember 2015").Move Before:=Sheets(29)

Sheets("Januar 2016").Move Before:=Sheets(30)
Sheets("Februar 2016").Move Before:=Sheets(31)
Sheets("März 2016").Move Before:=Sheets(32)
Sheets("April 2016").Move Before:=Sheets(33)
Sheets("Mai 2016").Move Before:=Sheets(34)
Sheets("Juni 2016").Move Before:=Sheets(35)
Sheets("Juli 2016").Move Before:=Sheets(36)
Sheets("August 2016").Move Before:=Sheets(37)
Sheets("September 2016").Move Before:=Sheets(38)
Sheets("Oktober 2016").Move Before:=Sheets(39)
Sheets("November 2016").Move Before:=Sheets(40)
Sheets("Dezember 2016").Move Before:=Sheets(41)

Sheets("Januar 2017").Move Before:=Sheets(42)
Sheets("Februar 2017").Move Before:=Sheets(43)
Sheets("März 2017").Move Before:=Sheets(44)
Sheets("April 2017").Move Before:=Sheets(45)
Sheets("Mai 2017").Move Before:=Sheets(46)
Sheets("Juni 2017").Move Before:=Sheets(47)
Sheets("Juli 2017").Move Before:=Sheets(48)
Sheets("August 2017").Move Before:=Sheets(49)
Sheets("September 2017").Move Before:=Sheets(50)
Sheets("Oktober 2017").Move Before:=Sheets(51)
Sheets("November 2017").Move Before:=Sheets(52)
Sheets("Dezember 2017").Move Before:=Sheets(53)

Sheets("Januar 2018").Move Before:=Sheets(54)
Sheets("Februar 2018").Move Before:=Sheets(55)
Sheets("März 2018").Move Before:=Sheets(56)
Sheets("April 2018").Move Before:=Sheets(57)
Sheets("Mai 2018").Move Before:=Sheets(58)
Sheets("Juni 2018").Move Before:=Sheets(59)
Sheets("Juli 2018").Move Before:=Sheets(60)
Sheets("August 2018").Move Before:=Sheets(61)
Sheets("September 2018").Move Before:=Sheets(62)
Sheets("Oktober 2018").Move Before:=Sheets(63)
Sheets("November 2018").Move Before:=Sheets(64)
Sheets("Dezember 2018").Move Before:=Sheets(65)

Sheets("Januar 2019").Move Before:=Sheets(66)
Sheets("Februar 2019").Move Before:=Sheets(67)
Sheets("März 2019").Move Before:=Sheets(68)
Sheets("April 2019").Move Before:=Sheets(69)
Sheets("Mai 2019").Move Before:=Sheets(70)
Sheets("Juni 2019").Move Before:=Sheets(71)
Sheets("Juli 2019").Move Before:=Sheets(72)
Sheets("August 2019").Move Before:=Sheets(73)
Sheets("September 2019").Move Before:=Sheets(74)
Sheets("Oktober 2019").Move Before:=Sheets(75)
Sheets("November 2019").Move Before:=Sheets(76)
Sheets("Dezember 2019").Move Before:=Sheets(77)

End Sub




Wie Ihr sehen könnt habe ich diesen so einfach wie möglich gehalten, was jedoch auch das Problem ist, denn jedes Mal wenn er an den Punkt kommt das ein Blatt nicht existiert bricht er das ganze Makro ab.
Ich hab es auch schon mit If / Else versucht, bin jedoch leider daran gescheitert.

Der Code geht von 2014 - 2019 weil das der Bereich ist für den man momentan Stundenzettel schreiben kann.

Das Ziel bei der ganzen Sache ist einfach, das nach dem durchlaufen dieses Makro´s zuerst die Vier Grundblätter kommen und dann eben Jahr für Jahr.


mfg
Patrick

EarlFred
25.06.2015, 15:46
Hallo Patrick,

On Error Resume Next könnte helfen, wenn es auch nicht sonderlich elegant wäre.

Daten aus Zahlen lassen sich einfacher sortieren.
Benenne die Blätter doch nach einem einfachen Schema:

"01 Grundlage"
"02 Feiertage"
"03 Einstellungen"
"04 ToDo"
"2014.01" (für Januar 2014)
...usw.

Und dann suchst Du Dir einen der im Netz verfügbaren Codes aus, mit dem Du Blätter aufsteigend nach Name sortieren kannst.

Grüße
EarlFred

xlph
25.06.2015, 16:41
...oder so...

Public Sub BlaetterSortieren_XLph()

Dim wksBlatt As Worksheet
Dim strBlattName As String
Dim objAL As Object

Dim avntBlattNamenSortiert() As Variant
Dim iavntBNS As Long

Dim avntAusnahmen() As Variant
Dim iavntAusnahmen As Long


avntAusnahmen() = Array("Grundlage", "Feiertage", "Einstellungen", "ToDo")


Set objAL = CreateObject("System.Collections.ArrayList")


For Each wksBlatt In ThisWorkbook.Worksheets

If wksBlatt.Visible = xlSheetVisible Then

strBlattName = wksBlatt.Name

If strBlattName Like "* ####" And IsDate("1. " & strBlattName) Then

strBlattName = Format(CDate("1. " & strBlattName), "yyyy-mm-dd")

End If

objAL.Add strBlattName

End If

Next


Application.ScreenUpdating = False


If objAL.Count > 0 Then

objAL.Sort

avntBlattNamenSortiert() = objAL.ToArray

objAL.Clear

For iavntBNS = UBound(avntBlattNamenSortiert) To LBound(avntBlattNamenSortiert) Step -1

strBlattName = avntBlattNamenSortiert(iavntBNS)

If strBlattName Like "####-##-##" And IsDate(strBlattName) Then
strBlattName = Format(CDate(strBlattName), "mmmm yyyy")
End If

With ThisWorkbook
.Worksheets(strBlattName).Move Before:=.Sheets(1)
End With

Next

End If


' Ausnahmen an Anfang setzen

For iavntAusnahmen = UBound(avntAusnahmen) To LBound(avntAusnahmen) Step -1

strBlattName = avntAusnahmen(iavntAusnahmen)

If strBlattName Like "####-##-##" And IsDate(strBlattName) Then
strBlattName = Format(CDate(strBlattName), "mmmm yyyy")
End If

With ThisWorkbook
.Worksheets(strBlattName).Move Before:=.Sheets(1)
End With

Next


Application.ScreenUpdating = True

Set wksBlatt = Nothing
Set objAL = Nothing

End Sub

Santhes
30.06.2015, 13:39
Leider war ich die letzten tage kurzfristig außer Lande weshalb ich noch keine Rückmeldung geben konnte...


...oder so...

Danke xlph, deine Lösung funktioniert Perfekt!!!

Ich hätte allerdings noch eine bitte an dich oder allgemein an jemanden der sich damit auskennt.

Und zwar habe ich leider nur beschränkte VBA Kenntnisse, weshalb ich nur kleine Abschnitte des Codes "Lesen" kann.
Könntet Ihr mir da den gefallen tun und den Code beschriften das ich auch verstehe welcher Teil was macht?

Einfach das ich solche Probleme in Zukunft selber Lösen kann und ebenfalls weis wie das ganze Funktioniert, nicht das es einfach so ist.


Danke im Vorraus

Gruß Patrick