• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Excel sheet splitsen op basis van trefwoord

Status
Niet open voor verdere reacties.

mvanbe

Gebruiker
Lid geworden
7 mrt 2018
Berichten
87
Goedenavond.

Graag zou ik een stukje code willen hebben om één sheet te splitsen in meerdere. Nu bevat de werkmap één sheet met een partij verschillende hoofdstukken. Dit kunnen er 3 zijn maar ook 20. Ieder hoofdstuk wordt afgesloten met het trefwoord 'totaal' en zou dan getransporteerd moeten worden naar een eigen sheet.

Wat ik geprobeerd heb o.a. met macro recorder.
CTRL+F en zoeken naar 'Totaal"
Selecteer complete rij
Selecteer alle bovenliggende rijen (CTRL+Home) en knip
Voeg nieuwe sheet toe en plak inclusief opmaak


Daarnaast zou het fijn zijn als iedere nieuwe sheet ook de naam krijgt van het desbetreffende hoofdstuk en de header die in het orgineel is weergegeven.

Wat ik heb geprobeerd werkt enigzins maar probleem is dat bij een volgend hoofdstuk alle bovenstaande lege rijen welke zojuist geknipts zijn ook worden getransporteerd. Verder lukt het mij niet om dit te perfectioneren.

Hopelijk ben ik duidelijk en wil iemand een poging wagen.
 

Bijlagen

  • Testbestand Helpmij.xlsm
    278,2 KB · Weergaven: 31
Code:
Sub Hoofdstuk()
   With Sheets("origineel")                      'je werblad
      ThisWorkbook.Names.Add "Totaalkolom", Sheets("origineel").UsedRange.Columns("E")   'een gedefinieerde naam van de E-kolom
      arr = Filter([transpose(if(left(totaalkolom,6)="Totaal",row(totaalkolom),"~"))], "~", 0, vbTextCompare)   'array met alle rijnummers waar totaal in staat
      If UBound(arr) = -1 Then MsgBox "foutje bedankt": Exit Sub   'geen totaals

      For i = 0 To UBound(arr)                   'alle totalen aflopen
         .Range("A1:A" & arr(i)).EntireRow.Copy  'blok kopieren
         naam = Mid(.Cells(arr(i), "E").Value, 8)
         Sheets.Add After:=Sheets(Sheets.Count)  'blad toevoegen
         With ActiveSheet
            .Name = naam
            .Paste
            .Range("A1").PasteSpecial Paste:=xlPasteColumnWidths
         End With
         .Range("A3:A" & arr(i)).EntireRow.Hidden = True   'gekopieerde verbergen
      Next
      .UsedRange.EntireRow.Hidden = False
   End With
   Application.CutCopyMode = False
   Application.Goto Range("A1")
End Sub
 
Dit is precies wat ik bedoel! Erg mooi en hiervoor ben ik dankbaar. Ter informatie; dit is een onderdeel van een rapport generator. Doel is om hier een inhoudsopgave toe te voegen, een userform met invulvelden en keuzemogelijkheden en diverse hoofdstukken met tekstblokken. Een uitdagend project met verschillende puzzelstukjes maar dit is een mooi begin! Dank!
 
Ho; klein beetje te vroeg gejuicht. Ik zie dat je na ieder blok de bovenliggende cellen hebt verborgen. Als ik na de code de celhoogte probeer te verbeteren d.m.v. onderstaande code worden alle verborgen cellen weer zichtbaar. Is het ook mogelijk om deze verborgen cellen te verwijderen?

HTML:
 Dim Wsht As Worksheet
 For Each Wsht In Worksheets
 With Wsht.UsedRange
 .EntireRow.AutoFit
 End With
 Next Wsht
 
Zo dan?
Code:
Sub VenA()
Set d = CreateObject("Scripting.Dictionary")
  With Sheets("Origineel")
    ar = .Range("A1:G" & .Cells(Rows.Count, 5).End(xlUp).Row)
    For j = UBound(ar) To 1 Step -1
      If Left(ar(j, 5), 6) = "Totaal" Then c00 = Mid(ar(j, 5), 8)
      d(c00) = ""
      ar(j, 7) = c00
    Next j
    .Range("A1:G" & .Cells(Rows.Count, 5).End(xlUp).Row) = ar
    For Each it In d
    .Cells(1).CurrentRegion.AutoFilter 7, it
    .Cells.CurrentRegion.Resize(, 6).Copy
      With Sheets.Add(, Sheets(1))
      'With ActiveSheet
        .Paste
        .Columns.AutoFit
        .Name = it
      End With
    Next it
    .Cells(1).CurrentRegion.AutoFilter
    .Columns(7).Delete
  End With
End Sub
 
Het volstaat de rode regel toe te voegen.
Clear is drastisch, dan is alles weg, ook de opmaak (nodig voor die cellen die een blauw "hoofdstuk" hadden.
Misschien is het daarom beter om het in 2 stappen te doen, dus in plaats van die ene rode regel, die 2 onderaan.
zo wordt in dat bereik alles gewist (Clearcontents) en enkel voor de kolom E is alles weg (Clear)
Code:
     Next
      [COLOR="#FF0000"]  .Range("A3:F" & arr(UBound(arr))).Clear
     [/COLOR]   .UsedRange.EntireRow.Hidden = False
   End With
Code:
       .Range("A3:F" & arr(UBound(arr))).ClearContents
        .Range("E3:E" & arr(UBound(arr))).Clear
 
Ik ben met beide oplossingen er blij! Zelf had ik geimproviseerd door onderstaand op te roepen. Nu opzoek naar een code om een file dialog box te openen, template te selecteren en de sheets welke gesplitst zijn in deze template te plakken achter een specifieke sheet. Mooie puzzeltocht!


Code:
Sub Verwijder_verborgen_rijen()
    
  Dim ws As Worksheet
  Dim rVis As Range
 
  Application.ScreenUpdating = False
  
  For Each ws In Worksheets
  
    Do Until ws.Columns("A").SpecialCells(xlVisible).Count = ws.Rows.Count
      Set rVis = ws.Columns("A").SpecialCells(xlVisible)
      If rVis.Row = 1 Then
        ws.Rows(rVis.Areas(1).Rows.Count + 1 & ":" & rVis.Areas(2).Row - 1).Delete
      Else
        ws.Rows("1:" & rVis.Row - 1).Delete
      End If
    Loop
  
  Next ws
  
  Application.ScreenUpdating = True

End Sub

Sub Herstel_celhoogte()

 Dim Wsht As Worksheet
 
 For Each Wsht In Worksheets
 
 With Wsht.UsedRange
 .EntireRow.AutoFit
 End With
 
 Next Wsht
  
End Sub
.
 
mij lijkt dan onderstaande, uit de losse pols, hetzelfde te doen in 2 regels, alhoewel die 2e regel misschien overbodig is dan,
misschien is zelfs "Wsht.UsedRange.entirerow.delete" al voldoende
Code:
With Wsht.UsedRange
.delete   
.EntireRow.AutoFit
end with
 
Laatst bewerkt:
Gebruik .Clear ipv van .Delete
In een werkblad kun je geen regels verwijderen: rows.count is constant.
 
Dat was eigenlijk #6 ???
@mvanbe, waarom voldeed dat niet en moest je verder improviseren in #7 ?
 
Mijn improvisatie was gisteravond na je eerste stuk van magie :)

Nu met alle terugkoppeling zijn we al weer heel wat verder.
 
Als het toegestaan is zou ik graag op bovenstaand als vervolg een verzoek willen plaatsen. Ik heb inmiddels een stukje code om een template te selecteren en kan hier naar toe de hoofdstukken die gesplitst zijn kopiëren. Zie onderstaande code.
Wat mij nog niet lukt is om dit in de juiste volgorde te krijgen. Zie hiervoor afbeelding. Een zoektocht naar aanpassing van: sh.Copy after:=wb2.Sheets(4) heeft mij nog niet geholpen...Iemand een idee?


Bijgevoegd ook 2 bestanden; het basisbestand wat gesplitst wordt en een voorbeeld template.

Bekijk bijlage 354475

Code:
Sub Kopieer_sheets_naar_Template()
    
    Dim directory As String, fileName As String, sheet As Worksheet, total As Integer
    Dim fd As Office.FileDialog
    
    Dim wb1 As Workbook, wb2 As Workbook
    Dim sh As Worksheet
    
    Set wb1 = ActiveWorkbook
    
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    
      With fd
        .AllowMultiSelect = False
        .Title = "Selecteer VT template"
        .Filters.Clear
        .Filters.Add "Excel 2003", "*.xls?"
    
        If .Show = True Then
          fileName = Dir(.SelectedItems(1))
    
        End If
      End With

  Application.ScreenUpdating = True
  Application.DisplayAlerts = True

  Workbooks.Open (fileName)
  
  Set wb2 = ActiveWorkbook

   For Each sh In wb1.Sheets
      sh.Copy after:=wb2.Sheets(4)
      
   Next sh

End Sub
 

Bijlagen

  • Voorbeeld Template.xlsx
    11,9 KB · Weergaven: 13
  • Testbestand Helpmij.xlsm
    280,1 KB · Weergaven: 19
zonder de voorbeelden bekeken te hebben, zo zet je ze achterin
Code:
     sh.Copy after:=wb2.Sheets(wb2.sheets.count)   ???
 
zonder de voorbeelden bekeken te hebben, zo zet je ze achterin
Code:
     sh.Copy after:=wb2.Sheets(wb2.sheets.count)   ???

Dat klopt! En dat gaat prima; ik wil ze alleen midden in een template plaatsen; en met de aanpassingen die ik heb gedaan wordt daardoor om logische reden de volgorde van de hoofdstukken verplaatst.
 
dan doe je toch "before" een bepaalde sheet en komen ze op die volgorde dan netjes binnen
Code:
sh.Copy before:=wb2.Sheets("Bepaalde naam")
.
 
Gelukt..ze worden nu netjes op volgorde geplaatst! Ontzettend bedankt voor de oplossingen.. Voorlopig kan ik weer verder!
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan