Avatar billede elpedro Nybegynder
11. december 2002 - 13:47 Der er 7 kommentarer og
1 løsning

IF i makro!

Jeg fik en god hjælp tidligere på ugen med en kode der virkede perfekt. Den kører en tabel igennem og tjekker det sidste felt (6) for hvor mange kopier der skal genereres til ark to og kopierer derefter 2,3 og 4 til ark 2.

Denne kode prøvede jeg så at lave om i, så den kunne tjekke felt fire (postnummer) og give det en værdi i feltet efter (københavn K, Frederiksberg C etc.). I den vedlagte kode tjekker den kun for København K. Når jeg prøver at køre den, får jeg dog en fejl "Loop without Do" og det fatter jeg ikke et ord af for den ligner jo til forveksling den første kode! Derudover er jeg ikke sikker på at Set overhovedet eksisterer i VB (er vant til java). Nogen råd/forslag?

1. kode (den virker!)
Public Sub SkrivHusstande()

Dim i, j, k, maxRk, antal As Integer

maxRk = ActiveSheet.UsedRange.Rows.Count
k = 1

For i = 1 To maxRk
    antal = ActiveSheet.Cells(i, 6).Value
    j = 1
    Do While j <= antal
        Range(Cells(i, 2), Cells(i, 4)).Copy Sheets(2).Cells(k, 1)
        j = j + 1
        k = k + 1
    Loop
Next i

End Sub

2. kode, den der ikke virker :-)
Public Sub CheckIndreBy()

Dim i, j, k, maxRk, postnr As Integer

maxRk = ActiveSheet.UsedRange.Rows.Count
k = 1

For i = 1 To maxRk
    postnr = ActiveSheet.Cells(i, 6).Value
    j = 1
    Do While j <= 2000
        If postnr < 1500 Then
            Set ActiveSheet.Cells(i, 7) = "København K"
        j = j + 1
        k = k + 1
    Loop
Next i

Do while sætningen j < 2000 er et forsøg på at få den til at virke, men uden resultat...
Som i kan se er den nærmest en tro kopi af den første kode, men hvis en gad se den igennem ville jeg være meget taknemlig...
Avatar billede bak Forsker
11. december 2002 - 14:31 #1
Du mangler en end if sætning. Det kan være det den brokker sig over selvom den skriver noget andet.

For i = 1 To maxRk
    postnr = ActiveSheet.Cells(i, 6).Value
    j = 1
    Do While j <= 2000
        If postnr < 1500 Then
            Set ActiveSheet.Cells(i, 7) = "København K"
          END IF   
        j = j + 1
        k = k + 1
    Loop
Next i
Avatar billede bak Forsker
11. december 2002 - 14:33 #2
Og fjern lige SET
Avatar billede elpedro Nybegynder
11. december 2002 - 15:24 #3
Tak det virkede, du får pointene... Men lige et followup spørgsmål: Hvis jeg vil indsætte flere IF sætninger Kan jeg så bare gøre som følgende:

Public Sub CheckIndreBy()

Dim i, j, k, maxRk, postnr As Integer

maxRk = ActiveSheet.UsedRange.Rows.Count
k = 1

For i = 1 To maxRk
    postnr = ActiveSheet.Cells(i, 4).Value
    j = 1
    Do While i <= maxRk
        If postnr < 2000 Then
            ActiveSheet.Cells(i, 7) = "Frederiksberg C"
            End If
        If postnr < 1800 Then
            ActiveSheet.Cells(i, 7) = "København V"
            End If
        If postnr < 1500 Then
            ActiveSheet.Cells(i, 7) = "København K"
            End If
        If postnr < 1000 Then
            ActiveSheet.Cells(i, 7) = "København C"
            End If
        j = j + 1
        k = k + 1
    Loop
Next i

Eller er der en smartere måde? Den ovenfor virker til at skabe en uendelig løkke, men jeg er ikke helt klar over hvorfor det sker, for det eneste der er rettet Do While linjen og så de ekstra IF sætninger...
Avatar billede bak Forsker
11. december 2002 - 15:49 #4
Det her burde være nok, Elpedro
Jeg er ikke helt klar over hvad du bruger k til, men den kan du jo sætte ind igen.

Public Sub CheckIndreBy()
Dim i As Long, j As Long, k As Long, maxRk As Long, postnr As Long

maxRk = ActiveSheet.UsedRange.Rows.Count
For i = 1 To maxRk
    postnr = ActiveSheet.Cells(i, 4).Value
    Select Case postnr
      Case 1800 To 2000: ActiveSheet.Cells(i, 7) = "Frederiksberg C"
      Case 1500 To 1799: ActiveSheet.Cells(i, 7) = "København V"
      Case 1000 To 1499: ActiveSheet.Cells(i, 7) = "København K"
      Case Is < 1000: ActiveSheet.Cells(i, 7) = "København C"
    End Select
Next i
End Sub
Avatar billede bak Forsker
11. december 2002 - 15:53 #5
Måske skulle du lige tilføje en linie under
Case Is < 1000: ActiveSheet.Cells(i, 7) = "København C"

Case Else : "Ikke i Kbh."

Bemærk at jeg har dimmet alle dine variable, for i vba betyder
Dim i, j, k, maxRk, postnr As Integer
at i, j, k, maxRK at disse bliver dimmet som Variant og kun postnr bliver dimmet som integer.
Avatar billede bak Forsker
11. december 2002 - 16:26 #6
En lille smule omskrevet...

Public Sub CheckIndreBy()
Dim i As Long, maxRk As Long, postnr As Long

maxRk = ActiveSheet.UsedRange.Rows.Count
For i = 1 To maxRk
    postnr = ActiveSheet.Cells(i, 4).Value
    Select Case postnr
      Case 1800 To 2000: ActiveSheet.Cells(i, 7) = "Frederiksberg C"
      Case 1500 To 1799: ActiveSheet.Cells(i, 7) = "København V"
      Case 1000 To 1499: ActiveSheet.Cells(i, 7) = "København K"
      Case 1 to 1000: ActiveSheet.Cells(i, 7) = "København C"
      Case Else : ActiveSheet.Cells(i, 7) = ""
    End Select
Next i
End Sub
Avatar billede elpedro Nybegynder
12. december 2002 - 08:24 #7
Tak for god hjælp, det her site sparker jo max røv :-) Må nok hellere fedte over på java siderne og se om jeg kan hjælpe nogen andre, hehe...
Avatar billede bak Forsker
12. december 2002 - 20:37 #8
Tak for point. God ide, det med at hjælpe.... :-)
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
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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