Variantは使う必要がないところでは
使うべきではないけれど、
使う必用があるところでは普通に使うべきだよ。

例えば、データベースの文字列型(NULL許容)とかね。
文字列型のフィールをString型に入れる。
nullはどうするのかといえば、空文字をnullとみなす。
まあOracleも似たようなものだから、それもありかもしれんが、
じゃあ数値型(NULL許容)はどうする?0をnullとみなす?
いやいや、0円とか普通にあるから。じゃあ-1をnullとみなす?
それでいいとは限らない。真偽値型(NULL許容)はどうするんだ?

場合よっては0がnullだったり-1がnullだったり-999999がnullだったり。
時と場合により、フラグを使う?
Integer型をラップした Integerクラスを作るのもありかもね。
でも、こんなめちゃくちゃだと破綻するのは目に見えてる。
こういう場合、素直にVariant型を使った方がいい。
Variantは気をつけないといけないことがあるが、気をつければいいだけの話。

まあC#ではnull許容型というのも出来たけどね。