You can use System.Type.GetType(typeNameAsString) to convert a string to a System.Type. You'll need to store more than just "frmFormName" in the tag of the form, however, because the Type.GetType() static method requires the full name of the class.
Type.GetType("MyNamespace.frmMyFormName")
That will be what you'll have to give it.
Also, it might be the case that that method will not be able to resolve the name because your form type exists in another assembly. If that's the case, then you'll need to give it the fully qualified assembly name. It's basically the full name with a comma and the assembly name right after it like this:
"MyNamespace.frmMyFormName, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
That's the difference between the Type.GetType() static method and the GetType() keyword (the keyword turns blue when you type it). If you use the keyword, it will always resolve because the reference is resolved and at compile-time. So, you might want to create a method that will resolve the names for you and uses the keyword to get the type. Like this:
Public Shared Function ResolveFormType(ByVal formName As String) As Type
Select Case formName
Case "frmForm1"
Return GetType(frmForm1)
Case "frmForm2"
Return GetType(frmForm2)
Case "frmForm3"
Return GetType(frmForm3)
End Case
End Function
If you use this method, then the string can be any arbitrary value, as long as it's unique and you can assign it a type to return from the method.