VBA UserForm objeto
Pergunta
Estou realmente lutando com alguma coisa aqui. Eu tenho um módulo de classe, vamos chamá-lo FormMan que tem um monte de métodos relacionados com o grande número de userforms eu tenho no meu projeto. Um método particular é para ser chamado de um monte de lugares diferentes e é muito simples - ele simplesmente acrescenta um número definido pelo usuário de controles a um formulário e se estende a altura formas para acomodar esses novos controles
.O utilizador passa o número de controlos e o userForm.
oF.AddControlsToForm iNumberOfControls,frmTest
módulo de classe Em FormMan:
Public Sub Addcontrols(iNum as integer, oForm as userform)
//stuff happens here, oForm is used extensively
oForm.Height = i //object does not support this property or method
frmTest.Height = i //works
oForm.Show //object does not...
frmTest.show //works
end sub
Na janela Locals, oForm não tem uma propriedade de altura, de modo justo. Mas oForm tem sido definida como frmTest. Posso dizer oForm.BackColor = vbred
, e eu posso definir ctl = oform.TextBox1
por exemplo
Este pretende ser um procedimento genérico que pode adicionar um monte de controles de qualquer forma. Eu tentei carregamento e mostrando o formulário antes de atribuí-la a oForm.
Por que altura e mostram propriedades e métodos de userforms mas não de objetos declarados como userforms? O que estou fazendo de errado?
Realmente aprecio qualquer ajuda.
Solução
O problema aqui é que os objetos UserForm e frmTest não são do mesmo tipo. Na verdade, frmTest é um subtipo de UserForm que se estende-lo adicionando a propriedade de altura, entre outros membros.
Você provavelmente vai ter que recorrer a declarar seu parâmetro de função como objeto.
Public Sub Addcontrols(iNum as integer, oForm as Object)
Isso deve funcionar como você deseja, embora, infelizmente, você vai ser sacrificar a segurança tipo. A maioria dos conceitos OO tendem a desmoronar no contexto do VBA.
Outras dicas
O primeiro e mais importante a lembrar sobre VBA é que é quasi-OO, não full-OO. Eu correr em um monte de problemas malucos em torno desta questão e por isso eu agora tendem a evitar confiar inteiramente na consistência do VBA.
Dito isto, tentar fazer isso:
Dim fname = oForm.Name (or whatever the property is for this subobject)
With VBA.UserForms.Add(fname)
.Height = x
.Show
End With
Não é tão agradavelmente bizarro?!?! Eu não tenho um exemplo de código pronto e esperando, por isso não posso garantia de sucesso, mas este se sente como a abordagem correta.