为何Excel VBA用户窗体的动态位置按钮显示错位?
问题:Excel用户窗体控件被底部截断的原因与解决办法
![用户窗体底部按钮被截断截图]
已找到的解决方案
Excel会区分用户窗体的总高度(包含标题栏)和可用区域高度。使用.Height来计算控件缩放与位置的逻辑是错误的,应改用.InsideHeight获取用户窗体的可用区域高度。
问题详情
我制作了一个可随显示器分辨率缩放的UserForm,控件位置需要动态调整。从截图可见,UserForm底部的“Submit”“Skip”“Cancel”按钮被窗口截断。
运行时查看了UserForm和按钮的实际参数:
UserForm.Height:381.6Button.Top:326.7Button.Height:26.0
按计算,按钮底部边缘应为Button.Top + Button.Height=352.7,UserForm底部应剩余28.9单位(381.6-352.7),也就是底部7.6%的空间,但实际按钮仍被截断。
补充代码说明
以下是用于定义UserForm尺寸位置的函数,以及动态设置按钮位置尺寸的代码片段,供排查参考:
UserForm尺寸计算函数
Public Function fn_UserFormDimension(ByVal myForm As UserForm) As Variant Dim ufWidth As Double Dim ufHeight As Double Dim ufTop As Double Dim ufLeft As Double Dim resultArray() As Variant Dim widthScale As Double Dim heightScale As Double Dim heightTopBuffer As Double Dim heightBottomBuffer As Double Dim widthLeftBuffer As Double Dim i As Integer heightTopBuffer = 0.3 heightBottomBuffer = 0.1 widthScale = 0.4 widthLeftBuffer = 0.03 heightScale = 1 - (heightTopBuffer + heightBottomBuffer) i = 4 ufWidth = Application.Width * widthScale ufHeight = Application.Height * heightScale ufLeft = Application.Width * ((1 - widthScale) - widthLeftBuffer) ufTop = Application.Height * heightTopBuffer ReDim resultArray(1 To i) resultArray(1) = ufWidth resultArray(2) = ufHeight resultArray(3) = ufLeft resultArray(4) = ufTop fn_UserFormDimension = resultArray End Function
UserForm初始化时设置按钮的代码片段
ButtonHeight = Application.WorksheetFunction.RoundDown(Me.Height * 0.07, 1) ButtonTop = Application.WorksheetFunction.RoundDown(0.865 * Me.Height, 1)
内容的提问来源于stack exchange,提问作者Joehnny_Tarr
相关产品推荐
相关产品推荐

