Avatar billede Freja1403 Nybegynder
20. januar 2010 - 14:20 Der er 15 kommentarer og
1 løsning

Hvorfor fungerer "Anvend relative referancer " ikke, hvad gør jeg galt ??

Jeg har i et excelark en kolonne med CPR oplysninger. I kolonnen til højre for ønsker jeg ved hjælp af en makro angivet den tilsvarende fødseldag. Dvs efter indtastning af CPR data flyttes til højre og makro afspilles således at dato skrives.

Det fungerer ved den første række men ved afspilning i anden række kommer igen fødselsdagen fra den første række ??

Inden start af indspilning er "anvend relative referancer" aktiveret.

Makroen ser således ud :

Sub CPRTILDATO()
'
' CPRTILDATO Makro
' ÆNDRE CPR TIL DATO
'

'
    ActiveCell.Offset(0, -1).Range("A1").Select
    Selection.Copy
    ActiveCell.Offset(0, 1).Range("A1").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = "3/17/1968"
    ActiveCell.Offset(1, 0).Range("A1").Select
End Sub
20. januar 2010 - 14:29 #1
Prøv med denne i stedet

Sub CPRTILDATO()
    ActiveCell.Offset(0, -1).Copy destination:=Activecell
    ActiveCell.Offset(1, 0).Select
End Sub
20. januar 2010 - 14:33 #2
Hvilket format har du cpr nummeret stående i?
Avatar billede Freja1403 Nybegynder
20. januar 2010 - 15:18 #3
Hej Thor
Det står som tekst : 120345-0367
Jeg har prøvet dit forslag det virker, bortset fra
at det så blot kopierer resultatet over i næste kolonne..
I min oprindelige makro kopierede jeg cprnr til højre og rettede derefter ved at gå home rykke 2 th indsætte - rykke 2 th indsætte - rykkke 2 th hvorefter jeg deleter 5 gange og indsætter hvorefter dato står som 12-03-1945
Avatar billede jkrons Professor
20. januar 2010 - 15:30 #4
Din makro gør en hel del, som ikke er hensigtsmæssigt :-)

ActiveCell.Offset(0, -1).Range("A1").Select

forudæstter at du altid står i cellen til venstre for den celle, der indeholder cprønummeret, når du afspiller koden.

ActiveCell.FormulaR1C1 = "3/17/1968"

Sørger for at datoen altid bliver den samme i alle celler :-(

Thors løsning virker, eller du kan prøve denne:

Sub CPRTILDATO()
    For Each c In Selection.Cells
        c.Offset(0, 1).Value = Left(c.Value, 2) & "-" & Mid(c.Value, 3, 2) & "-" & Mid(c.Value, 5, 2)
    Next c
End Sub

Her marker du alle de celler, der indeholder cpr-numre, som skal konverteres inden du afspiller makroen. Så indsættes de simultant som datoer i nabokolonnen.
Avatar billede Freja1403 Nybegynder
20. januar 2010 - 17:10 #5
Hej thor og jkrons 
Jeg har nu kombineret jeres 2 forslag til denne makro. Det virker nu bortset fra at når dagen i datoen i CPRnr er mindre eller lig 12, så bliver datoformatet forkert ( der byttes om på dd og mm, men årstal er rigtigt med 4 decimaler), men  er datoen fra 13 til 31, så bliver datoformatet korrekt men dog kun med årstal med 2 decimaler) ??

Makroen ser nu sådan ud :

Sub CPRTILDATO()
'
' CPRTILDATO Makro
' ÆNDRE CPR TIL DATO
'
'
    ActiveCell.Offset(0, -1).Copy Destination:=ActiveCell
    For Each c In Selection.Cells
    c.Value = Left(c.Value, 2) & "-" & Mid(c.Value, 3, 2) & "-" & Mid(c.Value, 5, 2)
    Next c
    ActiveCell.Offset(1, 0).Select
End Sub
20. januar 2010 - 18:21 #6
Så får du det fulde udtræk:

Sub dateextract()
    Dim strCPR As String
    Dim intYear, intMonth, intDay As Integer
    strCPR = Left(ActiveCell.Offset(0, -1), 6)
    intYear = CInt(Right(strCPR, 2))
    If intYear <= Year(Date) - 2000 Then
        intYear = intYear + 2000
    Else
        intYear = intYear + 1900
    End If
    intMonth = CInt(Mid(strCPR, 3, 2))
    intDay = CInt(Left(strCPR, 2))
    ActiveCell.Value = DateSerial(intYear, intMonth, intDay)
End Sub

Den håndterer også cpr numre fra dette årtusinde.
Sig til, hvis du vil have den til at kunne håndtere flere celler (jkrons forslag).
20. januar 2010 - 18:52 #7
Du skal måske lige tilføje
  ActiveCell.Offset(1, 0).Select
i slutningen.

Og så skal du være opmærksom på, at bestemmelsen af fødselsåret går galt, hvis du i dit datasæt har folk født i 1910 eller før.
Avatar billede jkrons Professor
20. januar 2010 - 19:28 #8
thor-> Bare for god ordens skyld ved vi ikke hvilke fødelesdfage, der står i cellerne. Er der nogen fra 18... virker din makro ikke helt :-)

I praksis er det nok uden betydning :-)

Freja-> Din sammenskrivning fungerer sikkert (bortset fra datoernes udseende), men det sløver preocessen at selecte cellerne først, når det ikke er nødvendigt. Men hvis du gerne vil have det, burde du kunne få datoen rigtig på denne måde

Sub CPRTILDATO()
'
' CPRTILDATO Makro
' ÆNDRE CPR TIL DATO
'
'
    ActiveCell.Offset(0, -1).Copy Destination:=ActiveCell
    For Each c In Selection.Cells
    c.Value = Left(c.Value, 2) & "-" & Mid(c.Value, 3, 2) & "-" & Mid(c.Value, 5, 2)
    c.NumberFormat = "dd-mm-yyyy"
    Next c
    ActiveCell.Offset(1, 0).Select
End Sub
20. januar 2010 - 19:32 #9
Hvorfor skulle min makro ikke virke, hvis der er nogle fra 18?
Avatar billede jkrons Professor
20. januar 2010 - 19:48 #10
Makroen kører selvfølgelig, men som jeg ser det, vil den fx altid oversætte

120199-6234 til 12-1-1993

hvilket ikke er hensigtsmæssigt hvis der er tale om en person fra 1899. I øvrigt vil en person med cpr fx 120105-xxxx altid blive opfattet som værende fra 2005, aldrig 1905 - eller er der noget, jeg har overset?

Denne del af koden:

    If intYear <= Year(Date) - 2000 Then
        intYear = intYear + 2000
    Else
        intYear = intYear + 1900
    End If

gør så vidt jeg kan gennemskue det, at hvis året i cpr-nummeret er mindre end aktuelt år (2 cifre) går den ud fra, at der er tale om 2000, ellers går den ud fra, at der er tale om 1900, men det er jo ikke givet.
Avatar billede jkrons Professor
20. januar 2010 - 19:50 #11
Og så burde jeg tilføje at min egen kode har samme skavank :-(
20. januar 2010 - 19:56 #12
Ja, vi kan jo ikke gætte om 120199-6234 er fra 1899 eller 1999, men min kode vil nu oversætte til 12/1-1999 (og ikke 1993, som du skriver).

Man må naturligvis ud fra karakteren af de CPR data man har vurdere om 05 skal oversættes til 2005 eller 1905, men det tror jeg Freja har styr på :-)
Avatar billede Freja1403 Nybegynder
20. januar 2010 - 21:58 #13
Nu virker det perfekt. Tak for hjælpen - jeg går ud fra at du ar fået dine point automatisk ellers må du fortælle hvordan dette afregnes Mvh
Avatar billede jkrons Professor
20. januar 2010 - 23:41 #14
thor svarer og du accepterer hans svar, så får han sine point.
Avatar billede jkrons Professor
21. januar 2010 - 00:49 #15
thor-> Vi kan faktisk godt vide (ikke gætte) om  120199-6234 er 1899 eller 1999. Det er 1899. Her er en makro, som kan

Sub TilDato()
        Dim bytCent As Byte
        Dim bytSevdig As Byte
        Dim bytCprYear As String
        Dim CprTilDato As Date
        bytSevdig = Mid(ActiveCell.Value, 8, 1)
        bytCprYear = Mid(ActiveCell.Value, 5, 2)
        Select Case bytSevdig
            Case 0 To 3
                bytCent = 19
            Case 4, 9
                If bytCprYear <= 36 Then
                    bytCent = 20
                Else
                    bytCent = 19
                End If
            Case 5 To 8
                If bytCprYear <= 36 Then
                    bytCent = 20
                ElseIf bytCprYear >= 58 Then
                    bytCent = 18
                End If
            End Select
        CprTilDato = Left(ActiveCell.Value, 2) & "-" & Mid(ActiveCell.Value, 3, 2) & "-" & bytCent & bytCprYear
        ActiveCell.Offset(0, 1) = Format(CprTilDato, "dd-mm-yyyy")
End Sub

Den er baseret på at at markøren står i cellen med cpr-nummeret, når makroen afspilles. Så skrives den rigtige fødselesdag i cellen ved siden af.

Da Excel imidlertid ikke "forstår" datoer føre 1-1-1900 vil datoer, der er ældre end dette blive skrevet som tekst, ikke som datoer, hvilket bedst ses på cellejusteringen.
21. januar 2010 - 06:47 #16
Ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester