Avatar billede rrm-webware Nybegynder
07. marts 2011 - 13:49 Der er 4 kommentarer og
1 løsning

Indsættelse af rækker i excelark

Hej

Jeg ønsker en makro der kan indsætte rækker med data som vist nedenfor:

Udgangspunkt:
NR  Gruppe  Tæller
11  A        2
55  B        3
33  B        1

Resultat
NR  Gruppe  Tæller
11  A        1
11  A        2
55  B        1
55  B        2
55  B        3
33  B        1

Der skal altså "bare" indsættes nye rækker ud fra tælleren, som viser antal i udgangspunktet, hvor de andre værdier så kopieres ind. Resultatet må gerne være indsat i et nyt ark.
Avatar billede supertekst Ekspert
07. marts 2011 - 15:08 #1
Dim ræk As Long, sidsteRæk, tæller As Byte, antal As Byte
Dim ræk2 As Long
Public Sub indsætRækker()
    ræk2 = 2
    sidsteRæk = ActiveCell.SpecialCells(xlLastCell).Row
   
    For ræk = 2 To sidsteRæk
        antal = Range("C" & ræk)
        For tæller = 1 To antal
            With ActiveWorkbook.Sheets("Ark2")
                .Cells(ræk2, 1) = Cells(ræk, 1)
                .Cells(ræk2, 2) = Cells(ræk, 2)
                .Cells(ræk2, 3) = tæller
                ræk2 = ræk2 + 1
            End With
        Next tæller
    Next ræk
   
End Sub
Avatar billede rrm-webware Nybegynder
07. marts 2011 - 16:01 #2
Fandt selv en løsning hvor jeg bruger Do While løkker:

Dim Mat As String 'material "denne er NR i eksemplet"
Dim CS As String "denne er gruppe i eksemplet"
Dim n As Integer 'group counter "denne er tæller i eksemplet"
Dim i As Integer
Dim j As Integer
Dim x As Integer

Sub insertrows()

Do While j <= 6082
i = Cells(2 + j, 2)
n = 1

Do While n <= i
Cells(2 + x, 7) = Cells(2 + j, 1)
Cells(2 + x, 8) = n
Cells(2 + x, 9) = Cells(2 + j, 3)
Cells(2 + x, 10) = Cells(2 + j, 4)
Cells(2 + x, 11) = Cells(2 + j, 5)
n = n + 1
x = x + 1
Loop

j = j + 1
i = Cells(2 + j, 2)
Loop

End Sub

Ved ikke om det matcher helt med mit første forsimplede eksempel, men det kører til gengæld lidt langsomt. Har ca 5000 rækker der bliver til 33000..

Er det hurtigere at bruge For next?
Avatar billede supertekst Ekspert
07. marts 2011 - 16:28 #3
Prøv at slå skærmopdateringen fra inden loopet..

Application.screenupdating = false
Avatar billede kabbak Professor
07. marts 2011 - 18:14 #4
prøv denne

Public Sub LavRK()
    Dim Data As Variant, DataUd As Variant, X As Long, I As Long, Y As Long
    Data = Worksheets("Ark1").Range("A1").CurrentRegion' ret til dit ark
    X = 1
    For I = 2 To UBound(Data, 1)
        X = X * Data(I, 3)
    Next
    ReDim DataUd(X, UBound(Data, 2) - 1)
    DataUd(0, 0) = Data(1, 1)
    DataUd(0, 1) = Data(1, 2)
    DataUd(0, 2) = Data(1, 3)
    Y = 1
   
    For I = 2 To UBound(Data, 1)
        For X = 1 To Data(I, 3)
            DataUd(Y, 0) = Data(I, 1)
            DataUd(Y, 1) = Data(I, 2)
            DataUd(Y, 2) = X
            Y = Y + 1
        Next
    Next
' ret næste til dit ark
    Worksheets("Ark2").Range("A1").Resize(UBound(DataUd, 1) + 1, UBound(DataUd, 2) + 1) = DataUd
End Sub
Avatar billede rrm-webware Nybegynder
08. marts 2011 - 07:52 #5
Ved at slå skærmopdateringen fra gik det væsentligt hurtigere :-)
Ved ikke om jeg kommer til at bruge denne makro igen, men den sparede mig da for en del copy/paste arbejde.
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