在 VBA 中,我写了一个 sub ,出于这个问题,它执行以下操作:
我希望实现的功能是使用户能够直接从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:
再次明确一下,打开工作表时,无论是否必须始终存在(以button
,extra sheet
或form
的形式),都可以从任何Excel工作表中访问它。 / p>
我已经注意到这可能无法实现。
答案 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