Hola!
El objeto Recordset tiene una propiedad que es Fields (campos), que es una colección en la que cada uno de sus elementos tiene a su vez la propiedad Value, entre otras, que es el contenido del campo dentro del registro actual.
Puedes obtener el número de campos que tiene la consulta mediante la propiedad <nombre del recordset>.Fields.Count, y luego el valor de cada campo mediante <nombre del recordset>.Fields(<indice>).Value.
¡Recuerda que un campo vacío es una cosa y que un valor nulo es otra! La distinción debes hacerla con la función IsNull, y es necesario hacerlo en dos comprobaciones distintas, más o menos así:
Código:
If IsNull(<nombre del recordset>.Fields(<indice>).Value) Then
CuentaVacios = CuentaVacios + 1
ElseIf <nombre del recordset>.Fields(<indice>).Value="" Then
CuentaVacios = CuentaVacios + 1
End If
Adelantándome a dudas

, la razón de que lo siguiente no funcione:
Código:
If IsNull(<nombre del recordset>.Fields(<indice>).Value) Or <nombre del recordset>.Fields(<indice>).Value="" Then
CuentaVacios = CuentaVacios + 1
End If
es que VB intenta evaluar todas las expresiones de un mismo If antes de decidir si se cumple por completo o no.
Por ejemplo, si das con un campo nulo, según este segundo ejemplo, la primera expresión ya sería cierta (la del IsNull), con lo que en teoría no haría falta evaluar la segunda. Sin embargo, VB sigue evaluando, y no se puede comparar un valor nulo con nada (una cadena vacía en este caso), ya que produce un error.