Blattname

  • #1
S

scb

Aktives Mitglied
Themenersteller
Dabei seit
25.12.2001
Beiträge
31
Reaktionspunkte
0
Ort
Bern
Hallo alle

Ich bin auf der suche nach einem(r) code / formel....
Habe ein Jahreskalender erstellt der mit Tagesrapportblättern (Gleiche Mappe, pro Tag ein Blatt) verknüpft ist .
Möchte nun das die bestimmte Zelle (zb.Tagesrapport Zelle F9 mit der Formel=JahreskalenderA1 gleich Tagesdatum ) als Blatt/Registername dynamisch übernommen wird.
Mit folgendem Code habe ich eine Lösung gefunden, muss zwar beim Monatswechsel jedes einzelne Blatt neu abspeichern um das richtige Datum als Blattname zuerhalten, möchte aber das es alle verknüpften Monatsblätter in einem Rutsch (Monat) ändert. Ebenfalls kommt beim speichern ein Debugg-Fenster mit Fehler 1004!!!!
Wäre froh wenn mir jemand helfen könnte.

Code:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
ActiveSheet.Name = ActiveSheet.Range(F9)
End Sub

mfg
 
  • #2
Hallo SCB,

vielleicht kannst Du nochmal den Aufbau der Mappe schildern.

Also es gibt ein Kalenderblatt (Name ?) mit Verweisen auf die Tagesblätter.
Weiterhin gibt es 365/366 Tagesblätter (Aufbau Name ?)?

Wie finde ich (bzw. der Makro heraus) , welche Blätter umbenannt werden sollen bzw. ob sie schon umbenannt sind ?

Wann soll die Umbenennung stattfinden ?

Gruß Matjes :)
 
  • #3
Hallo Matjes
Meine Datei besteht aus einem Hauptblatt Namens Inventar wo ich jeweils in der Zelle A7 ein Anfangs-Datum reinschreibe. Dieses Datum wird im gleichen Blatt von der Zelle D9 bis AH9 also 31 Tage als Monat übernommen. In diesem Blatt, Spalten-Zeilen werden mir die Stunden vom jeweiligen passendem Tagesblatt/Rapport übertragen und aufsummiert.

Das Datum von Inventarblatt Zelle A7 ist mit dem Tagesblatt Zelle F9 verknüpft und ergibt den Monatsersten. Dieses Blatt Monatsersten ist weiter mit den restlichen Tagen bis Monatsende als Einzelblätter ( Gleiche Struktur und Aufbau wie Monatsersten ) verknüpft. ( Inventar hat nicht die gleiche Struktur und Aufbau wie Tagesblätter ) aber das spielt glaube ich keine Rolle.
Wen ich nun im Blatt Inventar A7 das Datum 01.01.2007 eingebe, geben mir die Zellen D9 bis AH9 die Tage als 1. 2. 3. usw bis 31. aus.
Die Zelle Inventar A7 wird von der Zelle F9 (Tagesblatt ) übernommen und ist mit TTT, TT. MMM JJ formatiert, ist also der Mo, 01. Jan 07. Das folgende schon vorhandene Tagesblatt übernimmt das Datum vom Monatsersten Zelle F9 und addiert einen Tag dazu ist also der Di, 02. Jan 07. Der 3.1.07 übernimmt die Zelle F9 von 2.1.07 und addiert einen Tag dazu usw.....


Ich möchte nun das Excel die Tagesblätter nach dem jeweiligen Datum (Zelle F9) benennt, und zwar alle in einem Rutsch wen das Datum im Inventarblatt A7 geändert wird, das heisst den Ganzen Monat 31 Tage / Blätter.

Hoffe einigermassen gut erklärt zuhaben......

mfg SCB
 
  • #4
Hallo SCB,

kannst Du mir eine Beispiel-Datei schicken. Dann strick ich dir ein Makro.
So verbal beschrieben, ist es schwierig nachvollziehbar.

Gruß Matjes :)
 
  • #5
Hallo Matjes

Ist unterwegs.....
 
  • #6
aktuelle Lösung:

Code:
Sub TagesBlattBltNameAusDatumF9()
 ->Kennzeichen für Tagesblatt: enthält .20
 ->(Es muß also in der Ausgangsposition jedes Tagesblatt mindestens
 -> diesen String im Blatnamen enthalten)
  Const cBLT_TAGESBLATT_KNG As String = .20
 ->Aus F9 des jeweiligen Blattes wird der Soll-Blattname definiert:
 ->dd.mm.yyyy
  Const cRANGE_DATUM = F9
 ->wenn daraus kein vernünftiges Datum erstellbar ist,
 ->wird eine Meldung ausgegeben.
 ->Der Blattname wird mit dem soll-Blattnamen verglichen.
 ->Ist er unterschiedlich wird der Blattname auf Soll-Blattname geändert.
  
  Dim ws As Worksheet
  Dim sBltNameIst As String, sBltNameSoll As String
  Dim pos As Long, x As Long
  
  For x = 1 To ThisWorkbook.Worksheets.Count
    Set ws = ThisWorkbook.Worksheets(x)
    sBltNameIst = ws.Name
    pos = InStr(1, sBltNameIst, cBLT_TAGESBLATT_KNG)
   ->Tagesblatt ?
    If pos > 0 Then
     ->SollNamen erstellen
      On Error Resume Next
      sBltNameSoll = Format(ws.Range(cRANGE_DATUM).Value, dd.mm.yyyy)
      If Err.Number <> 0 Then
        Err.Clear: On Error GoTo 0
        MsgBox _
          Auf Blatt  & sBltNameIst &  ist in  & cRANGE_DATUM & _
           kein vernünftiges Datum enthalten. & vbLf & _
          (Umwandlung)
      Else
        On Error GoTo 0
        If Not IsDate(sBltNameSoll) Then
          MsgBox _
            Auf Blatt  & sBltNameIst &  ist in  & cRANGE_DATUM & _
             kein vernünftiges Datum enthalten. & vbLf & _
            (Not Isdate())
        Else
         ->Sollnamen setzen, wenn ungleich Istname
          If sBltNameIst <> sBltNameSoll Then
            ws.Name = sBltNameSoll
          End If
        End If
      End If
    End If
  Next

AUFRAEUMEN:
  Set ws = Nothing
End Sub
Gruß Matjes :)
 
  • #7
Hallo Matjes

Was soll man da noch sagen ?????
Dein Makro ist schlichtweg GENIAL mml :1

Vielen Dank

Noch ne kleine Anfrage ?.....Kann od. geht dass überhaupt mittels einem Makro oder so....
Wen ich die Blattregisterfarben weglassen würde also Neutral, und an dieser Stelle die Registerfarbe die auf ein Wochenenden fallen durch ein Makro Gelb einzufärben. :)

Besten Dank und allen einen Guten Rutsch ins 07

Gruss SCB
 
  • #8
Hallo SCB,

einmal Korektur von Sub TagesBlattBltNameAusDatumF9:
vor Neubenennung der Blätter Umbenennung, damit doppelte Blattnamenvergabe vermieden wird.

Und dann noch ein Makro zur Farbgebung der Blattlaschen der Tagesblätter:
Sub TagesBlattBltLascheFarbeSetzen()
'*** sucht nach Tagesblättern mit Blattnamen dd.mm.yyyy zum
'*** Ausgangsdatum ist das Datum in A7 auf dem Blatt Inventar
'***
'*** Blattlaschen-Farben werden gestezt:
'*** - Wochenenden mit Wochenend-Farbe
'*** - Farben 1. Woche bis 5. Woche
'*** - nicht relevant für diesen Monat
'*** Ausgangsdatum ist das Datum in A7 auf dem Blatt Inventar
'***

Der funktioniert aber erst ab Excel 2003 !

Gruß Matjes :)
Code:
Option Explicit

Sub TagesBlattBltNameAusDatumF9()
 ->Kennzeichen für Tagesblatt: enthält .20
 ->(Es muß also in der Ausgangsposition jedes Tagesblatt mindestens
 -> diesen String im Blatnamen enthalten)
  Const cBLT_TAGESBLATT_KNG As String = .20
 ->Aus F9 des jeweiligen Blattes wird der Soll-Blattname definiert:
 ->dd.mm.yyyy
  Const cRANGE_DATUM = F9
 ->wenn daraus kein vernünftiges Datum erstellbar ist,
 ->wird eine Meldung ausgegeben.
 ->Der Blattname wird mit dem soll-Blattnamen verglichen.
 ->Ist er unterschiedlich wird der Blattname auf Soll-Blattname geändert.
  
  Dim ws As Worksheet
  Dim sBltNameIst As String, sBltNameSoll As String
  Dim pos As Long, x As Long
  
 ->
  For x = 1 To ThisWorkbook.Worksheets.Count
    Set ws = ThisWorkbook.Worksheets(x)
    sBltNameIst = ws.Name
    pos = InStr(1, sBltNameIst, cBLT_TAGESBLATT_KNG)
   ->Tagesblatt ? -> dann umbenennen, damit doppelte Namensvergabe vermieden wird
    If pos > 0 Then ws.Name = xxxx & ws.Name
  Next
  
  For x = 1 To ThisWorkbook.Worksheets.Count
    Set ws = ThisWorkbook.Worksheets(x)
    sBltNameIst = ws.Name
    pos = InStr(1, sBltNameIst, cBLT_TAGESBLATT_KNG)
   ->Tagesblatt ?
    If pos > 0 Then
     ->SollNamen erstellen
      On Error Resume Next
      sBltNameSoll = Format(ws.Range(cRANGE_DATUM).Value, dd.mm.yyyy)
      If Err.Number <> 0 Then
        Err.Clear: On Error GoTo 0
        MsgBox _
          Auf Blatt  & sBltNameIst &  ist in  & cRANGE_DATUM & _
           kein vernünftiges Datum enthalten. & vbLf & _
          (Umwandlung)
      Else
        On Error GoTo 0
        If Not IsDate(sBltNameSoll) Then
          MsgBox _
            Auf Blatt  & sBltNameIst &  ist in  & cRANGE_DATUM & _
             kein vernünftiges Datum enthalten. & vbLf & _
            (Not Isdate())
        Else
         ->Sollnamen setzen, wenn ungleich Istname
          If sBltNameIst <> sBltNameSoll Then
            ws.Name = sBltNameSoll
          End If
        End If
      End If
    End If
  Next
    
AUFRAEUMEN:
  Set ws = Nothing
End Sub



'**************************************************************************
Sub TagesBlattBltLascheFarbeSetzen()
'*** sucht nach Tagesblättern mit Blattnamen dd.mm.yyyy zum
'*** Ausgangsdatum ist das Datum in A7 auf dem Blatt Inventar
'***
'*** Blattlaschen-Farben werden gestezt:
'*** - Wochenenden mit Wochenend-Farbe
'*** - Farben 1. Woche bis 5. Woche
'*** - nicht relevant für diesen Monat
'*** Ausgangsdatum ist das Datum in A7 auf dem Blatt Inventar
'***

'!!!  ab Excel 2003 !!!

 ->Farbindexe
  Const cFARBE_WOCHE1 = 3           ->rot
  Const cFARBE_WOCHE2 = 4           ->grün
  Const cFARBE_WOCHE3 = 5           ->blau
  Const cFARBE_WOCHE4 = 39           'lila
  Const cFARBE_WOCHE5 = 35           'türkis
  Const cFARBE_NICHTRELEVANT = 15   ->hellgrau
  Const cFARBE_WOCHENENDE = 6       ->gelb
  
  Const cBLTNAME_INVENTAR = Inventar
  Const cBLTNAME_INVENTAR_RANGEDATUM = A7
  
  
  Dim wb As Workbook, ws As Worksheet
  Dim lWoche As Long, lMonat As Long, lJahr As Long, x As Long
  Dim dDateAusgang As Date, dDateTagesBlatt As Date
  Dim sBlattname As String
  
  
 ->Datum as Blatt Inventar
  Set wb = ThisWorkbook
  On Error Resume Next
  Set ws = wb.Worksheets(cBLTNAME_INVENTAR)
  Err.Clear: On Error GoTo 0
  If ws Is Nothing Then
    MsgBox Blatt  & cBLTNAME_INVENTAR &  nicht vorhanden.
    GoTo AUFRAEUMEN
  End If
  If Not IsDate(ws.Range(cBLTNAME_INVENTAR_RANGEDATUM).Value) Then
    MsgBox Auf Blatt  & cBLTNAME_INVENTAR &  in Zelle & cBLTNAME_INVENTAR_RANGEDATUM &  ist kein vernünftiges Datum
    GoTo AUFRAEUMEN
  End If
  dDateAusgang = ws.Range(cBLTNAME_INVENTAR_RANGEDATUM).Value
  lMonat = Month(dDateAusgang)
  lJahr = Year(dDateAusgang)

  lWoche = 1
  dDateTagesBlatt = 01. & lMonat & . & lJahr
  For x = 1 To 31
    sBlattname = Format(dDateTagesBlatt, dd.mm.yyyy)
    On Error Resume Next
    Set ws = Nothing
    Set ws = wb.Worksheets(sBlattname)
    Err.Clear: On Error GoTo 0
    If ws Is Nothing Then
      MsgBox Blatt  & sBlattname &  nicht vorhanden.
    Else
      If Month(dDateAusgang) = Month(dDateTagesBlatt) Then
        If Weekday(dDateTagesBlatt) <> vbSunday And _
           Weekday(dDateTagesBlatt) <> vbSaturday Then
          Select Case lWoche
            Case 1: ws.Tab.ColorIndex = cFARBE_WOCHE1
            Case 2: ws.Tab.ColorIndex = cFARBE_WOCHE2
            Case 3: ws.Tab.ColorIndex = cFARBE_WOCHE3
            Case 4: ws.Tab.ColorIndex = cFARBE_WOCHE4
            Case 5: ws.Tab.ColorIndex = cFARBE_WOCHE5
          End Select
          If Weekday(dDateTagesBlatt) = vbFriday Then
           ->Wochenfarbe weiterschalten
            lWoche = lWoche + 1
          End If
        Else
         ->Wochenende
          ws.Tab.ColorIndex = cFARBE_WOCHENENDE
        End If
      Else
       ->nicht im relevanten Monat -> nicht relevant
        ws.Tab.ColorIndex = cFARBE_NICHTRELEVANT
      End If
    End If
    
   ->Datum nächster Tag
    dDateTagesBlatt = DateAdd(d, 1, dDateTagesBlatt)
  Next

AUFRAEUMEN:
  Set wb = Nothing: Set ws = Nothing
End Sub
 
  • #9
Hallo Matjes

Unglaublich.... mml......sieht alles wie ein genialer Geniestreich aus :1

Danke Dir ganz herzlich Matjes

Grüsse
 
Thema:

Blattname

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.838
Beiträge
707.959
Mitglieder
51.491
Neuestes Mitglied
haraldmuc
Oben