• 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.

Selectief data in een tabel uitvegen

Status
Niet open voor verdere reacties.

Karag68

Gebruiker
Lid geworden
25 jan 2008
Berichten
111
Ik heb een tabel met 10 kolommen en 500 regels. In de eerste kolom staat per regel een waarde "KLAAR" of LEGE CEL. Als er "KLAAR" staat, moet de data in de 9 cellen rechts van deze cel leeg gemaakt worden. Dit moet in alle 500 regels bekeken worden.
Ik ben zelf niet zo'n kei in het maken van macro's. Wie kan mij hierbij helpen?
Bij voorbaat hartelijk dank.
 
Ik weet niet of het de bedoeling was om de data in kolom 1 dan ook te verwijderen? In onderstaande code is dat wel het geval.

Code:
Sub Wissen()
Dim i As Long

For i = 1 To 500
    If UCase(Trim(Cells(i, 1))) = "KLAAR" Then
        Cells(i, 1).Resize(, 10).ClearContents
    End If
Next i
End Sub
 
Ik heb een tabel met 10 kolommen en 500 regels. In de eerste kolom staat per regel een waarde "KLAAR" of LEGE CEL. Als er "KLAAR" staat, moet de data in de 9 cellen rechts van deze cel leeg gemaakt worden. Dit moet in alle 500 regels bekeken worden.
Ik ben zelf niet zo'n kei in het maken van macro's. Wie kan mij hierbij helpen?
Bij voorbaat hartelijk dank.

Je kan de volgende code plakken in het codevenster van de sheet waarin je gaat werken.

Code:
Private Sub CheckContents(ByVal row As Long)
    Dim myRange As Range
    
    'Ga ervan uit dat de gegevens in de tien kolommen A t/m J staan
    Set myRange = Worksheets("Sheet1").Range("A" & row & ":J" & row)
        
    'Indien in de eerste kolom 'KLAAR' staat...
    'maak dan alle andere cellen in deze rij leeg
    If UCase(myRange(1, 1).Value) = "KLAAR" Then
        Worksheets("Sheet1").Range("B" & row & ":J" & row).ClearContents
    End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 1 Then CheckContents (Target.row)
End Sub

Deze code checkt of je een waarde verandert in de eerste kolom, en zo ja of de "KLAAR" bevat. Indien dat zo is wordt voor die rij de overige kolommen (in mijn geval kolommen B t/m J) leeg gemaakt...
Scheelt je een loop.
 
Etri,

-kan je niet gewoon best target meegeven als argument wanneer je checkcontents gaat aanroepen? Want wat als de sheetnaam nu niet sheet1 is? Je hoeft dan ook niet opnieuw een range gaan te definieren enz. Maw het gaat alles eenvoudiger maken.

-Een sub roep je best aan zonder haakjes, een functie met haakjes.

-Target is niet altijd 1 cel, kan ook meerdere cellen zijn dus daar moet je dan wel mee opletten (nu doordat je target.row als argument gebruikt, stelt dat probleem zich minder)

-EnableEvents aan en uitzetten lijkt me ook verstandig, maar misschien niet nodig (ongetest)

groeten,

Finch
 
Laatst bewerkt:
-kan je niet gewoon best target meegeven als argument wanneer je checkcontents gaat aanroepen? Want wat als de sheetnaam nu niet sheet1 is? Je hoeft dan ook niet opnieuw een range gaan te definieren enz. Maw het gaat alles eenvoudiger maken.
Hier snap ik je even niet. Target is alleen de eerste cel in een rij. De myRange bevat alle cellen daarna, en zal dus alsnog moeten worden aangemaakt. Bovendien zou Target verder geen functie hebben in de subroutine, behalve de 'row' eigenschap

-Een sub roep je best aan zonder haakjes, een functie met haakjes.
Is toch een kwestie van smaak, vind ik. Kan ik eventueel ook snel switchen van subroutine naar functie ;)

-Target is niet altijd 1 cel, kan ook meerdere cellen zijn dus daar moet je dan wel mee opletten (nu doordat je target.row als argument gebruikt, stelt dat probleem zich minder)
Heb je gelijk in

-EnableEvents aan en uitzetten lijkt me ook verstandig, maar misschien niet nodig (ongetest)
Omdat er normaliter maar 1 rij tegelijk wordt aangepast, leek me dat hier niet nodig. Voor zover ik kan zien, worden er geen zware berekeningen uitgevoerd :D
 
Wanneer je target as range doorgeeft heb je veel meer eigenschappen die je kan aanspreken in je sub. Stel target als range wordt doorgegeven aan de variable input (ook range), dan is input.parent de naam van de werksheet waar je over spreekt (moet je dan ook niet gaan hardcoden). Je moet dan ook niet een nieuwe range variable myrange aanmaken.

Stel nu de situatie dat er 5 cellen worden geselecteerd ineens, en dat KLAAR wordt ingevoerd via Ctrl+Enter dan wordt CheckContents bij jou enkel uitgevoerd op de eerste cel, wanneer je target als range doorgeeft en dan iets in de aard van:

Code:
input.columns(1).clearcontents

worden alle cellen meegenomen in je checkcontents.

Het komt misschien allemaal neer op welke manier van programmeren dat je ligt, maar als je de range doorgeeft kan alles wat korter en heb je minder nood aan "tussenliggende" variabelen.
 
Waarom überhaupt VBA-code gebruiken? En waarom geen autofilter?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan