Data verplaatsen naar nieuwe of bestaande worksheets

Status
Niet open voor verdere reacties.

draude71

Gebruiker
Lid geworden
7 dec 2020
Berichten
5
Ik heb een Excel hoofdwerkblad met data in 2 kolommen: Artikel en houdbaarheid (mmm/jj).

Nu wil ik graag dat alle data van dezelfde maand/jaar naar een nieuw of bestaand werkblad wordt gekopieerd, waarbij de naam van het werkblad de maand/jaar is.
Mocht een werkblad met de juiste naam al bestaan en data bevatten dan wil ik graag dat de data aan het bestaande werkblad wordt toegevoegd.
Na het verplaatsen van de data naar de juiste werkbladen moet de data uit het hoofdwerkblad worden verwijderd.

Ook wil ik de werkbladen op naam (jaar/maand) kunnen sorteren.

Ik was de onderstaande code online tegengekomen wat ongeveer doet wat ik wil, maar ik ben een VBA novice en weet niet wat ik zou moeten aanpassen om het bovenstaande te krijgen:

Code:
Sub Excecute_info()
    Dim My_Range As Range
    Dim FieldNum As Long
    Dim CalcMode As Long
    Dim ViewMode As Long
    Dim ws2 As Worksheet
    Dim Lrow As Long
    Dim cell As Range
    Dim CCount As Long
    Dim WSNew As Worksheet
    Dim ErrNum As Long
    Dim DestRange As Range
    Dim Lr As Long

    'Set filter range on ActiveSheet: A4 is the top left cell of your filter range
    'and the header of the first column, D is the last column in the filter range.
    Set My_Range = Range("A6:F" & LastRow(ActiveSheet))
    My_Range.Parent.Select

    If ActiveWorkbook.ProtectStructure = True Or _
       My_Range.Parent.ProtectContents = True Then
        MsgBox "Sorry, not working when the workbook or worksheet is protected", _
               vbOKOnly, "Copy to new worksheet"
        Exit Sub
    End If

    'In this case the range starts in A so Field:=1 is column A, 2 = column B, ......
    FieldNum = 2

    'Turn off AutoFilter
    My_Range.Parent.AutoFilterMode = False

    'Change ScreenUpdating, Calculation, EnableEvents, ....
    With Application
        CalcMode = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
        .EnableEvents = False
    End With
    ViewMode = ActiveWindow.View
    ActiveWindow.View = xlNormalView
    ActiveSheet.DisplayPageBreaks = False

    'Add a worksheet to copy the a unique list and add the CriteriaRange
    Set ws2 = Worksheets.Add

    With ws2
        'first we copy the Unique data from the filter field to ws2
        My_Range.Columns(FieldNum).AdvancedFilter _
                Action:=xlFilterCopy, _
                CopyToRange:=.Range("A1"), Unique:=True

        'loop through the unique list in ws2 and filter/copy to a new sheet
        Lrow = .Cells(Rows.Count, "A").End(xlUp).Row
        For Each cell In .Range("A2:A" & Lrow)

            My_Range.Parent.Select
            'Filter the range
            My_Range.AutoFilter Field:=FieldNum, Criteria1:="=" & _
                                                            Replace(Replace(Replace(cell.Value, "~", "~~"), "*", "~*"), "?", "~?")
 
            'Check if there are no more then 8192 areas(limit of areas)
            CCount = 0
            On Error Resume Next
            CCount = My_Range.Columns(1).SpecialCells(xlCellTypeVisible) _
                     .Areas(1).Cells.Count
            On Error GoTo 0
            If CCount = 0 Then
                MsgBox "There are more than 8192 areas for the value: " & cell.Value _
                     & vbNewLine & "It is not possible to copy the visible data." _
                     & vbNewLine & "Tip: Sort your data before you use this macro.", _
                       vbOKOnly, "Split in worksheets"
            Else
                'Add a new worksheet or set a reference to a existing sheet
                If SheetExists(cell.Text) = False Then
                    Set WSNew = Worksheets.Add(After:=Sheets(Sheets.Count))
                    On Error Resume Next
                    WSNew.Name = cell.Value
                    If Err.Number > 0 Then
                        ErrNum = ErrNum + 1
                        WSNew.Name = "Error_" & Format(ErrNum, "0000")
                        Err.Clear
                    End If
                    On Error GoTo 0
                    Set DestRange = WSNew.Range("A1")
                Else
                    Set WSNew = Sheets(cell.Text)
                    Lr = LastRow(WSNew)
                    Set DestRange = WSNew.Range("A" & Lr + 1)
                End If

                'Copy the visible data to the worksheet
                My_Range.SpecialCells(xlCellTypeVisible).Copy
                With DestRange
                    .Parent.Select
                    .PasteSpecial Paste:=8
                    .PasteSpecial xlPasteValues
                    .PasteSpecial xlPasteFormats
                    Application.CutCopyMode = False
                    .Select
                End With
            End If

            ' Delete the header row if you copy to a existing worksheet
            If Lr > 1 Then WSNew.Range("A" & Lr + 1).EntireRow.Delete

            'Show all data in the range
            My_Range.AutoFilter Field:=FieldNum

        Next cell

        'Delete the ws2 sheet
        On Error Resume Next
        Application.DisplayAlerts = False
        .Delete
        Application.DisplayAlerts = True
        On Error GoTo 0

    End With
    
    'Turn off AutoFilter
    My_Range.Parent.AutoFilterMode = False

    If ErrNum > 0 Then
        MsgBox "Rename every WorkSheet name that start with ""Error_"" manually" _
             & vbNewLine & "There are characters in the name that are not allowed" _
             & vbNewLine & "in a sheet name or the worksheet already exist."
    End If

    'Restore ScreenUpdating, Calculation, EnableEvents, ....
    My_Range.Parent.Select
    ActiveWindow.View = ViewMode
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = CalcMode
    End With

