VBA将参数从函数传递到子

时间:2018-09-24 14:52:22

标签: excel vba

VBA 中,我写了一个 sub ,出于这个问题,它执行以下操作:

  1. 创建一个由用户命名的新工作表
  2. 从由用户输入值的两个确定的数据库中提取数据
  3. 将已排序的数据放入新工作表(1)

我希望实现的功能是使用户能够直接从Excel工作表通过UDF输入三个变量,如下所示:

Description of how the user should interface with the code

为了实现这种特定的用户界面方法,似乎我需要使用 function 作为;

Function Do_Stuff_With_Theese_Imputs(x, y, z)
Call Do_Stuff(x, y, z)
End Function

Sub Do_Stuff(x, y, z)
'Code that makes the new sheet by the name "z"(argument from the function) here:
'Code for database handeling by the variables "x" & "y"(arguments from the function) here:
'Etc...
End sub

我可能试图以不必要的复杂方式解决此问题,因此只要用户对 UI 保持相同,我就愿意接受其他实现的建议。否则,我需要一些有关如何将 x,y和z 参数从函数传递到 sub 的帮助。

编辑: 由于我不清楚的疑问线,这已经成为一个混乱的问题:

这是用户定义的要求,可以从任何 Exel表访问该UDF(我想将其用作宏),已安装。从用户的角度来看,它应该像经典的=SUM函数一样适用。

编辑2: 再次明确一下,打开工作表时,无论是否必须始终存在(以buttonextra sheetform的形式),都可以从任何Excel工作表中访问它。 / p>

我已经注意到这可能无法实现。

3 个答案:

答案 0 :(得分:1)

选项1:考虑使用Worksheet_Change,这样,当用户更改任何单元格时,您可以使用这些单元格中的值作为参数来触发Do_Stuff。 / p>

您可以使用Intersect将操作限制为这些单元格。这里最大的挑战是确定用户何时完成输入正确的数据-毕竟他们一次只能填写一个单元格(这是您最初遇到的问题)。

选项2:,您可以向工作表旁边的单元格添加一个按钮,而不是Worksheet_Change。这里的一个技巧是根据单元格中的有效值启用按钮。用户可以在完成操作后单击按钮-该按钮将使用这些单元格中的值作为参数来调用Do_Stuff

以上两个选项不需要您更改Do_Stuff,它们只会影响您的通话方式Do_Stuff

答案 1 :(得分:0)

我会用这些方式,最好是第二种:

Sub Do_Stuff()

Dim x As Long
Dim y As Long
Dim z As String

With Worksheets(1)  'It takes the values from the first sheet, you can specify the sheet by a name
                    ' With Worksheets("NAME")

    x = .Cells(2, 2).Value
    y = .Cells(2, 3).Value
    z = .Cells(2, 4).Value

End With

'Code that makes the new sheet by the name "z"(argument from the function) here:
'Code for database handeling by the variables "x" & "y"(arguments from the function) here:
'Etc...
End Sub

或者这个:

Sub Do_Stuff()

Dim x As Long
Dim y As Long
Dim z As String

x = Application.InputBox("Write a number", "Get Number", , , , , , 1)
y = Application.InputBox("Write a number", "Get Number", , , , , , 1)
z = Application.InputBox("Write a new sheet name", "Get a new sheet name", , , , , , 2)


'Code that makes the new sheet by the name "z"(argument from the function) here:
'Code for database handeling by the variables "x" & "y"(arguments from the function) here:
'Etc...
End Sub

https://docs.microsoft.com/en-us/office/vba/api/excel.application.inputbox

答案 2 :(得分:0)

这是一个糟糕的主意

监视单元格E5进行更改。检测到更改后,触发您的代码:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$E$5" Then
        Call Do_Stuff([B2], [C2], [D2])
    End If
End Sub