Avatar billede StefanMoberg Nybegynder
20. december 2010 - 19:37 Der er 3 kommentarer og
1 løsning

Fejl i output..

Hej,

Jeg er ret ny til VBA, og har problemer i forbindelse med et udtræk af data.

Jeg har en ret stor mængde data, hvor jeg skal finde antal værdier der lever op til følgende værdier i 3 kolonner:

- mere end x antal dage siden start
- enten SDP1 eller SDP2
- større eller lig med 24

Sub jvx()
Dim LastRow As Integer
Dim Gruppe00 As Double, Gruppe04 As Double, Gruppe08 As Double, Gruppe13 As Double
Dim Gruppe17 As Double, Gruppe21 As Double, Gruppe26 As Double, Gruppe30 As Double
Dim Gruppe34 As Double, Gruppe39 As Double, Gruppe43 As Double, Gruppe47 As Double
Dim Gruppe52 As Double, Gruppe104 As Double

Application.ScreenUpdating = False

With Sheets("Rådata")
        LastRow = .Cells(.Rows.Count, "a").End(xlUp).Row
    End With

ActiveWorkbook.Sheets("Rådata").Activate
 
    For i = 1 To LastRow
             
        If Range("o" & i) = "SDP1" Or Range("o" & i) = "SDP2" And _
          Range("q" & i) >= "24" Then
          Gruppe00 = Gruppe00 + 1
        End If
       
        If Range("k" & i) >= "28" And _
          Range("o" & i) = "SDP1" Or Range("o" & i) = "SDP2" And _
          Range("q" & i) >= "24" Then
          Gruppe04 = Gruppe04 + 1
        End If
       
        If Range("k" & i) >= "56" And _
          Range("o" & i) = "SDP1" Or Range("o" & i) = "SDP2" And _
          Range("q" & i) >= "24" Then
          Gruppe08 = Gruppe08 + 1
        End If
       
        If Range("k" & i) >= "91" And _
          Range("o" & i) = "SDP1" Or Range("o" & i) = "SDP2" And _
          Range("q" & i) >= "24" Then
          Gruppe13 = Gruppe13 + 1
        End If
       
        If Range("k" & i) >= "119" And _
          Range("o" & i) = "SDP1" Or Range("o" & i) = "SDP2" And _
          Range("q" & i) >= "24" Then
          Gruppe17 = Gruppe17 + 1
        End If
       
        If Range("k" & i) >= "147" And _
          Range("o" & i) = "SDP1" Or Range("o" & i) = "SDP2" And _
          Range("q" & i) >= "24" Then
          Gruppe21 = Gruppe21 + 1
        End If
       
        If Range("k" & i) >= "182" And _
          Range("o" & i) = "SDP1" Or Range("o" & i) = "SDP2" And _
          Range("q" & i) >= "24" Then
          Gruppe26 = Gruppe26 + 1
        End If
       
        If Range("k" & i) >= "210" And _
          Range("o" & i) = "SDP1" Or Range("o" & i) = "SDP2" And _
          Range("q" & i) >= "24" Then
          Gruppe30 = Gruppe30 + 1
        End If
       
        If Range("k" & i) >= "238" And _
          Range("o" & i) = "SDP1" Or Range("o" & i) = "SDP2" And _
          Range("q" & i) >= "24" Then
          Gruppe34 = Gruppe34 + 1
        End If
       
        If Range("k" & i) >= "273" And _
          Range("o" & i) = "SDP1" Or Range("o" & i) = "SDP2" And _
          Range("q" & i) >= "24" Then
          Gruppe39 = Gruppe39 + 1
        End If
       
        If Range("k" & i) >= "301" And _
          Range("o" & i) = "SDP1" Or Range("o" & i) = "SDP2" And _
          Range("q" & i) >= "24" Then
          Gruppe43 = Gruppe43 + 1
        End If
       
        If Range("k" & i) >= "329" And _
          Range("o" & i) = "SDP1" Or Range("o" & i) = "SDP2" And _
          Range("q" & i) >= "24" Then
          Gruppe47 = Gruppe47 + 1
        End If
       
        If Range("k" & i) >= "364" And _
          Range("o" & i) = "SDP1" Or Range("o" & i) = "SDP2" And _
          Range("q" & i) >= "24" Then
          Gruppe52 = Gruppe52 + 1
        End If
       
        If Range("k" & i) >= "725" And _
          Range("o" & i) = "SDP1" Or Range("o" & i) = "SDP2" And _
          Range("q" & i) >= "24" Then
          Gruppe104 = Gruppe104 + 1
        End If
       
           
    Next i
         
ActiveWorkbook.Sheets("Ark2").Activate

    Range("c5") = Gruppe00
    Range("c6") = Gruppe04
    Range("c7") = Gruppe08
    Range("c8") = Gruppe13
    Range("c9") = Gruppe17
    Range("c10") = Gruppe21
    Range("c11") = Gruppe26
    Range("c12") = Gruppe30
    Range("c13") = Gruppe34
    Range("c14") = Gruppe39
    Range("c15") = Gruppe43
    Range("c16") = Gruppe47
    Range("c17") = Gruppe52
    Range("c18") = Gruppe104

End Sub

Underligt nok bliver mit output som følger.

3549
2473
1816
742
3102
2907
2747
2644
2568
2486
2410
2351
2261
1133

Jeg vil også gerne have en hånd til hvordan jeg kan forsimple min kode..
Avatar billede tjens Nybegynder
20. december 2010 - 20:39 #1
Din kode fejler fordi du ikke har styr på hvordan AND og OR påvirker hinanden i samme statement.

Der skal paranteser omkring de to OR felter for at opnå det du vil:

        If ( Range("o" & i) = "SDP1" Or Range("o" & i) = "SDP2" ) And _
          Range("q" & i) >= "24" Then
            Gruppe00 = Gruppe00 + 1
        End If
       
        If Range("k" & i) >= "28" And _
          ( Range("o" & i) = "SDP1" Or Range("o" & i) = "SDP2" ) And _
          Range("q" & i) >= "24" Then
          Gruppe04 = Gruppe04 + 1
        End If

        ...


Men der er ingen grund til at udføre den samme if så mange gange.
Skriv om til denne struktur.

        If Range( ("o" & i) = "SDP1" Or Range("o" & i) = "SDP2" ) And _
            Range("q" & i) >= "24" Then

              Gruppe00 = Gruppe00 + 1

              If Range("k" & i) >= "28" Then
                    Gruppe04 = Gruppe04 + 1
              End If

              If Range("k" & i) >= "56" Then
                    Gruppe08 = Gruppe08 + 1
              End If

              ...
                ...
              ...

        End If
Avatar billede StefanMoberg Nybegynder
20. december 2010 - 21:07 #2
Nu har jeg ændret min IF-sætning, som du har foreslået, men jeg oplever stadig den samme fejl i outputtet

If (Range("o" & i) = "SDP1" Or Range("o" & i) = "SDP2") And _
          Range("q" & i) >= "24" Then
         
          Gruppe00 = Gruppe00 + 1
               
            If Range("k" & i) >= "28" Then
              Gruppe04 = Gruppe04 + 1
            End If
           
            If Range("k" & i) >= "56" Then
              Gruppe08 = Gruppe08 + 1
            End If
           
            If Range("k" & i) >= "91" Then
              Gruppe13 = Gruppe13 + 1
            End If
           
            If Range("k" & i) >= "119" Then
              Gruppe17 = Gruppe17 + 1
            End If
           
            If Range("k" & i) >= "147" Then
              Gruppe21 = Gruppe21 + 1
            End If
           
            If Range("k" & i) >= "182" Then
              Gruppe26 = Gruppe26 + 1
            End If
           
            If Range("k" & i) >= "210" Then
              Gruppe30 = Gruppe30 + 1
            End If
           
            If Range("k" & i) >= "238" Then
              Gruppe34 = Gruppe34 + 1
            End If
           
            If Range("k" & i) >= "273" Then
              Gruppe39 = Gruppe39 + 1
            End If
           
            If Range("k" & i) >= "301" Then
              Gruppe43 = Gruppe43 + 1
            End If
           
            If Range("k" & i) >= "329" Then
              Gruppe47 = Gruppe47 + 1
            End If
           
            If Range("k" & i) >= "364" Then
              Gruppe52 = Gruppe52 + 1
            End If
           
            If Range("k" & i) >= "725" Then
              Gruppe104 = Gruppe104 + 1
            End If
       
        End If

Værdierne i outputtet burde være faldende...
Avatar billede tjens Nybegynder
21. december 2010 - 17:36 #3
Det er fordi du har sat anførselstegn uden om dine tal:
Dermed bliver f.eks. "87" større end "234" fordi "8" er større end "2".

Uden anførselstegn:

      If (Range("o" & i) = "SDP1" Or Range("o" & i) = "SDP2") And _
          Range("q" & i) >= 24 Then
         
          Gruppe00 = Gruppe00 + 1
               
            If Range("k" & i) >= 28 Then
              Gruppe04 = Gruppe04 + 1
            End If
           
            ...
              ...
            ...
(Det er testet)
Avatar billede StefanMoberg Nybegynder
19. januar 2011 - 07:23 #4
Tak for dit svar! Det hjalp!
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