Datum kopieren und modifizieren (Ahnenforscher Datum)
#1
Hallo Excelianer:innen,
hier habe ich vor einiger Zeit beim gleiche Thema Hilfe erhalten siehe (Spalten kopieren zu Spaltenüberschrift)
und verwende das Makro von Uwe. Nun wollte ich das ganze erweitern, leider ohne Erfolg.

Zusätzlich sollte noch ergänzt werden (Jahr- und Monatszahlen vaiabel):

  vor 1600      zu      BEF 1600
  um 1100      zu      ABT 1100
  nach 1500    zu      AFT 1500
  09 1300       zu      SEP 1300
  1200           zu            1200

Leider bin ich mit den Formeln etwas überfordert  und bitte um Eure Hilfe.
Gruss Martin

.xlsm   Datum Test 1.xlsm (Größe: 317,53 KB / Downloads: 11)
Antworten Top
#2
Hallo,

versuche es einmal so:

Code:
'in Modul 3 unten.....

Select Case Right(.Cells(i, k), 4)
        Case Is <= 1200
        .Cells(i, j) = "BEF " & Right(.Cells(i, k), 4)
'usw. usw.
        End Select

Bei "um 1200" musst Du eben einen Zeitraum definieren z. B. >=1100 And <= 1300 oder wie auch immer.
Den ersten Code - Schnipsel oben habe ich getestet und funktioniert.

Grüße

Norbert
Antworten Top
#3
Guten Tag Norbert,
98 für die Hilfe. Leider bringt es mir eine Fehlermeldung.

Unzulässiger oder nicht ausreichend definierter Verweiss bei
    Select Case Right(.Cells(i, k), 4)

Was mache ich falsch? Bitte nochmals um Hilfe.
Gruss Martin



.xlsm   Datum Test 1(1).xlsm (Größe: 316,77 KB / Downloads: 6)
Antworten Top
#4
Hi,

da du vor dem .Cells einen Punkt stehen hast, muss es natürlich mit in den With-Block!

Im Übrigen solltest du auch die anderen If-Anweisungen in Select Case umwandeln. Wäre viel übersichtlicher
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#5
BY7#:

=LET(
a;AD7:AD16;
x;RECHTS("01.01."&a;10);
y;WECHSELN(WECHSELN(GROSS(TEXT(ERSETZEN(x;7;1;TEIL(x;7;1)+2);"T MMM JJJJ"));" 3";" 1");" 4";" 2");
z;WAHL(LÄNGE(a)-LÄNGE(WECHSELN(a;".";))+1;RECHTS(y;4);RECHTS(y;8);y);
WENNFEHLER(VERWEIS(a;{"n"."u"."v"};{"AFT "."ABT "."BEF "});"")&z)


nur ab dem Jahr 1000. Für Jahre davor bitte melden.

Achtung: Nur neues Excel!
WIN/MSO schicken angeblich alle 5 Sekunden Deinen Screen heim zu Papa (recall-Klausel). 
Antworten Top
#6
Guten Abend LCohen,
besten Dank für Dein Beispiel. Interessanter Vorschlag.
Leider arbeite ich immer noch mit Excel 2016.
Trotzdem nochmals danke für die Hilfsbereitschaft.
Gruss Martin
Antworten Top
#7
War auch nur Gehirnschmirgelgrundlage. Manchmal braucht man das. Etwas verkürzt ohne WAHL:

=LET(
a;AD7:AD16;
x;RECHTS("01.01."&a;10);
y;WECHSELN(WECHSELN(GROSS(TEXT(ERSETZEN(x;7;1;TEIL(x;7;1)+2);"T MMM JJJJ"));" 3";" 1");" 4";" 2");
z;RECHTS(y;(LÄNGE(a)-LÄNGE(WECHSELN(a;".";))+1)*4);
WENNFEHLER(VERWEIS(a;{"n"."u"."v"};{"BEF "."ABT "."AFT "});"")&z)
WIN/MSO schicken angeblich alle 5 Sekunden Deinen Screen heim zu Papa (recall-Klausel). 
Antworten Top
#8
Guten Abend Helmut,
danke für die Info. Habe immer noch so meine Schwierigkeiten mit den If Aneisungen.
Dein Typ :
"da du vor dem .Cells einen Punkt stehen hast, muss es natürlich mit in den With-Block"
nicht so verständlich.

Dein Änderungsvorschlag "If-Anweisungen in Select Case umwandeln" ist sicher
von Vorteil, vor allem aber übersichtlicher.

Hier wären für mich Beispiele besser. So könnte ich meinen Bildungs-Horizont erweitern.
Nochmals Danke für deine Hilfbereischaft.
mfg. Martin
Antworten Top
#9
Hallo Martin,

teste mal.

.xlsm   Datum Test 1.xlsm (Größe: 308,13 KB / Downloads: 17)
Naja, mittels Select Case spart man an dieser Front nur wenig, da ja die jeweiligen Zuweisungen (1 Befehlszeile) bleiben. Deshalb ist es so ziemlich egal, ob If/Else oder Select Case.


Gruß Uwe
Antworten Top
#10
Hi,
(10.12.2022, 13:55)Egon12 schrieb: Naja, mittels Select Case spart man an dieser Front nur wenig, da ja die jeweiligen Zuweisungen (1 Befehlszeile) bleiben. Deshalb ist es so ziemlich egal, ob If/Else oder Select Case.
dem möchte ich doch ein wenig widersprechen.
Der bisherige Code mit If
Code:
Sub Datum1()
    Dim i As Long, j As Long, k As Long, Spalte1 As Range, Spalte2 As Range
    'Geburts Datum
    i = ActiveCell.Row
    With Tabelle1
        Set Spalte1 = .Rows(6).Find("Geburt-Datum")
        If Not Spalte1 Is Nothing Then k = Spalte1.Column
        Set Spalte2 = .Rows(6).Find("Geburt.-.Datum")
        If Not Spalte2 Is Nothing Then j = Spalte2.Column
        If Len(.Cells(i, k)) = 4 Then .Cells(i, j) = .Cells(i, k)
        If Len(.Cells(i, k)) = 7 Then
            If Left(.Cells(i, k), 2) = "01" Then
                .Cells(i, j) = "JAN " & Right(.Cells(i, k), 4)
            End If
            If Left(.Cells(i, k), 2) = "02" Then
                .Cells(i, j) = "FEB " & Right(.Cells(i, k), 4)
            End If
            If Left(.Cells(i, k), 2) = "03" Then
                .Cells(i, j) = "MRZ " & Right(.Cells(i, k), 4)
            End If
            If Left(.Cells(i, k), 2) = "04" Then
                .Cells(i, j) = "APR " & Right(.Cells(i, k), 4)
            End If
            If Left(.Cells(i, k), 2) = "05" Then
                .Cells(i, j) = "MAI " & Right(.Cells(i, k), 4)
            End If
            If Left(.Cells(i, k), 2) = "06" Then
                .Cells(i, j) = "JUN " & Right(.Cells(i, k), 4)
            End If
            If Left(.Cells(i, k), 2) = "07" Then
                .Cells(i, j) = "JUL " & Right(.Cells(i, k), 4)
            End If
            If Left(.Cells(i, k), 2) = "08" Then
                .Cells(i, j) = "AUG " & Right(.Cells(i, k), 4)
            End If
            If Left(.Cells(i, k), 2) = "09" Then
                .Cells(i, j) = "SEPT " & Right(.Cells(i, k), 4)
            End If
            If Left(.Cells(i, k), 2) = "10" Then
                .Cells(i, j) = "OKT " & Right(.Cells(i, k), 4)
            End If
            If Left(.Cells(i, k), 2) = "11" Then
                .Cells(i, j) = "NOV " & Right(.Cells(i, k), 4)
            End If
            If Left(.Cells(i, k), 2) = "12" Then
                .Cells(i, j) = "DEZ " & Right(.Cells(i, k), 4)
            End If
        Else
            If Mid(.Cells(i, k), 4, 2) = "01" Then
                .Cells(i, j) = Left(.Cells(i, k), 2) & " JAN " & Right(.Cells(i, k), 4)
            End If
        End If
        If Mid(.Cells(i, k), 4, 2) = "02" Then
            .Cells(i, j) = Left(.Cells(i, k), 2) & " FEB " & Right(.Cells(i, k), 4)
        End If
        If Mid(.Cells(i, k), 4, 2) = "03" Then
            .Cells(i, j) = Left(.Cells(i, k), 2) & " MRZ " & Right(.Cells(i, k), 4)
        End If
        If Mid(.Cells(i, k), 4, 2) = "04" Then
            .Cells(i, j) = Left(.Cells(i, k), 2) & " APR " & Right(.Cells(i, k), 4)
        End If
        If Mid(.Cells(i, k), 4, 2) = "05" Then
            .Cells(i, j) = Left(.Cells(i, k), 2) & " MAI " & Right(.Cells(i, k), 4)
        End If
        If Mid(.Cells(i, k), 4, 2) = "06" Then
            .Cells(i, j) = Left(.Cells(i, k), 2) & " JUN " & Right(.Cells(i, k), 4)
        End If
        If Mid(.Cells(i, k), 4, 2) = "07" Then
            .Cells(i, j) = Left(.Cells(i, k), 2) & " JUL " & Right(.Cells(i, k), 4)
        End If
        If Mid(.Cells(i, k), 4, 2) = "08" Then
            .Cells(i, j) = Left(.Cells(i, k), 2) & " AUG " & Right(.Cells(i, k), 4)
        End If
        If Mid(.Cells(i, k), 4, 2) = "09" Then
            .Cells(i, j) = Left(.Cells(i, k), 2) & " SEPT " & Right(.Cells(i, k), 4)
        End If
        If Mid(.Cells(i, k), 4, 2) = "10" Then
            .Cells(i, j) = Left(.Cells(i, k), 2) & " OKT " & Right(.Cells(i, k), 4)
        End If
        If Mid(.Cells(i, k), 4, 2) = "11" Then
            .Cells(i, j) = Left(.Cells(i, k), 2) & " NOV " & Right(.Cells(i, k), 4)
        End If
        If Mid(.Cells(i, k), 4, 2) = "12 " Then
            .Cells(i, j) = Left(.Cells(i, k), 2) & " DEZ " & Right(.Cells(i, k), 4)
        End If
        
' .............Der folgende Eintrag ändert die Tage 01  bis 09 nach 1 bis 9 .........
      
        If Left(Range("BT" & i), 1) = "0" Then Range("BT" & i) = Mid(Range("BT" & i), 2, 20)
        If Left(.Cells(i, k), 4) = "vor " Then
            .Cells(i, j) = "BEF " & Right(.Cells(i, k), 4)
        End If
        If Left(.Cells(i, k), 5) = "nach " Then
            .Cells(i, j) = "AFT " & Right(.Cells(i, k), 4)
        End If
        If Left(.Cells(i, k), 3) = "um " Then
            .Cells(i, j) = "ABT " & Right(.Cells(i, k), 4)
        End If
        
    End With
End Sub

Mit Select Case sieht das so aus
Code:
Sub Datum2()
    Dim i As Long, j As Long, k As Long, Spalte1 As Range, Spalte2 As Range
    'Geburts Datum
    i = ActiveCell.Row
    With Tabelle1
        Set Spalte1 = .Rows(6).Find("Geburt-Datum")
        If Not Spalte1 Is Nothing Then k = Spalte1.Column
        Set Spalte2 = .Rows(6).Find("Geburt.-.Datum")
        If Not Spalte2 Is Nothing Then j = Spalte2.Column
        If Len(.Cells(i, k)) = 4 Then .Cells(i, j) = .Cells(i, k)
        If Len(.Cells(i, k)) = 7 Then
            Select Case Left(.Cells(i, k), 2)
                Case "01"
                    .Cells(i, j) = "JAN " & Right(.Cells(i, k), 4)
                Case "02"
                    .Cells(i, j) = "FEB " & Right(.Cells(i, k), 4)
                Case "03"
                    .Cells(i, j) = "MRZ " & Right(.Cells(i, k), 4)
                Case "04"
                    .Cells(i, j) = "APR " & Right(.Cells(i, k), 4)
                Case "05"
                    .Cells(i, j) = "MAI " & Right(.Cells(i, k), 4)
                Case "06"
                    .Cells(i, j) = "JUN " & Right(.Cells(i, k), 4)
                Case "07"
                    .Cells(i, j) = "JUL " & Right(.Cells(i, k), 4)
                Case "08"
                    .Cells(i, j) = "AUG " & Right(.Cells(i, k), 4)
                Case "09"
                    .Cells(i, j) = "SEPT " & Right(.Cells(i, k), 4)
                Case "10"
                    .Cells(i, j) = "OKT " & Right(.Cells(i, k), 4)
                Case "11"
                    .Cells(i, j) = "NOV " & Right(.Cells(i, k), 4)
                Case "12"
                    .Cells(i, j) = "DEZ " & Right(.Cells(i, k), 4)
            End Select
        Else
            Select Case Mid(.Cells(i, k), 4, 2)
                Case "01"
                    .Cells(i, j) = Left(.Cells(i, k), 2) & " JAN " & Right(.Cells(i, k), 4)
                Case "02"
                    .Cells(i, j) = Left(.Cells(i, k), 2) & " FEB " & Right(.Cells(i, k), 4)
                Case "03"
                    .Cells(i, j) = Left(.Cells(i, k), 2) & " MRZ " & Right(.Cells(i, k), 4)
                Case "04"
                    .Cells(i, j) = Left(.Cells(i, k), 2) & " APR " & Right(.Cells(i, k), 4)
                Case "05"
                    .Cells(i, j) = Left(.Cells(i, k), 2) & " MAI " & Right(.Cells(i, k), 4)
                Case "06"
                    .Cells(i, j) = Left(.Cells(i, k), 2) & " JUN " & Right(.Cells(i, k), 4)
                Case "07"
                    .Cells(i, j) = Left(.Cells(i, k), 2) & " JUL " & Right(.Cells(i, k), 4)
                Case "08"
                    .Cells(i, j) = Left(.Cells(i, k), 2) & " AUG " & Right(.Cells(i, k), 4)
                Case "09"
                    .Cells(i, j) = Left(.Cells(i, k), 2) & " SEPT " & Right(.Cells(i, k), 4)
                Case "10"
                    .Cells(i, j) = Left(.Cells(i, k), 2) & " OKT " & Right(.Cells(i, k), 4)
                Case "11"
                    .Cells(i, j) = Left(.Cells(i, k), 2) & " NOV " & Right(.Cells(i, k), 4)
                Case "12"
                    .Cells(i, j) = Left(.Cells(i, k), 2) & " DEZ " & Right(.Cells(i, k), 4)
            End Select
        End If
        
' .............Der folgende Eintrag ändert die Tage 01  bis 09 nach 1 bis 9 .........
      
        If Left(Range("BT" & i), 1) = "0" Then Range("BT" & i) = Mid(Range("BT" & i), 2, 20)
        If Left(.Cells(i, k), 4) = "vor " Then
            .Cells(i, j) = "BEF " & Right(.Cells(i, k), 4)
        End If
        If Left(.Cells(i, k), 5) = "nach " Then
            .Cells(i, j) = "AFT " & Right(.Cells(i, k), 4)
        End If
        If Left(.Cells(i, k), 3) = "um " Then
            .Cells(i, j) = "ABT " & Right(.Cells(i, k), 4)
        End If
        
    End With
End Sub
Vor allem wird hier nur einmal LEFT(xxx, 2) bzw. MID(xxx,4, 2) ausgeführt. Das beschleunigt die Durchführung um den Faktor 12. Durch Zuweisung der Monatsnamen zu einer Variablen und Eintragen in die Zelle nach dem Select Case könnte man das noch etwas eleganter machen:
Code:
Sub Datum3()
    Dim i As Long, j As Long, k As Long, Spalte1 As Range, Spalte2 As Range
    Dim s As String
    'Geburts Datum
    i = ActiveCell.Row
    With Tabelle1
        Set Spalte1 = .Rows(6).Find("Geburt-Datum")
        If Not Spalte1 Is Nothing Then k = Spalte1.Column
        Set Spalte2 = .Rows(6).Find("Geburt.-.Datum")
        If Not Spalte2 Is Nothing Then j = Spalte2.Column
        If Len(.Cells(i, k)) = 4 Then .Cells(i, j) = .Cells(i, k)
        If Len(.Cells(i, k)) = 7 Then
            Select Case Left(.Cells(i, k), 2)
                Case "01"
                    s = "JAN "
                Case "02"
                    .Cells(i, j) = "FEB "
                Case "03"
                    s = "MRZ "
                Case "04"
                    s = "APR "
                Case "05"
                    s = "MAI "
                Case "06"
                    s = "JUN "
                Case "07"
                    s = "JUL "
                Case "08"
                    s = "AUG "
                Case "09"
                    s = "SEPT "
                Case "10"
                    s = "OKT "
                Case "11"
                    s = "NOV "
                Case "12"
                    s = "DEZ "
            End Select
            .Cells(i, j) = s & Right(.Cells(i, k), 4)
        Else
            Select Case Mid(.Cells(i, k), 4, 2)
                Case "01"
                    s = " JAN "
                Case "02"
                    s = " FEB "
                Case "03"
                    s = " MRZ "
                Case "04"
                    s = " APR "
                Case "05"
                    s = " MAI "
                Case "06"
                    s = " JUN "
                Case "07"
                    s = " JUL "
                Case "08"
                    s = " AUG "
                Case "09"
                    s = " SEPT "
                Case "10"
                    s = " OKT "
                Case "11"
                    s = " NOV "
                Case "12"
                    s = " DEZ "
            End Select
            .Cells(i, j) = Left(.Cells(i, k), 2) & s & Right(.Cells(i, k), 4)
        End If
        
