El problema es que si te sale dos veces el mismo número al hacer el random vuelves a poner ese check, pero le sumas uno a i por lo que te cogera un check menos (ya que uno te lo ha cogido dos veces). El caso extremo sería que te saliera con el random seis veces el mismo número y por tanto solo te aparecería un check (que has habilitado seis veces, pero visualmente será uno solo)
Antes de ponerlo checked tienes que comprobar si ya está. Si no está lo pones checked y sumas uno a i, si está ya checked no haces nada y sacas otro número aleatorio.
Código vb:
Ver originalDo
m = CInt(Int((48 * Rnd) + 1))
If (chk0(m).Value != vbChecked)
chk0(m).Value != vbChecked
i = i + 1
If chk0(m) = 49 Then
m = m - 1
End If
If chk0(m).BackColor = vbGreen Then
m = m - 1
End If
End If
Loop Until (i = 6)