Se eu criar um formulário de usuário do Excel VBA que gere dinamicamente um número variável de controles, como posso determinar a área utilizável do formulário para redimensioná-lo para ajustar os controles?
Uma captura de tela está anexada abaixo, seguida por um exemplo de código, mas as últimas linhas de código não funcionam.
Consigo escrever meu próprio código de dimensionamento automático para UserForm_Initialize(), mas isso não é possível se eu não encontrar a largura e a altura utilizáveis do formulário. Sempre há uma discrepância, que sem dúvida inclui os tamanhos das bordas, sombras, barra de título, etc.
Eu entendo que o VBA é desorganizado com várias escalas de medição, como pixels, twips, polegadas, etc. Então seria útil se alguma resposta especificasse a escala que está sendo usada, para que eu possa chamar as funções de conversão corretas.
Encontrei esta postagem sobre os sistemas de coordenadas do VBA, que ajuda, mas não responde à minha pergunta: https://www.reddit.com/r/vba/comments/1arzvx8/coordinate_systems_in_vba_userform_controls/
Private Sub UserForm_Initialize()
Dim ctls As MSForms.Controls
Dim ctl As MSForms.Control
Dim coll As VBA.Collection
Dim ctlCount As Integer
Dim colCount As Integer
Dim x As Single
Dim y As Single
Dim w As Single
Dim h As Single
Dim i As Integer
'Settings.
colCount = 5
w = 24
h = 24
'Get the objects.
Set ctls = Me.Controls
Set coll = New VBA.Collection
'Add the buttons to a collection.
ctlCount = ctls.Count
For i = 0 To ctlCount - 1
For Each ctl In ctls
If ctl.TabIndex = i Then
coll.Add ctl
End If
Next
Next
'Align the buttons.
i = 0
Do
If i < ctlCount Then
y = y + 1
Do
x = x + 1
If x <= colCount Then
i = i + 1
Set ctl = coll.Item(i)
ctl.Left = (x - 1) * w
ctl.Top = (y - 1) * h
ctl.Width = 24
ctl.Height = 24
Else
Exit Do
End If
Loop
x = 0
Else
Exit Do
End If
Loop
'Adjust the form size.
Me.Width = (x + 1) * w '### This does not work. ###
Me.Height = (y + 1) * h '### This does not work. ###
End Sub