[] are only needed if names have space or punctuation/special characters and sometimes if it is a reserved word.

Syntax is not correct.

If labels are associated with data control (textbox, combobox, etc) they will not be visible when data control is not visible.

Why are you using a number iterating loop? All controls have the same number. What needs to change is the text prefix. If you want a number iteration then controls would need a generic name like: tbxData1, tbxData2, etc.

Most likely controls that are blank are Null, not empty string. I never allow empty string in fields.

Since visibility is dependent on value of Pill20 and I see only 3 other controls:

For i = 1 to 3
Me("tbxData" & i).Visible = Not IsNull(Me.Pill20)
Next

If you actually have 20 sets of these 4 fields/controls, then your db structure is bad.

If you want to keep the names as they are, alternative is to use control's Tag property. Set it to some value like "Grp1". Then code would loop through ALL controls on form and look at the Tag value and only set visibility for those that are "Grp1".