Avatar billede folj Forsker
28. januar 2019 - 13:58 Der er 7 kommentarer og
2 løsninger

Hjælp til Array i VBA, Excel

Jeg vil gerne gennemløbe den kolonne jeg har med datoer og finde der hvor der er noget galt.

Datoerne stiger med en for hver række, med et eller andet sted er der en fejl, som jeg gerne vil finde med min test.

Jeg vil gennemløbe kolonnen og finde der hvor dato ikke er froøget med 1.
Jeg har startet med at lave et genneløb, og det remser datoerne op.

Jeg vil gerne tilføje en test og teste om den nu er steget med 1 eller oom vi har en fejl. gerne med nedenstående sub som udgangspunkt.

Sub TestNextDate()
Dim DateArray As Variant

DateArray = Range("A6:A398")

For i = 1 To 398
MsgBox DateArray(i, 1)
Next I

End Sub


Jeg kender godt lødningen på hvordan man via en formel sikrer at dato stiger med 1 hver gang, men mit sheet er ikke konsekvent på det område.
I kolonnen burges formlen: =A17+1, men det er ikke konsekvent, og der er fejl indimellem, hvor brugeren har kopieret datoer som en serie.

Hvem kan hjælpe med at lave en test-sub.
Avatar billede finb Ekspert
28. januar 2019 - 14:20 #1
for each SingleDay in DateArray
  if SingleDay-SingleDay.offset(1,0)<>1 then msgbox "Her er en fejl"
next
Avatar billede Jan Hansen Ekspert
28. januar 2019 - 14:36 #2
Sub TestNextDate()
Dim DateArray As Variant

DateArray = Range("A6:A398")

For i = 1 To 397
  if not DateArray(i, 1)=DateArray(i+1, 1)+1 Then
      MsgBox "Fejl i A" & i+6
  End if
Next I

End Sub
Avatar billede Jan Hansen Ekspert
28. januar 2019 - 14:38 #3
Ups if not DateArray(i, 1)=DateArray(i+1, 1)+1 Then rettes til

if not DateArray(i, 1)=DateArray(i+1, 1)-1 Then
Avatar billede Dan Elgaard Ekspert
28. januar 2019 - 15:57 #4
Jeg ser tit den der formel...

=A17+1

...hvor man ønsker, at næste række skal stige med 1, men den formel er ikke særlig god - bla. på grund af den fejl, som du beskriver.

Hvis man sletter eller indsætter en række, går det osse galt.

En langt bedre formel er:

=MAKS($A$1;$A17)+1

Den formel vil eliminere mange af de fejl, som den anden formel giver.

Og, man behøver ikke teste, men kan blot i celle A2 skrive:

==MAKS($A$1;$A1)+1

...og, trække formlen lige så langt nedad, som der er behov for.
Avatar billede jens48 Ekspert
28. januar 2019 - 18:46 #5
Hej Dan,
God pointe, men skulle det ikke have været:
=MAKS($A$1:$A17)+1
(kolon i stedet for semikolon)?
Avatar billede Dan Elgaard Ekspert
29. januar 2019 - 08:40 #6
#5: Naturligvis - "Too many fingers on keyboard' error :-)
Avatar billede folj Forsker
29. januar 2019 - 10:22 #7
Takker for hjælpen Jan Hansen.

Det blev din løsning jeg tog til mig for tilforskel fra finb's forslag så har du den linie med der fortæller mig I hvilken række fejlen er fundet.

Takker for di indsats.
Avatar billede folj Forsker
29. januar 2019 - 10:24 #8
@Dan Elgaard:
Dit forbedringsforskal til formelen har jeg også taget til mig.

taker for dit bidrag også...
Avatar billede folj Forsker
29. januar 2019 - 11:24 #9
Selvom forslaget virkede på mit sheet, (og det var opgaven afgrænset til) så var det ikke så fleksibelt i forhold til hvor mange rækker skal der løbes igennem, og hvor mange HeaderRows er der i spil. Derfor videreudviklede jeg lidt på proceduren, så nu vil antal loops passe sammen med antallet af rækker.
Sub TestNextDate()

Dim DateArray As Variant
Dim LastRowNr As Integer
Dim HeaderRows As Integer
Dim DateRng As String

HeaderRows = 6
LastRowNr = Range("A65536").End(xlUp).Row
DateRng = Range(Cells(1, 1), Cells(LastRowNr, 1)).Address

DateArray = Range(DateRng)
AntalLoops = LastRowNr - HeaderRows

For i = HeaderRows To AntalLoops
If Not DateArray(i, 1) = DateArray(i + 1, 1) - 1 Then
    MsgBox "Fejl i A" & i + 1
  End If
Next i

End Sub
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

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