Sigdal Skrevet 21. september 2008 Del Skrevet 21. september 2008 (endret) 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 21. september 2008 av Sigdal Lenke til kommentar
Harald Staff Skrevet 22. september 2008 Del Skrevet 22. september 2008 Prøv Do While Cells(n, 1).Value <> "" eller Do While Not IsEmpty(Cells(n, 1)) HTH. Beste hilsen Harald Lenke til kommentar
Sigdal Skrevet 22. september 2008 Forfatter Del Skrevet 22. september 2008 (endret) 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 22. september 2008 av Sigdal Lenke til kommentar
Sigdal Skrevet 23. september 2008 Forfatter Del Skrevet 23. september 2008 (endret) 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 23. september 2008 av Sigdal Lenke til kommentar
Alexen Skrevet 23. september 2008 Del Skrevet 23. september 2008 MY EYES. THEY BUUURN! (enbokstavsvariabler er no herk Du har en løkke, som inni seg har 3 nye løkker.. Viss ingen av de løkkene kjøres så vil aldri N endres såvidt jeg kan se og dermed vil alt kjøre og kjøre og kjøre. Lenke til kommentar
Harald Staff Skrevet 23. september 2008 Del Skrevet 23. september 2008 (endret) 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 23. september 2008 av Harald Staff Lenke til kommentar
Alexen Skrevet 23. september 2008 Del Skrevet 23. september 2008 En annen ting. Hvorfor "Do While (Dato2 - Dato1) = 0 '1) Dato1=Dato2".. og ikke "Do While Dato2 = Dato1 ? Lenke til kommentar
Sigdal Skrevet 23. september 2008 Forfatter Del Skrevet 23. september 2008 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
HDSoftware Skrevet 24. september 2008 Del Skrevet 24. september 2008 ...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
Harald Staff Skrevet 24. september 2008 Del Skrevet 24. september 2008 (endret) 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 24. september 2008 av Harald Staff Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå