Let me break this down into separate questions:
First, VB6 is not VB.Net and does not use the .NET Framework, but instead uses the older COM environment. (I canβt say if you know this).
Secondly, what your link points to is really Classes built into VB6. Although, yes, he calls them "Objects." Careless terminology on their part.
Third, and, most importantly, in VB6, everything is not an object, and objects are not even a standard or dominant category of data types. What is it, something like .Net value types, but much smaller (most did not even have run-time type containers, only addresses in memory).
Thus, most data elements were not objects, therefore they did not have classes, therefore they did not have any inheritance, therefore they were not received from anything else, and therefore did not have a "type hierarchy", and therefore could not be all at the "top "their type hierarchies (although things that were classes / objects had it all). Thus, you did not have a base / root data type that you could use for any other data type, which would be a problem for all cases of passing parameters, etc. Situations.
The options were a kind of preliminary solution to this problem, which in earlier versions of VB were implemented (before objects in VB) to solve this problem. A variant is simply a dynamic descriptor that wraps another element of any data type. When you use it, it (as a rule) acts as if you are directly using what it contains, but you really go through the option to get some type of data item that it currently contains.
Variant itself keeps track of what type of content data it is and invokes the VB code to access it differently / appropriately (a primitive kind of polymorphism).
If that sounds like his shreds and there was a lot of overhead, well, that was it. But at the time, it was the best solution available when you needed to process "any type of data."