VBA 表单可以有流布局吗?

Posted

技术标签:

【中文标题】VBA 表单可以有流布局吗?【英文标题】:Can VBA Forms have a Flow Layout? 【发布时间】:2012-06-29 15:10:07 【问题描述】:

我猜这是不可能的,但还是这样吧。

Java 和最近的 .Net 更新支持流布局 - 布局管理器重新排列表单控件以适应可用空间。

我只见过使用硬编码绝对位置的 VBA 和 WinForms。

有没有人在这种情况下遇到过流布局管理器?

【问题讨论】:

【参考方案1】:

Access 2007 及更高版本通过锚定实现此功能:Make controls stretch, shrink, or move as you resize a form

如果您想在早期版本中执行此操作,您可以使用表单的 On Resize 事件自行滚动。

【讨论】:

啊,这是我要注意的新功能,谢谢。现在,我想知道我的客户什么时候会“跃进”并采用 Access 2007 ;-)【参考方案2】:

我有一个这样布局的表格。我的所有控件都根据它们的垂直位置依次命名:txt_R1、txt_R2、txt_R3 等...

当表单加载时,它看起来像这样:

当我更新组合框时,下面的代码会执行:

Dim s_tier As String
Dim s_rate As String
Dim s_lbl_Rate As String
Dim s_lbl_Tier As String
Dim s_obj As String

Me.TXT_Min.Visible = True
Me.LBL_MIN.Visible = True
Me.TXT_Min.Value = 0

Me.TXT_Scale.Visible = True
Me.lbl_Scale.Visible = True
Me.TXT_Scale.Value = 0

Me.txt_MinMax.Visible = True
Me.lbl_MinMax.Visible = True
Me.txt_MinMax.Value = 0

s_tier = "TXT_T"
s_rate = "TXT_R"
s_lbl_Rate = "LBL_R"
s_lbl_Tier = "LBL_T"

For i = 1 To numActive
    
    'Tier Text Box
    s_obj = s_tier & i
    
    Me(s_obj).Visible = True
    Me(s_obj).Value = "NULL"
    
    'Tier Label
    s_obj = s_lbl_Tier & i
    
    Me(s_obj).Visible = True
                            
    'Rate Text Box
    s_obj = s_rate & i
    
    Me(s_obj).Visible = True
    Me(s_obj).Value = "NULL"
    
    'Rate Label
    s_obj = s_lbl_Rate & i
    
    Me(s_obj).Visible = True

Next i

'set last tier to infinite, since last tier typically goes on forever
s_obj = s_tier & numActive

Me(s_obj).Value = ChrW(&H221E)
Me(s_obj).FontSize = 16

'Make Test button visible and move to appropriate place

s_obj = s_lbl_Tier & (numActive + 1)

Me.Btn_Test.Top = Me(s_obj).Top
Me.Btn_Test.Left = Me(s_obj).Left
Me.Btn_Test.Visible = True

s_obj = s_tier & (numActive + 1)
'Make Test button visible and move to appropriate place
    
Me.btn_SQL.Top = Me(s_obj).Top
Me.btn_SQL.Left = Me(s_obj).Left
Me.btn_SQL.Visible = True
Me.Refresh

如果在组合框中选择了“1”,则刷新后的表单现在如下所示:

... 或者如果在组合框中选择了“2”:

... 或者如果在组合框中选择了“3”:

我的方法的关键是使用顺序命名约定来利用

for i = 1 to numactive

一段代码。循环结束后,所有静态控件都可见。我可以将 numactive 变量添加 1 以确定第一个不可见控件的位置,并将我的“浮动”控件锚定到该位置。

可以调整此方法以使用偏移量而不是其他控件的位置实际将任何控件放置到任何位置。尽情发挥你的想象力吧!

【讨论】:

【参考方案3】:

WinForms 当然有FlowLayoutPanel 和TableLayoutPanel..

有一个example of AutoLayout for Winforms on MSDN。

【讨论】:

我很欣赏它在 .Net 中是可能的——尽管它似乎很少使用。但是您知道 VBA 解决方案吗?

以上是关于VBA 表单可以有流布局吗?的主要内容,如果未能解决你的问题,请参考以下文章

访问VBA无法刷新表单

用户表单组合框大小 - VBA

VBA:右键单击用户表单

访问当前记录上的 VBA 打开表单

VBA 防止用户输入表单中出现空字段

如何在子表单中搜索特定值以返回 VBA 结果