В вашем примере UserForm1 - это не только имя пользовательской формы, но и тип класса. Таким образом, вы можете передать пользовательскую форму либо по типу класса (ie. UserForm1), либо по универсальному c объекту (ie. Object).
При передаче его по типу класса подпись для функция будет ...
Sub printFormHeight_Works(ByRef form As UserForm1) 'class type is UserForm1
При передаче ее по типу generi c подпись функции будет ...
Sub printFormHeight_Works(ByRef form As Object) 'class type is Object
Как вы уже видно, что при передаче его по типу класса или объекту generi c все свойства и методы доступны. Однако IntelliSense доступен только при передаче его по типу класса.
Преимущество передачи его по объекту generi c заключается в том, что вы можете передавать его двум или более разным типам классов. Так, например, если у вас есть две пользовательские формы, UserForm1 и UserForm2, у вас есть два типа классов. И, таким образом, функция может принимать любую пользовательскую форму. Фактический тип класса разрешается во время выполнения.
Теперь, когда вы объявляете параметр как UserForm, это совершенно другой класс. И, как вы уже видели, свойства и методы меняются и несколько ограничены. В частности, метод Show недоступен. Я не знаю, в каком контексте это можно было бы использовать, но я уверен, что кто-то здесь, на SO, сможет дать объяснение.