【问题标题】:How to prevent Excel UserForm from shrinking/expanding autonomously?如何防止 Excel 用户窗体自动收缩/扩展?
【发布时间】:2019-06-06 19:31:54
【问题描述】:

我的 Excel 用户窗体包含各种对象,包括文本框、组合框、单选按钮等。当我的笔记本电脑在扩展坞上并且 VBA 窗口打开时,用户窗体和用户窗体上的对象会收缩和扩展更大的显示器。

当我从 VBA 中的“表单”选项卡访问用户表单编辑器时,我可以拖动用户表单调整大小手柄,用户表单中的对象将立即恢复到其原始状态,但我想以编程方式执行此操作,以便最终用户不会处理缩小/扩展的用户表单。

我曾尝试在打开时调整用户窗体的大小 (UserForm_Initialize),但似乎在用户窗体不活动时发生收缩/扩展,这意味着我的用户窗体调整大小仅用于将用户窗体返回到其收缩/扩展状态而不是它的原始状态。

Sub UserForm_Initialize()

 Call ResizeUserform(Me)

End Sub

Sub ResizeUserform(UserForm_Name As Object)

 UserForm_Name.Width = UserForm_Name.Width + 0.001
 UserForm_Name.Width = UserForm_Name.Width - 0.001

 UserForm_Name.Height = UserForm_Name.Height + 0.001
 UserForm_Name.Height = UserForm_Name.Height - 0.001

End Sub

【问题讨论】:

  • 表单通常不会自动收缩或扩展 - 恰恰相反,在 MSForms 中制作“反应式”UI 绝对是一场噩梦,因为 UI 框架无济于事有任何布局。表格是否最大化? BorderStyle 是什么?
  • 您可以尝试处理Resize 事件,看看是否可以绝对定位其中的每个控件(例如Me.TextBox1.Left = Me.Width - RightMargin - Me.TextBox1.Width 等)...祝您好运!
  • @MathieuGuindon 我已经为 BorderStyle 尝试了“None”和“Single”,它似乎对缩小/扩大没有影响。另外,我没有给用户调整表单大小的选项,所以它应该总是最大化。
  • 拥有一个最大化的表单 is 提供调整大小的选项:所有需要的是...具有不同大小的第二台显示器。当表单移动到另一个监视器并调整大小时,应该触发其Resize 事件。
  • 要么你处理Resize 并让表单看起来不错,不管它显示在什么显示器尺寸上,....或者你让它最大化 - 那样'将永远是相同的大小,无论监视器大小。

标签: excel vba userform


【解决方案1】:

不要让表单的维度模棱两可或容易出现逻辑循环(即作为其自身的函数);在加载/显示之前设置它们。

即:

   'where XX and YY are integer constants:
   With YourFormName
        .width=XX
        .height=YY
        .show
    end with

如果您绝对需要使用循环语句,请通过将计算变量存储在全局/局部变量中间接执行此操作,然后继续声明其属性(即 YourFormName.width=variable)

祝你好运!

【讨论】:

  • 这最终成为我尝试过的所有解决方案中最好的(也是最简单的)。对于每个用户窗体,我在 UserForm_Initialize 例程的开头硬编码高度和宽度。这适用于具有不同分辨率的不同显示器。
【解决方案2】:

我遇到了类似的问题,每次程序打开登录用户表单时都会比上次小。它只在我的笔记本电脑上用额外的显示器做到了。我终于用了

Private Sub UserForm_Initialize()
   With Userform
      .Width = Application.Width * 0.3
      .Height = Application.Height * 0.6    
   End With
End Sub 

在用户表单代码中,它有点停止了,这意味着它不再向用户显示更改,但是如果我打开 VBA,它会更改高度和宽度的大小,但因为它仅在 VBA 中,而用户没有必须尝试在迷你框中输入密码。

【讨论】:

    【解决方案3】:

    不要使表单最大化。 “最大化”意味着您在设计时知道表单的大小,因为您所做的取决于它所显示的显示器大小。

    更大的显示器 = 更大的最大化形式,这是设计使然。

    如果您不希望表单在不同大小的显示器中显示时自动调整大小,请不要将其最大化。


    或者,处理表单的Resize 事件,并以编程方式将每个控件移动到它需要相对于右下边缘的位置。请注意,编写这些代码非常棘手且非常烦人,尤其是在表单很复杂的情况下。没有最大化的形式要简单得多。

    【讨论】:

      【解决方案4】:

      这个操作也可以用循环来完成。我使用按钮来增加和减少用户窗体的高度。我创建了一个循环并将其分配给按钮。同时有一个很好的动画。 您设置一个高度值,当按下按钮时,如果高度小于此值,则用户窗体会变长,如果高度较大,则用户窗体会变短。 代码:

      Private Sub CommandButton4_Click()
      Dim X, d, yuk, mak As Integer
      For X = 1 To 100
      DoEvents
      If e = 0 Then
      d = d + 10
      yuk = 242
      mak = 342
      Else
      d = d - 10
      yuk = 345
      mak = 245
      End If
      UserForm2.Height = yuk + d
      If UserForm2.Height >= mak And e = 0 Then GoTo 10
      If UserForm2.Height <= mak And e = 1 Then GoTo 20
      Next
      10 CommandButton4.Caption = "<"
      e = 1
      ListBox1.ListIndex = 0
      ScrollBar1_Change
      Exit Sub
      20 CommandButton4.Caption = ">"
      e = 0
      ListBox1.ListIndex = 0
      End Sub
      

      这是视频:https://www.youtube.com/watch?v=1LCxgQGy9tU

      Source and Example file here

      【讨论】:

      • 尽量避免所谓的 Spaghetti code 使用从以前 BASIC 时代继承的 GoTo 命令 - 这不是最先进的,因为您可能会忘记任何内部结构;此类例程通常只接受错误处理。顺便说一句,Dim X, d, yuk, mak As Integer 只会将mak 声明为Integer,被忽略的变量Xdyuk 被解释为Variant,因为它们没有明确声明为Integer:MS 帮助状态:"如果不指定数据类型或对象类型,且模块中没有Def_type_语句,则变量默认为Variant。"
      【解决方案5】:

      我遇到了类似的问题。唯一对我有用的是进入 Excel 的高级选项并选中“禁用硬件图形加速”框。我浪费了几个小时试图找到这个。我希望这对其他人有帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-16
        • 2018-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多