' .............Der folgende Eintrag ändert die Tage 01  bis 09 nach 1 bis 9 .........
      
        If Left(Range("BT" & i), 1) = "0" Then Range("BT" & i) = Mid(Range("BT" & i), 2, 20)
        If Left(.Cells(i, k), 4) = "vor " Then
            .Cells(i, j) = "BEF " & Right(.Cells(i, k), 4)
        End If
        If Left(.Cells(i, k), 5) = "nach " Then
            .Cells(i, j) = "AFT " & Right(.Cells(i, k), 4)
        End If
        If Left(.Cells(i, k), 3) = "um " Then
            .Cells(i, j) = "ABT " & Right(.Cells(i, k), 4)
        End If
        
    End With
End Sub

Es geht aber noch eleganter, komplett ohne If oder Select Case:
Code:
Sub Datum4()
    Dim i As Long, j As Long, k As Long, Spalte1 As Range, Spalte2 As Range
    'Geburts Datum
    i = ActiveCell.Row
    With Tabelle1
        Set Spalte1 = .Rows(6).Find("Geburt-Datum")
        If Not Spalte1 Is Nothing Then k = Spalte1.Column
        Set Spalte2 = .Rows(6).Find("Geburt.-.Datum")
        If Not Spalte2 Is Nothing Then j = Spalte2.Column
        If Len(.Cells(i, k)) = 4 Then .Cells(i, j) = .Cells(i, k)
        If Len(.Cells(i, k)) = 7 Then
            .Cells(i, j) = UCase(Format("01." & Left(.Cells(i, k), 2) & ".00", "MMM ")) & Right(.Cells(i, k), 4)
        Else
            .Cells(i, j) = Left(.Cells(i, k), 2) & UCase(Format("01." & Mid(.Cells(i, k), 4, 2) & ".00", "MMM ")) & Right(.Cells(i, k), 4)
        End If
        
' .............Der folgende Eintrag ändert die Tage 01  bis 09 nach 1 bis 9 .........
      
        If Left(Range("BT" & i), 1) = "0" Then Range("BT" & i) = Mid(Range("BT" & i), 2, 20)
        If Left(.Cells(i, k), 4) = "vor " Then
            .Cells(i, j) = "BEF " & Right(.Cells(i, k), 4)
        End If
        If Left(.Cells(i, k), 5) = "nach " Then
            .Cells(i, j) = "AFT " & Right(.Cells(i, k), 4)
        End If
        If Left(.Cells(i, k), 3) = "um " Then
            .Cells(i, j) = "ABT " & Right(.Cells(i, k), 4)
        End If
        
    End With
End Sub
Wenn man jetzt noch weiß, dass das deutsche Excel die kurzen Monatsnamen in der siebten benutzerdefinierten Liste hinlegt hat (die englischen sind in Liste 3), dann kann man den länglichen Ausdruck in UCase() noch etwas kürzen: aus UCase(Format("01." & Left(.Cells(i, k), 2) & ".00", "MMM ")) wird dann UCase(arr(--Left(.Cells(i, k), 2)) & " ") bzw. analog dann mit Mid() statt Left().

Und mal so ganz nebenbei bemerkt: ist es nicht etwas inkonsequent, wenn man für die Monatsnamen deutsche Abkürzungen verwendet, aber für die Zeitbereiche englische?
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste