Alex5358 Novice
09. april 2018 - 09:23 Der er 37 kommentarer

Hjælp til VBA

Hej eksperter.
Jeg har et problem med VBA jeg ikke kan løse.
Jeg har opgivet dato som tekst i fomat yymmdd. Og ønsker at konvertere dette til ddmmyyyy (dansk format). Hvordan får jeg lavet et system der kan tage fra første entry til sidste entry  fra d2 til sidste entry) og konvertere det til en ny søjle (e2 og ned til sidste). Systemet skal kunne køre kunne håndtere der bliver tilføjet datoer gennem tiden.

VH Alex
kim1a Guru
09. april 2018 - 09:42 #1
Hej Alex

Jeg har før med succes brugt funktionen date i vbaen, Arbejder du med kolonnen udover denne udfordring?

Det jeg spørger om, er skal du have en komplet løsning, eller har du f.eks. allerede har styr på loop mv.?
Alex5358 Novice
09. april 2018 - 09:44 #2
Hej Kim. Jeg har siddet og prøvet alt muligt med uden noget endeligt...
Det ville være fantastisk hvis du kunne skrive et system til mig.

Vh Alex
Alex5358 Novice
09. april 2018 - 09:47 #3
Yderligere fik jeg ikke skrevet at systemet selfølgelig skal kunne tjekke om datoen til at starte med i d2 og ned er "forkert" format og derfor skal konvertere det.
finb Ekspert
09. april 2018 - 10:37 #4
Utestet:
=day(cdate(yymmdd)) & month(cdate(yymmdd)) & year(cdate(yymmdd))
Alex5358 Novice
09. april 2018 - 10:45 #5
Den forstår jeg ikke finb.
Der skal laves en sub/function i vba der kan klare opgave.
kim1a Guru
09. april 2018 - 12:01 #6
Jeg ligger mig op ad finb, dermed også utestet:

Sub test()

Dim DatDato As Date
Dim intRow As Integer
Dim intNumRows As Integer

intNumRows = Range("D1", Range("D1").End(xlDown)).Rows.Count

ScreenUpdating = False
For intRow = 1 To intNumRows
Cells("E" & intNumRows).Value = Day(CDate(yymmdd)) & Month(CDate(yymmdd)) & Year(CDate(yymmdd))

Next intNumRows

End Sub
kim1a Guru
09. april 2018 - 12:08 #7
Hov - det var da noget vås - øjeblik
kim1a Guru
09. april 2018 - 12:56 #8
Sub test()

Dim DatDato As Date
Dim intRow As Integer
Dim intNumRows As Integer

intNumRows = Range("D1", Range("D1").End(xlDown)).Rows.Count

ScreenUpdating = False
For intRow = 1 To intNumRows
DatDato = Cells("D" & intNumRows).Value
Cells("E" & intNumRows).Value = Day(DatDato) & Month(DatDato) & Year(DatDato)

Next intNumRows

End Sub
Alex5358 Novice
09. april 2018 - 14:19 #9
Hej Kim.

Når jeg anvender Sub´en siger den således.
"Der opstod en kompileringsfejl:
Referencen til en Next-kontrolvariabel er ugyldig"
kim1a Guru
09. april 2018 - 23:41 #10
Ja, der er nok lidt for mange tåbeligheder, dumt at lave den på arbejde :-)

Tror jeg fik den rettet nu:

Sub test()

Dim DatDato As Date
Dim intRow As Integer
Dim intNumRows As Integer

intNumRows = Range("D1", Range("D1").End(xlDown)).Rows.Count

ScreenUpdating = False
For intRow = 1 To intNumRows
DatDato = Cells("D" & intRow).Value
Cells("E" & intRow).Value = Day(DatDato) & Month(DatDato) & Year(DatDato)

Next intRow

End Sub
Alex5358 Novice
10. april 2018 - 08:20 #11
Nu kommer der en fejl ved:
ScreenUpdating = False

"Der opstod en kompileringsfejl:
Variablen er ikke defineret"
kim1a Guru
10. april 2018 - 09:02 #12
Der mangler application. foran
Alex5358 Novice
10. april 2018 - 10:10 #13
Så sker der fejl i
DatDato = Cells("D" & intRow).Value
"fejl 5: Procedure kaldet eller argumentet er ugyldigt"
kim1a Guru
10. april 2018 - 17:07 #14
Nu tvang du mig til at teste det - troede du selv kunne lidt :-)

Sub test()

Dim DatDato As Date
Dim intRow As Integer
Dim intNumRows As Integer

intNumRows = Range("D1", Range("D1").End(xlDown)).Rows.Count

Application.ScreenUpdating = False
For intRow = 1 To intNumRows
DatDato = Range("D" & intRow).Value
Range("E" & intRow).Value = Format(Right(DatDato, 2) & "-" & Left(Right(DatDato, 4), 2) & "-" & Left(DatDato, 2), "DD-MM-YYYY")

Next intRow

End Sub
Alex5358 Novice
10. april 2018 - 17:46 #15
Pisse fedt!
Det virker næsten.
nu konvertere systemet til datoer men ikke alle steder.
Der kommer lange sekvenser hvor den ikke konvertere noget som helst. og efter den sidste aktive celle der står noget i så skriver den bare 00-00-00 derned ad.
kim1a Guru
10. april 2018 - 18:40 #16
Er der ophold i din liste i kolonne D? Måske data langt ned?
Alex5358 Novice
10. april 2018 - 18:45 #17
Nej ingen af tingen. selv hvis jeg taget et helt nyt sæt data sker det stadig ..
kim1a Guru
10. april 2018 - 22:56 #18
Det giver ikke mening. VBAen tæller hvormange celler med indhold der er i kolonne D og tager derefter række for række fra 1 til det tal den når til og arbejder igennem. Det er klart hvis der er tomt i enkelte celler i D så vil den skrive 00-00-00. Du bliver nødt til at uploade det et sted for at vi kan fejlsøge - det virker fint hos mig.
Alex5358 Novice
10. april 2018 - 23:02 #19
suben viser ingen fejl. dog kan jeg konstatere der er en fejl et sted eftersom når den bliver eksekveret gør den det ikke for alt plus den fortsætter med 00-00-00.
04-03-15   
11-09-01   
15-09-01   
16-02-01   
17-09-01   
17-09-01   
17-02-01   
16-09-01   
10-09-01   
17-09-01   
13-09-01   
16-09-01   
15-09-01   
17-09-01   
15-02-01   
14-09-01   
16-09-01   
17-09-01   
16-09-01   
16-09-01    01-09-2016
16-09-01    01-09-2016
17-09-01    01-09-2017
15-09-01    01-09-2015
16-09-01    01-09-2016
15-09-01    01-09-2015
17-09-01    01-09-2017
16-09-01    01-09-2016
15-09-01    01-09-2015
16-09-01   
17-09-01
Alex5358 Novice
10. april 2018 - 23:03 #20
fra at en ikke konvertere noget som ovenstående til den gør det igen så er vi 2000 rækker nede i arket.
kim1a Guru
10. april 2018 - 23:19 #21
Hvad kender du til vba? Kan du prøve at løbe den igennem via F8 og se hvilket tal den tæller til intNumRows?

Du kan også vælge i immidiate og skrive
?Range("D1", Range("D1").End(xlDown)).Rows.Count og så se hvad den skriver.

Derudover er det meget mystisk at den efterlader noget tomt, men jeg bemærker nu at du skriver D som YY-MM-DD og ikke YYMMDD som du skrev i første indlæg. Det ændrer jo på den måde jeg har skrevet hvordan den skal fange hver del på.
Alex5358 Novice
10. april 2018 - 23:45 #22
Ved at skrive
Range("D1", Range("D1").End(xlDown)).Rows.Count
I immidiate vinduet skriver den:
"Der opstod en kompileringsfejl:
Brugen af egenskaben er ugyldig"
Alex5358 Novice
10. april 2018 - 23:48 #23
hvis jeg der imod skriver
?Range("D1", Range("D1").End(xlDown)).Rows.Count
får jeg
18287 (rows)
kim1a Guru
12. april 2018 - 07:46 #24
Godt så, Excel læser dit dokument som om du har 18287 rækker i dit ark - er det også tilfældet som du ser det?
Alex5358 Novice
12. april 2018 - 11:32 #25
Ja det stemmer med hvad der er når jeg selv ser efter
kim1a Guru
12. april 2018 - 12:57 #26
Så langt så godt. Derfor skulle den også arbejde ned til bund. Udfordringen er så denne del:
Derudover er det meget mystisk at den efterlader noget tomt, men jeg bemærker nu at du skriver D som YY-MM-DD og ikke YYMMDD som du skrev i første indlæg. Det ændrer jo på den måde jeg har skrevet hvordan den skal fange hver del på.

Jeg tror som sagt det vil være nemmest hvis du kan anonymisere data og sende mig et eksempel. Skriv evt. din mail i en besked så kan vi tage den der.
Sara9 Juniormester
17. maj 2018 - 00:43 #27
Hej

Jeg har samme opgave og har prøvet at skrive det ind i VBA, men den siger "Run-time error '13' : Type mismatch" og derefter markerer dette:

DatDato = Range("D" & intRow).Value

Har skrevet præcis som #14
kim1a Guru
17. maj 2018 - 20:09 #28
Har du defineret intRow? Du skal have det hele med:

For intRow = 1 To intNumRows
DatDato = Range("D" & intRow).Value
Range("E" & intRow).Value = Format(Right(DatDato, 2) & "-" & Left(Right(DatDato, 4), 2) & "-" & Left(DatDato, 2), "DD-MM-YYYY")
Next intRow

Du kan evt. bruge intRow = 1 To 100 hvis du ikke vil definere antal gentagelser som dynamisk.
Sara9 Juniormester
19. maj 2018 - 15:56 #29
Har skrevet præcis det sammen, men gider stadig ikke. Mine tal starter fra D2 til D18287. Dog skal de rigtige datoer stadig være i sølje D.
kim1a Guru
19. maj 2018 - 16:39 #30
Den her læser tal i D kolonnen og sætter dem ind i E.

Kan du prøve at "steppe" i makroen? F8 bruger man, så tager den en linje ad gangen og du kan læse hvilke variabler den bruger, herunder hvordan datDato ser ud og om den fanger intNumRows. Fortæl os hvad de to værdier er når du stepper.
Sara9 Juniormester
19. maj 2018 - 22:12 #31
IntNumRows=18288
DatDato=00:00:00
kim1a Guru
20. maj 2018 - 09:56 #32
Så det er datoen den er galt med. Har du kolonne overskrifter? Måske den ikke skal starte med intRow = 1, men 2?
Det kan også være at dine data i kolonne D har et format der ikke matcher hvad vbaen er sat op til. Prøv at vise starten af kolonne D - bare de første 5-7 rækker.
Sara9 Juniormester
20. maj 2018 - 11:52 #33
Ja har kolonne overskrifter, som sagt starter min fra D2. Har også prøvet at rette det uden held.

04-03-15
11-09-01
15-09-01
16-02-01
17-09-01
17-09-01
kim1a Guru
20. maj 2018 - 16:00 #34
Du skal nok lave DatDato om til en string, ser ud til at dine data ikke opfører sig på samme måde som de tidligere.
Sara9 Juniormester
20. maj 2018 - 16:44 #35
Tak for hjælpen det hjalp, dog skriver den det lidt mærkeligt op. Jeg skal have det DD-MM-YYYY, og den skriver det sådan:

15-3--04
01-9--11
01-9--15
01-2--16
01-9--17
01-9--17
01-2--17
kim1a Guru
20. maj 2018 - 19:41 #36
Ja, for den forstår ikke dit input - dine data ser ikke ud til at være registreret som datoer.

Du skal ud i en anden løsning a la denne (utestet)
Range("E" & intRow).Value = Format(Right(DatDato, 2) & "-" & Mid(DatDato, 4,2) & "-" & Left(DatDato, 2), "DD-MM-YYYY")

Jeg ved ikke hvordan dine oprindelige data vender, så det kan være det skal vende omvendt - er du med på hvad der sker?
Sara9 Juniormester
20. maj 2018 - 19:48 #37
Yes det hjalp tusind tak for hjælpen. :)
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

Opret Preview

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





Premium
Ny Chrome-version kan føre til et gennembrud for PWA'erne: Google og Microsoft satser på denne nye type apps
Progressive web apps - eller PWA’er - kommer du til at høre meget mere til. Både Microsoft og Google har kastet deres kærlighed på disse apps. Se her, hvad de to selskaber ser i PWA’erne.
Computerworld
Google indfører Android-gebyr efter kæmpe EU-bøde: Android-producenter skal nu betale for brug af Google-tjenester
Efter sommerens kæmpe EU-bøde indfører Google licensbetaling for Android-producenters brug af blandt andet Play Store. Men "Android vil forblive gratis og open source," lyder det fra selskabet.
CIO
Forleden reparerede en mekaniker min bil: Det kostede 4.200 kroner, som min hjerne snød mig til at betale med et smil
De rationelle it-beslutninger du træffer er måske en illusion. Det lærte jeg da min bil gik i stykker og min hjerne snød mig til at tro, at alt var fint. Til gengæld fandt jeg tre fælder dine it-beslutninger kan falde i.
Job & Karriere
Her er syv job-annoncer der overrasker med helt usædvanlige overskrifter
Der er mange ledige it-job i øjeblikket. It-jobbank har her fundet syv spændende stillinger, der har det til fælles, at annoncen har en utraditionel overskrift.
White paper
Gartners anbefalinger til at højne din virksomheds it-sikkerhed
Du har en strategi om at sikre din virksomheds data - og i den kæde kan medarbejderne udgøre det svage led. Men der er mange ting, du kan gøre. Læs dette whitepaper fra Gartner, som giver dig netop de råd, du måske står og mangler. Du kan også se, hvilke løsninger Gartner anbefaler til at højne it-sikkerheden.