29. juni 2018 - 14:53Der er
7 kommentarer og 1 løsning
Kunde ordre skal smides i hvert sit ark, VBA
Hej med Jer
Jeg har et ark, med en masse kunde ordre som står blandet. Kan man lave en VBA kode, som kigger alle kunderne igennem i F2 og ned og putter dem i hvert sit ark i stedet for?
Således, at kunde A får sit eget ark med al data fra hovedet arket?
Eksempel på ark: A: Dato, C: Varenummer, D: Varetekst, E: Ordre, F: Kunde.
Den skal så sortere kunderne i hvert sit ark, selvfølgelig er der flere kunder med samme navn - skal de stå i samme ark. Så den tager udgangspunkt i F kolonne og sortere til sidst i alle ark med nyeste dato til sidst.
Hvis du navngiver dit hovedark "DATA", så skulle følgende kode gøre det
Public Sub FlytKunder() Dim rk As Long, I As Long, RW As Long, Navn As String rk = ActiveSheet.UsedRange.Rows.Count OldSheets = "DATA" For I = rk To 2 Step -1 Navn = Range("F" & I) ErSidenOprettet Navn, OldSheets RW = Worksheets(Navn).Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Row Worksheets(OldSheets).Rows(I & ":" & I).Cut Worksheets(Navn).Range("A" & RW) ' If I = 8 Then Stop Next Call Sortering End Sub
Sub ErSidenOprettet(Navn As String, OldSheets) If Navn = "" Then Navn = "Per" And OldSheets = "Ark1" Dim I As Integer For I = 1 To ActiveWorkbook.Worksheets.Count If Worksheets(I).Name = Navn Then Exit Sub Next Worksheets.Add After:=Worksheets(Worksheets.Count) ActiveSheet.Name = Navn Worksheets(OldSheets).Activate Rows("1:1").Copy Worksheets(Navn).Range("A1") End Sub
Sub Sortering() Dim RW As Long For I = 1 To ActiveWorkbook.Worksheets.Count If Worksheets(I).Name <> "DATA" Then
ActiveWorkbook.Worksheets(I).Sort.SortFields.Clear ActiveWorkbook.Worksheets(I).Sort.SortFields.Add2 Key:=Range("A2:A" & RW), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets(I).Sort .SetRange Range("A1:F" & RW) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End If Next Worksheets("DATA").Activate End Sub
Public Sub FlytKunder() Dim rk As Long, I As Long, RW As Long, Navn As String rk = ActiveSheet.UsedRange.Rows.Count OldSheets = "DATA" For I = rk To 2 Step -1 Navn = Worksheets(OldSheets).Range("F" & I) ErSidenOprettet Navn, OldSheets RW = Worksheets(Navn).Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Row Worksheets(OldSheets).Range("A" & I & ",C" & I & ":F" & I).Copy Worksheets(Navn).Range("A" & RW) Worksheets(OldSheets).Rows(I & ":" & I).Delete Shift:=xlUp Next Call Sortering End Sub
Sub ErSidenOprettet(Navn As String, OldSheets) If Not WorksheetExists(Navn) Then Worksheets.Add After:=Worksheets(Worksheets.Count) ActiveSheet.Name = Navn Worksheets(OldSheets).Activate Worksheets(OldSheets).Range("A1,C1:F1").Copy Worksheets(Navn).Range("A1") ' overskrifter End If
End Sub
Sub Sortering() Dim RW As Long For Each WS In Worksheets If WS.Name <> "DATA" Then
WS.Activate With WS RW = (.Range("A1").End(xlDown).Row) - 1 Columns("A:E").Select
.Sort.SortFields.Clear .Sort.SortFields.Add2 Key:=Range("A2:A" & RW), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With .Sort .SetRange Range("A1:E" & RW) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End With
End If Next Worksheets("DATA").Activate End Sub
Function WorksheetExists(ByVal Arknavn As String) As Boolean Dim Ark As Worksheet For Each Ark In ThisWorkbook.Worksheets If Application.Proper(Ark.Name) = Application.Proper(Arknavn) Then WorksheetExists = True Exit Function End If Next Ark WorksheetExists = False End Function
Nu sætter den ikke i de rigtige kolonner nu, således at den springer nogle felter over. Og den tager ikke det hele med, der står kun én ordre pr. kunde nu i arket.
Endnu engang, tusind tak for dit forslag!!
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.