【问题标题】:How to open and run a userform?如何打开和运行用户窗体?
【发布时间】:2016-08-16 09:03:36
【问题描述】:

我在一个名为“userform”的 Excel 文件上有一个用户表单:

Private Sub add1_Change()
End Sub

Private Sub add2_Change()
End Sub

Private Sub Calc_Click()
Result.Value = Val(add1.Value) + Val(add2.Value)
End Sub

此用户表单从用户那里获取值并将它们相加并在文本框中显示结果。

我想在另一个名为“input”的工作簿中创建一个新宏。此工作簿中的宏应打开用户表单工作簿,在文本框 add1 和 add2 中输入值,然后运行用户表单计算按钮。

到目前为止我已经尝试过:

  • 设置add1.value 以从例如单元格A1 中提取一个值,add2.value 也是如此。
  • 然后我在输入工作簿上创建了一个宏来更改单元格 A1 和 A2 中的值。

这里的问题是我不知道如何打开用户窗体并单击计算。

理想情况下,我想要一个打开用户表单、输入数据并点击计算然后关闭用户表单的宏 - 而不是编辑用户表单本身。

【问题讨论】:

  • 为什么要使用用户表单呢?表单的重点是从用户那里获取输入。如果你不这样做,那就没有多大意义了。
  • 在 wb 中有类似 Public Sub getUF(a): Set a = UserForm1: End Sub 的用户表单,允许直接捕获该对象...只需运行 getUF MyUFVariable 然后使用 MyUFVariable 就像你一样用户表单...
  • @Rory 我同意你的观点,但是我有一个比显示的更大的用户表单,这样做会更容易,而不是从头开始分解用户表单。这正是我现在需要做的。
  • @DirkReichel 你能详细说明一下吗?我已经添加了您所说的内容,但是说我想更改 add1 文本框上的值,我该如何称呼它?现在,我有这个:'Sub userform() Dim a As Integer Dim b As Integer a = Cells(1, 2) b = Cells(2, 2) Workbooks.Open (ThisWorkbook.Path & "\userform.xlsm" ) Application.Run "userform.xlsm!Calc" End Sub' calc 宏只是打开了用户窗体,我不知道如何实际“输入”数据或点击计算
  • @james1395 您想从Worksheet 获取输入,进行计算然后将其放在某处?你的UserForm 还做了什么不希望现在更改为纯 VBA 代码选项而不是不需要的UserForm

标签: excel vba


【解决方案1】:

您可以通过这种方式在UserForm 中添加 2 个值(与您现在尝试执行的操作略有不同):

您使用当前代码打开UserForm

Sub userform()
    Workbooks.Open (ThisWorkbook.Path & "\userform.xlsm")
    Application.Run "userform.xlsm!Calc"
End Sub

如上所示,您没有分配任何值,这将发生在您的userform.xlsm Workbook

以下是您放入Initialize 的子UserForm 的代码:

Private Sub UserForm_Initialize()

    Dim wb As Workbook
    Dim ws As Worksheet

    Set wb = Workbooks("input.xlsx")
    Set ws = wb.Worksheets("Input")

    Dim i as Integer
    Dim k as Integer

    UserForm.add1.Value = ws.Range("A2").Value
    UserForm.add2.Value = ws.Range("B2").value
    UserForm.calc.Value = val(UserForm.add1.Value) + val(UserForm.add2.Value)

End Sub

如上图calc改成Textbox,因此在加载用户窗体时不需要点击按钮直接完成。

您也可以使用Label 代替Textbox

然后代码将更改为:

UserForm.calc.Caption = Str( val(UserForm.add1.Value) + val(UserForm.add2.Value) )

【讨论】:

  • 谢谢,这行得通 - 但我真的想避免更改原始用户表单,即应该保持完全相同,但只编辑输入工作簿 - 你知道这是否可能吗?
  • @james1395 问题是你需要模拟一个Click event,它并不漂亮,而且很容易失败,因为你让VBA像一个按钮一样被按下。换个Button真的会有那么大问题吗?
  • 调用子程序计算公共工程。还是谢谢
  • @james1395 啊,你没有把那个代码放在点击按钮里面然后它就可以了:)
【解决方案2】:

@DirkReichel 你能详细说明一下吗?我已经添加了您所说的内容,但是说我想更改 add1 文本框上的值,我该如何称呼它?现在,我有这个:'Sub userform() Dim a As Integer Dim b As Integer a = Cells(1, 2) b = Cells(2, 2) Workbooks.Open (ThisWorkbook.Path & "\userform.xlsm" ) Application.Run "userform.xlsm!Calc" End Sub' calc 宏只是打开了用户窗体,我不知道如何实际“输入”数据或点击计算

答案:

我创建了 2 个 WB,只是这个简单的代码对我有用……但是:您可能需要更改信任中心的设置。

Book1 模块:(带有Userform1 的WB 持有TextBox1CommandButton1

Option Explicit

Public Function getUF()
  Set getUF = UserForm1
End Function

Book2 模块:

Option Explicit

Public ExtUF As Variant

Sub the_UF()
  Workbooks.Open "Book1.xlsm"
  Set ExtUF = Application.Run("Book1.xlsm!getUF") 'get the Form

  Debug.Print ExtUF.TextBox1.Value  'check old value
  ExtUF.TextBox1.Value = "dada"     'change it
  Debug.Print ExtUF.TextBox1.Value  'check for new value

  ExtUF.CommandButton1.Value = True 'hit the button
  ExtUF.Show                        'show the form
   Stop 'to check the userform
  ExtUF.Hide                        'hide it again
End Sub

现在只需运行 the_UF 并检查功能。如果一切正常,请按照您需要的方式将其应用到您的代码中。

如果你有任何问题,尽管问;)

【讨论】:

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