Gå til innhold

Loop som aldri terminerer


Anbefalte innlegg

Hei,

 

dette er skrevet i VB (for MS Excel). Programmet skal sortere kolonner og telle seg nedover helt til det kommer til en tom celle (n øker). Er det noen som kan se hvorfor loopen ikke terminerer når den når kolonneende?

På forhånd takk!

S

 

 

KODE:

Sub Makro1()

 

Dim Dato1 As Date, Dato2 As Date

Dim n!, m!, o!

n = 6

m = 6

o = 6

Dato1 = Cells(n, 1)

Dato2 = Cells(m, 3)

 

Cells(5, 8) = Cells(5, 2)

Cells(5, 9) = Cells(5, 4)

 

Do While Cells(n, 1) <> Empty '<------------------- PROBLEM : Loopen stopper IKKE på denne betingelsen !!!!

 

Do While (Dato2 - Dato1) = 0 '1) Dato1=Dato2

Cells(o, 7) = Cells(n, 1)

Cells(o, 8) = Cells(n, 2)

Cells(o, 9) = Cells(m, 4)

n = n + 1

m = m + 1

o = o + 1

Dato1 = Cells(n, 1)

Dato2 = Cells(m, 3)

Loop

 

Do While (Dato2 - Dato1) < 0 '2) Dato1>Dato2

m = m + 1

Dato2 = Cells(m, 3)

Loop

 

Do While (Dato2 - Dato1) > 0 'eller 3) Dato1<Dato2

n = n + 1

Dato1 = Cells(n, 3)

Loop

 

Loop

 

End Sub

Endret av Sigdal
Lenke til kommentar
Videoannonse
Annonse

Hei Harald,

 

Jeg har prøvd begge alternativene dine uten hell. Angående det første alternativet ditt betyr ikke .value endingen siden dette er defaultmethod på Cells() objektet. Jeg har brukt det tidligere i flere liknende program tidligere med hell, derfor lurer jeg på om det er noe i denne programstrukturen som gjør at betingelsen aldri testes? Er litt trøtt nå, må se på det senere... Min Excel er versjon2003.

 

Så langt, uten hell, altså.

 

mvh Sigdal

Endret av Sigdal
Lenke til kommentar

Veldig rart dette, selvom jeg setter inn betingelse

 

Do While n < 500

 

så fortsetter loopen, dvs betingelsen blir aldri evaluert. Noen som kan se hva som er feil?

PS: Hvordan setter man inn koden her så den blir formattert med riktig innrykk?

Endret av Sigdal
Lenke til kommentar

Det er uråd å se uten å ha et ark med reelt innhold eller god forståelse av hva dette er ment å gjøre. Programmatisk er det ingenting i veien for å skrive noe sånt som

Do While 400 < 500

men den kommer jo til å kjøre i evigheter.

 

Du skal også vokte deg for å sjekke om x-y=0. Enkelte matematiske resultater gir avrundingsfeil, f.eks en bitteliten desimal forskjellig fra 0. Bruk heller noe sånt som

Abs(x-y) < 0.5

 

Innrykk: Det er en knapp som heter "wrap in code tags" over der du skriver.

 

HTH. Beste hilsen Harald

Endret av Harald Staff
Lenke til kommentar

Hei Folkens

 

da fant jeg det ut. Det var den første sub-loopen som kjørte og kjørte... Ordnet nå:)

 

TheViper: "En annen ting. Hvorfor "Do While (Dato2 - Dato1) = 0 '1) Dato1=Dato2".. og ikke "Do While Dato2 = Dato1 ?" Svar: Du har helt rett. Kun et resultat av rask programmering en sen søndag kveld:)

 

Sigdal

Lenke til kommentar
...

Du skal også vokte deg for å sjekke om x-y=0. Enkelte matematiske resultater gir avrundingsfeil, f.eks en bitteliten desimal forskjellig fra 0. Bruk heller noe sånt som

Abs(x-y) < 0.5

...

Mener du dette?

Er ikke dette veldig avhengig av datatyper? Er vel kun float som har dette problemet vel? Og float er vel ikke så mye brukt med mindre man virkelig trenger å bruke float. Jeg personlig liker å holde meg til heltall eller decimal datatyper med fast begrensning

 

eks (c#):

bool IsNull(int a, int b)
{
 if((a - b) = 0)
return true;
 else
return false;
}

Dette tør jeg sette en tier på at ALDRI vil feile

Lenke til kommentar

Nå opererer vi i VBA, dvs VB6. Flytende desimaltall med størst oppløsning er Double og Date. Siden vi opererer med datoer her så er ikke heltallstyper noe godt alternativ til Date.

 

Edit: I dette aktuelle tilfellet sammenligner koden celleinnhold i et regneark, de lastes ikke inn i deklarerte variabler først. Da er datatypen regnearkceller, og de har sine litt spesielle egenskaper /Edit

 

Prøv å kjøre denne lille koden i Word eller Excel:

 

Sub test()

MsgBox (1 / 10) - 0.1

End Sub

 

Beste hilsen Harald

Endret av Harald Staff
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...