Oprettet i går kl. 07:20Der er
10 kommentarer og 1 løsning
Opdele ét ark i flere ark
Hej
I plejer at være så dygtige😊🤞
Jeg har en vareliste på 14.000 varenumre fordelt på 144 forskellige leverandører.
Jeg har behov for at kunne opdele denne liste pr. leverandør - altså ét ark pr. leverandør.
Kan dette lade sig gøre på én eller anden smart måde? Måske VBA? Min viden omkring dette begrænser sig til at jeg kan indspille en makro eller kopiere en kode.
Har vedhæftet link med et lille udpluk af varer som demo:
Jeg spurgte Copilot, og de viste denne VBA-kode: Sub SplitBySupplier() Dim ws As Worksheet Dim lastRow As Long Dim supplierCol As String Dim supplierRange As Range Dim supplierName As Variant Dim uniqueSuppliers As Object
' Indstil det aktive ark Set ws = ActiveSheet lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' Kolonne hvor leverandørnavne/-numre befinder sig supplierCol = "B" ' Ændre til den korrekte kolonnebogstav
' Indsæt leverandørnavne i en Collection Set uniqueSuppliers = CreateObject("Scripting.Dictionary") For Each supplierName In ws.Range(supplierCol & "2:" & supplierCol & lastRow) If Not uniqueSuppliers.exists(supplierName.Value) Then uniqueSuppliers.Add supplierName.Value, Nothing End If Next supplierName
' Opret et ark for hver leverandør og kopier data For Each supplierName In uniqueSuppliers.Keys Dim newSheet As Worksheet Set newSheet = Worksheets.Add newSheet.Name = supplierName ws.Rows(1).Copy Destination:=newSheet.Rows(1) ' Kopier overskrifter
Dim i As Long For i = 2 To lastRow If ws.Cells(i, supplierCol).Value = supplierName Then ws.Rows(i).Copy Destination:=newSheet.Rows(newSheet.Rows.Count).End(xlUp).Offset(1, 0) End If Next i Next supplierName End Sub
Hvis ingen melder sig på banen, skal jeg kigge på en VBA løsning. Men jeg er først tilbage, omkring middagstid. Det er ikke noget problem at lave en sådan løsning.
Det kan gøres meget nemt på følgende måde, der virker,
Slet kolonner der er blanke (B, C, D og F) Opret en pivottabel Material Description under Row field Supplier under Filters Tryk på Options og tryk på Show Filter Report Pages Tryk på OK.
#6 Du har ret i at der bliver kreeret et ark pr leverandør. Det var mig, der ikke havde fået den sidste "feature" med.
Men når jeg gør det, så er der stadig filter på de enkelte faner, som kan foldes ud, så man kan se alle data. Og disse må ikke være tilgængelige - kun de varer, der vedrører den enkelte leverandør
#4 Du har ret, og jeg har nu testet en løsning, der virker. Inden kørsel skal Ark1 omdøbes til Master: Sub SplitDataBySupplierWithTables() Dim wsMaster As Worksheet Dim wsNew As Worksheet Dim lastRow As Long Dim supplierCol As Long: supplierCol = 8 ' Kolonne H Dim dict As Object Dim key As Variant Dim r As Long Dim tblRange As Range Dim tblName As String Dim headerRow As Range Dim destRow As Long Dim supplierName As String Dim safeSheetName As String
Set dict = CreateObject("Scripting.Dictionary") Set wsMaster = ThisWorkbook.Sheets("Master") ' Tilpas hvis nødvendigt lastRow = wsMaster.Cells(wsMaster.Rows.Count, supplierCol).End(xlUp).Row
' Find alle unikke leverandører i kolonne H For r = 2 To lastRow supplierName = Trim(wsMaster.Cells(r, supplierCol).Value) If supplierName <> "" Then If Not dict.exists(supplierName) Then dict.Add supplierName, Nothing End If End If Next r
' Gennemgå hver leverandør og opret nyt ark For Each key In dict.Keys ' Lav et sikkert ark-navn (max 31 tegn og uden ulovlige tegn) safeSheetName = Left(CleanSheetName(CStr(key)), 31)
' Slet arket hvis det allerede findes On Error Resume Next Application.DisplayAlerts = False ThisWorkbook.Sheets(safeSheetName).Delete Application.DisplayAlerts = True On Error GoTo 0
' Opret nyt ark Set wsNew = ThisWorkbook.Sheets.Add(After:=Sheets(Sheets.Count)) wsNew.Name = safeSheetName
' Kopier overskrifter Set headerRow = wsMaster.Rows(1) headerRow.Copy Destination:=wsNew.Range("A1")
' Kopier rækker for leverandøren destRow = 2 For r = 2 To lastRow If Trim(wsMaster.Cells(r, supplierCol).Value) = key Then wsMaster.Rows(r).Copy Destination:=wsNew.Rows(destRow) destRow = destRow + 1 End If Next r
' Opret tabel Set tblRange = wsNew.Range("A1").CurrentRegion tblName = "Tbl_" & Replace(safeSheetName, " ", "_") On Error Resume Next wsNew.ListObjects.Add(xlSrcRange, tblRange, , xlYes).Name = tblName On Error GoTo 0 Next key
MsgBox "Vareliste er nu opdelt i " & dict.Count & " ark med formaterede tabeller.", vbInformation End Sub
' Funktion til at rense ark-navne Function CleanSheetName(s As String) As String Dim chars As Variant: chars = Array("/", "\", "?", "*", "[", "]", ":", "'", """") Dim i As Integer For i = LBound(chars) To UBound(chars) s = Replace(s, chars(i), "_") Next i CleanSheetName = Application.WorksheetFunction.Trim(s) End Function
#10 - ja, men hvem skal håndtere det ? jeg foreslog på et tidspunkt at lave det sådan, at bidrag fra AI løsninger skulle mærkes. Men der kom aldrig respons fra folkene bag Eksperten.dk
i sidste ende, så bliver det stille og roligt, afviklingen af Eksperten.dk
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.