Přišel jsem s nápadem, jak to udělat. To bude muset být přizpůsobeny, aby se vešly vaše konkrétní userform, ale obecná struktura můj nápad by měl být vhodný.
Mám výchozí hodnoty Userform a TextBox uloženy během UserForm_Initialize
akce. Pak během jakékoliv TextBox_Enter
nebo TextBox_Change
události UserForm se podívat, jestli je třeba změnit velikost pole, aby se vešly nový obsah. Pak během TextBox_Exit
události UserForm a Rámeček se vrátí na výchozí velikost.
Toto je kód modulu mého UserForm:
Private USERFORM_DEFAULT_HEIGHT As Integer
Private USERFORM_DEFAULT_WIDTH As Integer
Private TEXTBOX1_DEFAULT_HEIGHT As Integer
Private TEXTBOX1_DEFAULT_WIDTH As Integer
Private Sub UserForm_Initialize()
USERFORM_DEFAULT_HEIGHT = Me.Height
USERFORM_DEFAULT_WIDTH = Me.Width
TEXTBOX1_DEFAULT_HEIGHT = Me.TextBox1.Height
TEXTBOX1_DEFAULT_WIDTH = Me.TextBox1.Width
End Sub
Private Sub TextBox1_Change()
If Me.ActiveControl Is Me.TextBox1 Then Resize_To_Contents Me.TextBox1
End Sub
Private Sub TextBox1_Enter()
Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbook.UserForm1.Resize_To_Contents(UserForm1.TextBox1)"
End Sub
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Me.TextBox1.Height = TEXTBOX1_DEFAULT_HEIGHT
Me.TextBox1.Width = TEXTBOX1_DEFAULT_WIDTH
Me.Height = USERFORM_DEFAULT_HEIGHT
Me.Width = USERFORM_DEFAULT_WIDTH
End Sub
Public Sub Resize_To_Contents(TB As Object)
Dim NewHeight As Integer
Dim NewWidth As Integer
If Not TB.WordWrap Then
NewWidth = Len(TB.Text) * 5 + 4 'this fit my screen and default font size, you may need to adjust it.
Else
NewWidth = TB.Width
End If
NewHeight = TB.LineCount * 10.6 'this fit my screen and default font size, you may need to adjust it.
If NewHeight > TB.Height Then
Me.Height = Me.Height + NewHeight - TB.Height
TB.Height = NewHeight
End If
If NewWidth > TB.Width Then
Me.Width = Me.Width + NewWidth - TB.Width
TB.Width = NewWidth
End If
End Sub
Důvodem pro to, Application.OnTime
je to proto, LineCount
vyžaduje textového pole se Soustředit, což se nestává až poté, co akce skončí. Tak jsem říct, skript počkejte 1 sekundu a pak spustit, takže to, že Textové pole bude mít zaměření a můžu použít LineCount
.