Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

Macro bouwen in Excel - gegevens samenvoegen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Ik ben een enorm groentje op het gebied van Excel macro's of VisualBasic, maar ben er deze week toch eens ingedoken. Ik probeer een macro te maken waarbij bepaalde gegevensbereiken van meerdere werkbladen samengevoegd moeten worden tot 1, in een los werkblad.

- De gegevens op alle werkbladen hebben dezelfde kolommmen, het aantal regels verschilt
- In het nieuwe werkblad moeten al deze gegevens onder elkaar worden geplakt
- Het gaat om journaalgegevens uit een boekhouding, dus de file wordt eens in de paar weken vernieuwd, waarbij er iedere keer in de lossen werbladen meerdere regels aan teogevoegd worden; het celbereik op ieder werkblad is niet altijd hetzelfde
- De samengevoegde gegevens dienen uiteindelijk als basis voor een draaitabel

Nu heb ik in Excel een macro opgenomen, met alle stappen die ik hier normaal voor verricht, maar deze werkt nog niet goed. Volgens de debugger in Excel loopt ie vast op een lullig 'selecteer ander werkblad'-regeltje: Sheets("BV2").Select.

Zou iemand misschien kunnen kijken naar de onderstaande code en mijn uitleg erbij en zeggen wat er niet klopt?

- Ik wis eerst alle gegevens op het blad, dan ga ik naar de gegevens van BV1, selecteer de bovenste rij en selecteer vervolgens dmv shift-ctrl-down alle actieve cellen.
- Dan kopieer ik deze en plak de waarden en getalnotities in het 'samengevoegd' werkblad.
- Dan wil ik hetzelfde doen met de gegevens van BV2, die ik onderaan de gegevens van die van BV1 wil plakken, etc...

Dit is het eerste stuk code, waarbij de debugger dus vast loopt op de onderste, simpele regel. Iemand enig idee waarom?
Het zou geweldig zijn als jullie me hiermee konden helpen.

Cells.Select
Selection.ClearContents
Range("A1").Select
Sheets("BV1").Select
Range("A1:O1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("Samengevoegd").Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=True, Transpose:=False
Range("A1").Select
Selection.End(xlDown).Select
Sheets("BV2").Select
Range("A2:O2").Select

  • onkl
  • Registratie: Oktober 2002
  • Laatst online: 23:03
Loopt 'ie nou vast op de onderste regel of op de ennaonderste, zoals je eerder zegt?
Sheets("BV2").Select zou ik vervangen door Sheets("BV2").Activate

Wat misschien netter werkt is:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
Sub samenvoegding()
Dim verzamelblad as worksheet
Set verzamelblad = thisworkbook.sheets("Samengevoegd")
Application.Cutcopymode = xlCopy
Thisworkbook.Sheets("BV1").usedrange.copy 'usedrange is: het gebruikte gebied van het werkblad.
verzamelblad.UsedRange.SpecialCells(xlCellTypeLastCell).EntireRow.Columns(1).Offset(1, 0).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=True, Transpose:=False
Thisworkbook.Sheets("BV2").usedrange.copy 'usedrange is: het gebruikte gebied van het werkblad.
verzamelblad.UsedRange.SpecialCells(xlCellTypeLastCell).EntireRow.Columns(1).Offset(1, 0).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=True, Transpose:=False
Application.Cutcopymode=False
End sub

Verwijderd

Topicstarter
Hoi Onkl, bedankt voor de snelle reactie!

Ook deze code werkt helaas nog niet; nu hikt hij tegen deze regel aan:
ThisWorkbook.Sheets("BV2").UsedRange.Copy

Dus ik heb weer wat te doen van het weekend :) Als ik er dan nog niet uit ben, trek ik nog eens aan de bel.

  • onkl
  • Registratie: Oktober 2002
  • Laatst online: 23:03
Interessant. Bestaat sheet BV2 wel (als in, zitten er geen spaties in de tabbladnaam, kleine letters ipv hoofdletters, etc)
testcode:
msgbog ThisWorkbook.Sheets("BV2").Name

Als terzijde: Het gaat er niet om of mijn code wel/ niet werkt. Ook je eigen opzet zal op zich wel werken. Het belangrijke verschil is dat ik veel minder gebruik maak van de selection/.select en zoveel mogelijk direct verwijs naar een cellen met een bepaalde eigenschap. Daardoor kan je veel krachtiger trucjes gebruiken én het is allemaal wat minder foutgevoelig (bijv: ik weet niet of het voor de code in je je voorbeeld gecheckt wordt, maar zo te zien gaat je code ervanuit dat die opstart met het verzamelblad als actieve sheet. Tricky.) en beter onderhoudbaar. En vooral: doordat je veel minder werkt volgens "regel typen-run om te kijken wat er gebeurt-volgende regel typen" is het gewoon leuker om zo te programmeren. :P

[ Voor 67% gewijzigd door onkl op 28-08-2009 16:47 ]


Verwijderd

Topicstarter
Hoi Onkl,

Ja, die sheet naam bestaat wel gewoon. Heel vreemd, daar lijkt het inderdaad op verkeerd te lopen.

Het vreemdste is nog dat als ik de debugger negeer en iedere keer gewoon op doorgaan druk, ipv probleem olossen (ja, ik heb de NL versie van excel, diepe zucht), de uitkomst wel goed is. Waar gaat het dan wel mis met de code, is mijn vraag.

Hoewel jouw code inderdaad een stuk overzichtelijker en doelgerichter is, wil ik niet overal het actieve gebied selecteren, omdat er in naastgelegen kolommen nog gegevens staan die ik niet nodig heb voor deze functie. ´Mijn´ code lijkt dan iets makkelijker. Ik heb voor de macro een knop gemaakt op het verzamelblad, dus in die zin kan het niet makkelijk fout lopen. Tenzij iemand anders hem gebruikt :)

Verwijderd

Topicstarter
Het is ongelooflijk, maar hij werkt ineens wel. Met exact dezelfde code als vrijdag. Waarschijnlijk was mijn PC ook aan het wekend toe.

Dank voor de hulp Onkl!

  • HappyGilmore
  • Registratie: Maart 2002
  • Laatst online: 27-05 23:21

HappyGilmore

Hits it over the highway ...

onkl schreef op donderdag 27 augustus 2009 @ 21:02:
Loopt 'ie nou vast op de onderste regel of op de ennaonderste, zoals je eerder zegt?
Sheets("BV2").Select zou ik vervangen door Sheets("BV2").Activate

Wat misschien netter werkt is:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
Sub samenvoegding()
Dim verzamelblad as worksheet
Set verzamelblad = thisworkbook.sheets("Samengevoegd")
Application.Cutcopymode = xlCopy
Thisworkbook.Sheets("BV1").usedrange.copy 'usedrange is: het gebruikte gebied van het werkblad.
verzamelblad.UsedRange.SpecialCells(xlCellTypeLastCell).EntireRow.Columns(1).Offset(1, 0).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=True, Transpose:=False
Thisworkbook.Sheets("BV2").usedrange.copy 'usedrange is: het gebruikte gebied van het werkblad.
verzamelblad.UsedRange.SpecialCells(xlCellTypeLastCell).EntireRow.Columns(1).Offset(1, 0).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=True, Transpose:=False
Application.Cutcopymode=False
End sub
Ik ben op zoek naar nagenoeg hetzelfde
Graag borduur ik even voort op de overzichtelijke versie

Ik heb alleen uit BV1 en BV2 alleen de eerste kolom nodig minus de eerste regel (dat is het kopje van de tabel). Het lukt me niet om dit in te bouwen.
Pagina: 1