WG, Naam aka Piet,
Ik hoop dat jullie wat tips ivm syntax kunnen appreciëren van een jarenlange VBA-programmeur...
Range("C4,C6,C7,C9,C11,C15,C19,J3,J5:J11").Select: in VBA is het niet nodig objecten te selecteren vooraleer je hun eigenschappen kan raadplegen. Dat stamt nog uit de oude macrotaal van Excel (XLM) en is niet efficiënt... De Worksheets("INDEX").Activate is dus ook in principe overbodig om de controle te doen...
Verder is het qua vorm beter om alle variabele declaraties boven de rest van de code te zetten... Dus Dim ingevuld As Integer is best de eerste lijn van de module...
Verder zou ik de range C4,C5,... , dus de te controleren cellen een rangenaam geven, bv: RangeToCheck, want stel dat je later die range verplaatst of rijen erboven toevoegt, is het adres C4,C5,... niet meer juist. Vermijd dus "hardcoding", zoals men dat noemt, want zo is je code niet flexibel... Bovendien kan je dan gewoon checken of alle cellen van die range zijn ingevuld, zonder op voorhand te moeten vastleggen dat dat 16 waardes zijn...
Met dit in gedachte is mijn volledige suggestie:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Application.WorksheetFunction.CountA(Range("RangeToCheck")) < Range("RangeToCheck").Cells.Count Then
MsgBox "Alle groene cellen moeten ingevuld worden vooraleer de workbook kan gesloten worden!.", vbCritical
Cancel = True
End If
End Sub
Met Cancel=True wordt het sluiten van de workbook afgebroken...
Succes,
Bart Verbeeck