Avatar billede mt_tn Nybegynder
23. november 2009 - 15:00 Der er 7 kommentarer og
1 løsning

køre igennem alle ulige og lige numre

Hej
Jeg har samme problem som mercu:
http://www.eksperten.dk/spm/893123

Hvis nu jeg har fire CPR-numre udskrevet lige efter hinanden i en kolonne:

281058-0008
281058-0009
281058-0010
281058-0011

hvordan kan jeg så få kvindernes CPR-numre med et lige tal til at stå på en kolonne for sig og det samme med mændenes bare med et ulige tal? Altså sådan her:

      A                            B
281058-0008                281058-0009
281058-0010                281058-0011

Jeg ved bare ikke hvordan jeg skal skrive det op i min kode.
Avatar billede tjacob Juniormester
23. november 2009 - 15:39 #1
Dim rAlle As Range, rM As Range, rK As Range, rCell As Range

Set rAlle = Range("A1:A10")    <<<<< ændres til din range med numre
Set rM = Range("B1")              < ændres til hvor mænd starter
Set rK = Range("C1")              < ændres til hvor kvinder starter
For Each rCell In rAlle.Cells
    If CLng(Right(rCell.Value,1)) Mod 2 = 1 Then
        rM.Value = rCell.Value
        Set rM = rM.Offset(1,0)
    Else
        rK.Value = rCell.Value
        Set rK = rK.Offset(1,0)
    End If
Next
Avatar billede mt_tn Nybegynder
23. november 2009 - 16:27 #2
Ok, mange tak :) det hjalp lidt på det.
Men må jeg lige spørge hvad "CLng" står for? Det er det jeg ikke lige forstår.
Avatar billede tjacob Juniormester
23. november 2009 - 16:36 #3
Clng() er en Type konvertering til typen Long

I dette tilfælde er Right(rCell.Value,1) en String. For at kunne lave en Mod beregning på den skal den konverteres til et tal -en Long.

Nu er VBA et meget "sløset" sprog, så det er ikke sikkert det er nødvendigt, men man kan jo lige så godt kode korrekt!
Avatar billede mt_tn Nybegynder
23. november 2009 - 16:43 #4
Ok nu forstår jeg.
Lige et spørgsmål til. Hvis jeg nu ikke ved hvor mange CPR-numre der er (medmindre jeg kører koden), kan jeg så skrive dette anderledes? :
Set rAlle = Range("A4:?")
Avatar billede tjacob Juniormester
23. november 2009 - 16:57 #5
Ja. Du kan bruge End-metoden:

Dim i as Long

i = Range("A4").End(xlDown).Row
Her findes den sidste række i kolonne A, fra række 4 og ned, der indeholder data. Hvis der er et hul i kolonnen vil den stoppe der.

Man kan også:

i = Range("A65535").End(xlUp).Row
Finder den første række i kolonne A, fra række 65535 og op, der indeholder data.

Så i dit tilfælde ville jeg gøre sådan:
Dim i as Long
i = Range("A4").End(xlDown).Row
Set rAlle = Range("A4:A" & CStr(i))

-Her er en anden type konvertering: i er et tal, men skal inputtes i rangen som en streng, så vi bruger CStr().

PS: tillader mig at lægge svar.
Avatar billede mt_tn Nybegynder
23. november 2009 - 19:28 #6
Ok.. men hvad så hvis jeg allerede har deklareret i som integer?
Skal jeg så give "i" i dette tilfælde et andet navn eller sådan noget?

Jeg er ny herinde. Så hvordan giver man point?
Avatar billede tjacob Juniormester
23. november 2009 - 19:34 #7
Hvis i ikke skal bruges yderligere er alt OK.
Ellers lav en anden variabel......

For at give point skal du acceptere mit svar.
Se evt her: http://www.eksperten.dk/faq#faq-3-1
Avatar billede mt_tn Nybegynder
23. november 2009 - 19:49 #8
Ok.. har accepteret dig svar og givet dig point. Mange tak for hjælpen!
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
Kurser inden for grundlæggende programmering

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