End Sub
 
Laatst bewerkt:
Lijkt mij ontzettend veel code voor zo'n simpele handeling. Waarom wil je alles op verschillende tabjes hebben staan? Plaats even een voorbeeldbestand.
 
Het sorteren zie ik niet voor mij. aug 2021 komt voor jan 2020

Code:
Sub VenA()
  With Sheets("_Invoer")
    .Cells(6, 1).CurrentRegion.Offset(, 1).Resize(, 1).AdvancedFilter xlFilterCopy, , .Range("L1"), True
    With .Range("L1").CurrentRegion
      .Sort .Cells(1), , , , , , , xlYes
      ar = .Value
      .Clear
    End With
    With .Cells(6, 1).CurrentRegion
      For j = 2 To UBound(ar)
        If IsError(Evaluate("'" & ar(j, 1) & "'!A1")) Then
          Sheets.Add(, Sheets(Sheets.Count)).Name = ar(j, 1)
          Cells(1).Resize(, 2) = Array("Artikel", "Houdbaarheidsdatum")
        End If
        .AutoFilter 2, ar(j, 1)
        .Offset(1).Copy Sheets(ar(j, 1)).Cells(Rows.Count, 1).End(xlUp).Offset(1)
        .Offset(1).EntireRow.Delete
      Next j
      .AutoFilter
    End With
  End With
End Sub
 
Dat is een stuk minder code :)

Het sorteren van de tabbladen kwam ik ook niet uit. Daar is natuurlijk veel minder mogelijk.

Is het mogelijk om bij het kopiëren naar een nieuwe sheet ook de opmaak van de header mee te nemen?
 
Waarom mooi maken als je ze toch weer weg gaat gooien?

Code:
With Cells(1).Resize(, 2)
  .Value = Array("Artikel", "Houdbaarheidsdatum")
  .Font.Bold = True
  .Borders(xlEdgeBottom).LineStyle = xlContinuous
  .Columns.AutoFit
End With

Om te kunnen sorteren kan je beter het formaat jjjj-maandnummer gebruiken. Dus 2020-01, 2021-08, etc
 
VenA,

het oog wil soms ook wat :)



De suggestie voor de jaar-maandnummer is geweldig, dat lost meteen het sorteerprobleem op!
 
Als het over excel gaat dan verschillen de meningen daar nogal over. Vooral beginners maken zich drukker om opmaak en toestanden dan om waar het functioneel om gaat.:)
 
En daar gaat het om. Je mag de vraag nog even op opgelost zetten.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan