Suggesties |
voorbeeldbestand
Afhankelijke validatie
|
Afhankelijke validatie is een handig hulpmiddel om een gebruiker te begeleiden bij selectie van records uit een database. Zonder VBA kun je geen validatielijsten maken van gegevens in een ander werkblad, tenzij je gebruik maakt van benoemde bereiken. Om die benoemde bereiken aan te passen aan de invoer zul je dynamische bereiken moeten defini‰ren. Excel heeft daar geen waterdichte methoden voor. Als je in de validatielijsten alleen unieke gegevens wil hebben wordt dit tamelijk complex. Met VBA kan dat eenvoudiger. Met VBA kun je op vele manieren afhankelijke validatie realiseren; de code hieronder gebruikt twee lussen. De gegevens staan in het werkblad 'database'. In werkblad 'output' hebben de cellen A2, B2 en C2 een lege validatielijst gekregen. De VBA-code hoeft daarom de lijst per cel alleen maar aan te passen (modify). De kolom van iedere cel met een validatielijst komt overeen met een kolom van de database: zo blijft de VBA-code eenvoudig. Bij het openen van het werkboek: - zet de code de 'database' in array sn - krijgt in werkblad 'output' cel A2 een lijst met unieke waarden uit kolom A van de database. - krijgen de cellen B2 en C2 een lege validatielijst - worden cellen B2,C2 en B5:B7 leeg gemaakt Private Sub Workbook_Open()
sn = Sheets("database").Cells(1).CurrentRegion
End SubFor j = 2 To UBound(sn) If InStr(c01 & ",", "," & sn(j, 1) & ",") = 0 Then c01 = c01 & "," & sn(j, 1)
NextWith Sheets("output") .Range("A2").Validation.Modify 3, 1, 1, Mid(c01, 2)
End With.Range("B2").Validation.Modify 3, 1, 1, "," .Range("C2").Validation.Modify 3, 1, 1, "," .Range("B2:C2,B5:B7").ClearContents - controle of de aktieve cel een afhankelijke validatielijst moet hebben - controle of de cel, waarvan de validatielijst afhankelijk moet zijn, gevuld is - doorloop de database en kontroleer per record of die overeenkomt met de ingevoerde gegevens in rij 2 - als ze overeenkomen voeg dan de waarde uit de -met de kolom van de aktieve cel- overeenkomende kolom van de database toe aan de tekstreeks c01, als die waarde daarin nog niet voorkomt. - wijs de tekstreeks c01 toe als validatielijst; de komma zorgt ervoor dat de tekstreeks een lijst wordt. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Select Case Target.Address
End SubCase "$B$2", "$C$2" If Target.Offset(, -1) = "" Then Exit Sub
End Selectsn = Sheets("database").Cells(1).CurrentRegion For j = 2 To UBound(sn) For jj = 1 To Target.Column - 1
NextIf sn(j, jj) <> Cells(2, jj) Then Exit For
NextIf jj = Target.Column And InStr(c01 & ",", "," & sn(j, jj) & ",") = 0 Then c01 = c01 & "," & sn(j, jj) Target.Validation.Modify 3, 1, 1, Mid(c01, 2) Methode II Daarin wordt hetzelfde gerealiseerd met wat minder VBA code. |