1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Platzhalter in Excel-Makro

Discussion in 'Office-Programme' started by piano-forte, Feb 6, 2010.

Thread Status:
Not open for further replies.
  1. piano-forte

    piano-forte Kbyte

    Hallo allerseits,

    Meine Frage:
    Ich möchte per Makro die Beschriftung eines Tabellenblatts beim Jahreswechsel ändern.

    Im Januar lege ich per Makro ein neues Tabellenblatt an, d.h. ich kopiere das letzte Blatt und lösche die enthaltenen Daten. Der Tabellenreiter trägt als Beschriftung das vergangene Kalenderjahr und eine laufende Nummer. Das Blatt soll umbenannt werden mit dem neuen Kalenderjahr und der laufenden Nummer (1).

    Ich gehe davon aus, dass im Vorjahr maximal drei Blätter benötigt wurden.

    If Worksheets(Worksheets.Count).Name = "Tabelle " & Year(Date) - 1 & " (2)" Or _
    Worksheets(Worksheets.Count).Name = "Tabelle " & Year(Date) - 1 & " (3)" Or _
    Worksheets(Worksheets.Count).Name = "Tabelle " & Year(Date) - 1 & " (4)" Then
    ActiveSheet.Name = "Tabelle " & Year(Date) & " (1)"
    End If

    Gibt es in VBA auch einen Platzhalter, der für eine beliebige Blatt-Nummer stehen kann, um den Makro-Befehl zu verkürzen?

    If Worksheets(Worksheets.Count).Name = "Tabelle " & Year(Date) - 1 & " (PLATZHALTER)" Then
    ActiveSheet.Name = "Tabelle " & Year(Date) & " (1)"
    End If

    Danke für eure Lösungsvorschläge.

    piano-forte
     
  2. bahnrat

    bahnrat Kbyte

    Hallo!

    Das würde nur mit einer Schleife gehen.

    Sub Test()
    Dim i As Integer

    For i = 2 To 4
    If Worksheets(Worksheets.Count).Name = "Tabelle " & Year(Date) - 1 & "(" & i & ")" Then
    ActiveSheet.Name = "Tabelle " & Year(Date) & " (1)"
    Exit Sub
    End If
    Next i
    End Sub

    Code eingefügt mit VBA in HTML 2.0

    Gruß, René
     
    Last edited: Feb 6, 2010
  3. piano-forte

    piano-forte Kbyte

    Das ging ja schnell mit der Antwort. Auf dieser Spur habe ich inzwischen auch selber schon gedacht, aber nicht ganz zu Ende.

    Einen Augenblick hat es gedauert, bis ich begriffen habe, warum dein Makro bei mir nicht gleich laufen wollte. Es lag an der fehlenden Leerstelle vor der Klammer:
    " (" & i & ")"

    Danke für deine Hilfe.
    Gruß, piano-forte
     
  4. Beverly

    Beverly Halbes Megabyte

    Hi,

    hier noch eine Möglichkeit ohne Schleife:

    Code:
        Dim arrNummern
        arrNummern = Array(2, 3, 4)
        On Error Resume Next
        If Not Application.Match(Mid(Worksheets(Worksheets.Count).Name, 14, _
            Len(Worksheets(Worksheets.Count).Name) - 14) * 1, _
            arrNummern, 0) > 0 Then ActiveSheet.Name = "Tabelle " & Year(Date) & " (1)"
        On Error GoTo 0
     
  5. piano-forte

    piano-forte Kbyte

    Hallo,
    Erst einmal danke für den weiteren Tipp. Ich bin nicht so fit in VBA. Deshalb durchschaue ich die Funktionsweise von Application.Match nicht so ganz.
    Mid isoliert die eingeklammerte laufende Nummer des Tabellenblatts (14. Zeichen). Aber was auf Len folgt ist mir nicht ganz klar. Gerne würde ich das besser verstehen.

    Der Vorschlag löst mein Problem zwar nicht ganz. Ich möchte die Beschriftung nur ändern, wenn die Jahresangabe vom aktuellen Kalenderjahr abweicht. Das ist immer beim Jahreswechsel der Fall. Aber dein Vorschlag hat mir die Richtung gewiesen. Ich muss durch die Mid-Funktion die zu ändernde Jahreszahl isolieren. Dann erübrigt sich die Frage nach der laufenden Nummer des Tabellenblatts.
    Code:
    Sub WorksheetDatum ()
    
    Dim strYear
    strYear = CStr(Year(Date))
       
        If Mid(Worksheets(Worksheets.Count).Name, 9, 4) <> strYear _
           Then ActiveSheet.Name = "Tabelle " & Year(Date) & " (1)"
        
    End Sub
    
    Gruß, piano-forte
     
  6. Beverly

    Beverly Halbes Megabyte

    Hi,

    die Funktion Mid ist genau so aufgebaut wie die Tabellenfunktion TEIL(), die ja besagt:

    TEIL(Text;StartPosition;AnzahlZeichen)

    Mit dem Codeteil Len(Worksheets(Worksheets.Count).Name) - 14 wird AnzahlZeichen ermittelt für den Teil des Tabellenblattnamen, der in den Klammern steht - also bei "Tabelle2009 (2)" wäre das die Anzahl von 1 Zeichen. Dadurch ist das Ergebnis von Mid(.....) dann "2", wobei "2" als String ausgegeben wird, da ja ein Tabellenname immer ein String ist. Deshalb wird der String mittels Multiplikation mit 1 in eine Zahl umgewandelt, da ja mit den Zahlen im Array verglichen werden soll. Man könnte das Umwandeln in eine Zahl umgehen, wenn man in das Array die Zahlen als String schreibt:

    arrNummern = Array("2", "3", "4")

    Das Ergebnis wäre das selbe.

    Application.Match ist das gleiche wie die Tabellenfunktion VERGLEICH(Suchkriterium;Bereich;Vergleichstyp)

    Suchkriterium ist im Code die Zahl, die im Tabellennamen in Klammern steht, der Bereich mit dem verglichen werden soll ist das Array und der Vergleichstyp ist 0 (genaue Übereinstimmung).

    Ich hoffe, ich konnte deine Frage zu deiner Zufriedenheit beantworten. Falls nicht - frag ruhig nach.
     
  7. piano-forte

    piano-forte Kbyte

    Danke. Das war eine gut verständliche Schritt-für-Schritt-Erklärung.

    Schöne Grüße,
    piano-forte
     
Thread Status:
Not open for further replies.

Share This Page