NYARCH schrijft
Ik wil dat Excel een hele rij naar een nieuw Excel-werkblad kopieert op basis van een celvermelding. Ik heb bijvoorbeeld gegevens in de cellen A8: AG8, ik wil dat Excel de hele rij naar blad "a" kopieert als de waarde in H8 "ir" is, en blad "b" als de waarde in H8 "RR" is. Het meest gecompliceerde deel en niet alleen gekopieerd, ik moet het naar de volgende lege rij op het werkblad kopiëren. Van de ongeveer 150 rijen zullen er slechts ongeveer 15 van elk type daadwerkelijk naar een nieuw blad worden gekopieerd.
MrExcel zal 50 bonuspunten toekennen aan elke lezer die zich het Lotus Magazine-artikel met 10 geweldige tips herinnert, waarbij tip 4 was "Gebruik de End-toets om naar het einde van een bereik te gaan". Als je teruggaat naar de dagen van Lotus, zou je de celwijzer ergens in een gegevensblok kunnen plaatsen, op END en dan omlaag kunnen drukken, en de celwijzer zou naar het einde van het bereik rijden. Excel heeft vergelijkbare functionaliteit, VBA heeft vergelijkbare functionaliteit en dit is de sleutel tot het vinden van de laatste rij met gegevens op een blad.
De VBA-techniek is om End (xlDown) te gebruiken om de End + Down-toets of End (xlUp) te simuleren om de End + Up-toets te simuleren. Als u op deze toetsenreeks drukt, wordt de celaanwijzer naar de volgende rand van een aaneengesloten gegevensbereik verplaatst. Stel je voor dat er waarden zijn in A1: A10 en A20: A30. Begin in A1. Druk op End + Down en de celaanwijzer gaat naar A10. Druk op End + Down en je gaat naar A20, de bovenrand van de volgende aaneengesloten reeks gegevens. Druk op End + Down en je gaat naar A30. Ik weet eigenlijk niet hoe ik dit gedrag in eenvoudig Engels moet uitleggen. Probeer het gewoon en u zult zien hoe het werkt.
De truc die ik gebruik, is om te beginnen bij kolom A in de laatste rij van de spreadsheet en vervolgens op End + Up te drukken. Dit brengt me naar de laatste rij met gegevens. Ik weet dan dat ik de volgende rij beneden als een lege rij moet gebruiken.
Hier is een brute-force macro om het probleem van deze week op te lossen. Ja, u zou dit zeker eleganter kunnen doen met een AutoFilter. De gegevens staan momenteel op Blad1, met koppen in rij 2.
Public Sub CopyRows() Sheets("Sheet1").Select ' Find the last row of data FinalRow = Range("A65536").End(xlUp).Row ' Loop through each row For x = 2 To FinalRow ' Decide if to copy based on column H ThisValue = Range("H" & x).Value If ThisValue = "ir" Then Range("A" & x & ":AG" & x).Copy Sheets("a").Select NextRow = Range("A65536").End(xlUp).Row + 1 Range("A" & NextRow).Select ActiveSheet.Paste Sheets("Sheet1").Select ElseIf ThisValue = "RR" Then Range("A" & x & ":AG" & x).Copy Sheets("b").Select NextRow = Range("A65536").End(xlUp).Row + 1 Range("A" & NextRow).Select ActiveSheet.Paste Sheets("Sheet1").Select End If Next x End Sub
Aangezien Excel 2007 meer dan 65.536 rijen heeft, kunt u deze macro gebruiken, zodat deze compatibel is met voorwaarts. Merk op dat ik hier CELLS (Row, Column) gebruik in plaats van RANGE:
Public Sub CopyRows() Sheets("Sheet1").Select ' Find the last row of data FinalRow = Cells(Rows.Count, 1).End(xlUp).Row ' Loop through each row For x = 2 To FinalRow ' Decide if to copy based on column H ThisValue = Cells(x, 8).Value If ThisValue = "ir" Then Cells(x, 1).Resize(1, 33).Copy Sheets("a").Select NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(NextRow, 1).Select ActiveSheet.Paste Sheets("Sheet1").Select ElseIf ThisValue = "RR" Then Cells(x, 1).Resize(1, 33).Copy Sheets("b").Select NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(NextRow, 1).Select ActiveSheet.Paste Sheets("Sheet1").Select End If Next x End Sub
Zie Introductie van de Excel VBA-editor voor tips over het gebruik van een macro.