20. januar 2010 - 14:20Der 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
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
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.
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
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
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.
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.
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.