16. januar 2002 - 08:29Der er
24 kommentarer og 2 løsninger
Opdeling af data på ark samt navngivning af ark.
Hej Alle, Jeg står med følgende problem:
I Ark1 har jeg alt min data - hvilket er mere end 12000 rækker og 20 kolonner. Kolonne A indeholder et kundenummer, og der kan være flere rækker med samme kundenummer. (De er dog sorteret)
Jeg vil gerne have dannet en macro, som opsplitter data fra Ark1 ud på andre ark (hvor hver ark repræsenter et kundenummer); dataerne skal starte i de pågældende ark i række 10. Desuden skal arknavnet automatisk bliver lavet om til det pågældende kundenummer.
\'Gennemløber alle talte rækker og kopiere dem til andet ark, hvis der er noget i \'Kolonne A x = 1 For n = 2 To Række If Cells(n, 1).Value <> \"\" Then If Cells(n, 1).Value <> Cells(n - 1, 1).Value Then navn = Cells(n, 1).Value Rows(n).Copy Sheets.Add After:=Worksheets(Worksheets.Count) Sheets(Sheets.Count).Name = navn x = 1 Rows(x).Select ActiveSheet.Paste Sheets(\"Ark1\").Select Else Rows(n).Copy Sheets(navn).Select x = x + 1 Rows(x).Select ActiveSheet.Paste Sheets(\"Ark1\").Select End If End If Next n Sheets(\"Ark1\").Select Rows(1).Delete
\'Gennemløber alle talte rækker og kopiere dem til andet ark, hvis der er noget i \'Kolonne A
For n = 2 To Række If Cells(n, 1).Value <> \"\" Then If Cells(n, 1).Value <> Cells(n - 1, 1).Value Then navn = Cells(n, 1).Value Rows(n).Copy Sheets.Add After:=Worksheets(Worksheets.Count) Sheets(Sheets.Count).Name = navn x = 10 Rows(x).Select ActiveSheet.Paste Sheets(\"Ark1\").Select Else Rows(n).Copy Sheets(navn).Select x = x + 1 Rows(x).Select ActiveSheet.Paste Sheets(\"Ark1\").Select End If End If Next n Sheets(\"Ark1\").Select Rows(1).Delete
End Sub
NB - koden virker, hvis der ingen overskrifter er - skal justeres lidt, hvis du har kolonneoverskrifter.
-> tida: Det virker som om den ikke kommer igennem det første gennemløb, hvor den opretter arket, som der henvises til i \"Sheets(navn).Select\". Har du kolonneoverskrifter?
Denne virker også og er meget hurtig. Sub testing() x = Application.WorksheetFunction.CountA(Range(\"A:A\")) y = Application.WorksheetFunction.CountA(Range(\"1:1\")) ReDim matrix(x, y) For i = 2 To x For j = 1 To y matrix(i, j) = Cells(i, j).Value Next j Next i For i = 2 To x If matrix(i, 1) = matrix(i - 1, 1) Then AB = AB + 1 For j = 1 To y Cells(AB + 9, j).Value = matrix(i, j) Next j
Else Worksheets.Add.Move after:=Worksheets(Worksheets.Count) ActiveSheet.Name = matrix(i, 1) AB = 1 For j = 1 To y Cells(10, j).Value = matrix(i, j) Next j End If Next i End Sub
Sååå, jeg overdriver nok lidt, for jeg fik den lige testet på mange (6000 rækker) og det tog 2 min. Richardt. Din kan jeg ikke få til at køre stabilt, den stopper lidt umotiveret efter ca. 14 ark (Sheets(navn).Select), samme linienr hver gang. Jeg har bygget lidt videre på en autofiltermodel, der klarer 12000 linier og 72 ark på 20 sek.Sub AutoFilterModel() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual x = Application.WorksheetFunction.CountA(Range(\"A:A\")) ReDim matrix(x) a = 0 \'**Læser 1. kolonne og finder de forskellige værdier For i = 2 To x If Cells(i, 1) <> Cells(i - 1, 1) Then a = a + 1 matrix(a) = Cells(i, 1).Value End If Next i StartArk = ActiveSheet.Name \'**Sætter de forskellige værdier på som autofilter og kopier resultatet For y = 1 To a StartArk = ActiveSheet.Name Selection.AutoFilter Field:=1, Criteria1:=matrix(y) Selection.CurrentRegion.Copy Sheets.Add ActiveSheet.Name = matrix(y) Range(\"A10\").PasteSpecial (xlPasteValues) Application.CutCopyMode = False Sheets(StartArk).Select Next Selection.AutoFilter Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub
Nej, jeg kunne ikke lade være. Det skulle bare gøres hurtigere. Ca. 10 sek for 12000 rækker og 72 ark.
Sub testing() On Error GoTo errcatch Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Set StartArk = ActiveSheet Set overskrift = StartArk.Range(\"A1:X1\") Dim x, y, i, nystart As Integer, first As Boolean x = Application.WorksheetFunction.CountA(Range(\"A:A\")) y = Application.WorksheetFunction.CountA(Range(\"1:1\")) first = False For i = 2 To x + 1 If StartArk.Cells(i, 1) <> StartArk.Cells(i - 1, 1) Then If first = True Then overskrift.Copy ActiveSheet.Range(\"A10\").PasteSpecial (xlPasteValues) StartArk.Range(\"A\" & nystart & \":X\" & i).Copy ActiveSheet.Range(\"A11\").PasteSpecial (xlPasteValues) End If Worksheets.Add.Move After:=Worksheets(Worksheets.Count) nystart = i first = True ActiveSheet.Name = StartArk.Cells(i, 1).Value End If Next i errcatch: Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub
Jeg ved ikke hvorfor min kode stopper ved \"Sheets(navn).Select\" - det gør den ikke i mine testdata. Jeg kan deværre ikke hjælpe mere, da jeg tager på ferie og først er hjemme på tisrdag. Held og lykke *S* Pointene på vist tilfalde bak, der har gjort et stort arbejde :-)
Forøvrigt hvis der ikke havde været så mange kolonne vil jeg have foretrukket at lave en pivottabel, indsætte kolonne 1 som sidefelt, højreklikket på denne, og valgt \"Vis sider\". Så laver excel selv arbejdet.
Jeg takker mange gange for hjælpen, det var en sand fornøjelse at arbejde med. Antallet af pointene viser, hvem der havde den hurtigste af løsningerne :-)
MVH Claus
PS. tida, du skal ikke betale for det - det er heldigvis sådan, at vi kan bruge hinandens spørgsmål. Så jeg holder skam bare øje med dine :-)
Synes godt om
Ny brugerNybegynder
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.