我有一个可以从 Excel 工作簿的单元格内调用的 UDF。我需要它在工作簿末尾添加工作表。我在我的 VBA 脚本中多次使用sheets.add,但从未在从单元格内部调用的函数中使用过,这显然导致了一些问题。
该函数接受一个可选参数作为要在其中添加工作表的工作簿的文件路径,如果用户将此留空,我想默认为事件工作簿。
下面是相关代码...我做错了什么?
Public Function onesheet(Optional filepath As String)
Dim wb As Workbook
Dim ws As Worksheet
If filepath = "" Then
Set wb = ActiveWorkbook
Set target_ws = wb.Sheets.Add(after:=wb.Sheets(wb.Sheets.Count))
End If
该函数正在从单元格中调用 =onesheet()
最佳答案
函数 (UDF) 具有一个作用:计算一个值并将该值返回到调用它的单元格(或公式/表达式)。
这是一个函数:
Public Function Foo(ByVal bar As String) As String
Foo = "Hello, " & bar
End Function
您可以在工作表单元格中使用它,如下所示:
=Foo("dsdavidson")
每次 Excel 重新计算该单元格的值时,它都会调用 UDF,使单元格的值读取为 Hello, dsdavidson
。
函数没有副作用。函数不会修改其他单元格。函数接受输入、处理它并输出结果。
你做错了什么,将 UDF 当作宏来使用。
将 Function
更改为 Sub
,并且不要从单元格内调用它。制作一个按钮来调用它。或者任何让你感到不安的事情。但是,您不能使用单元格公式在每次重新计算时将工作表添加到工作簿中。
宏必须是公共(public)
并且无参数。因此,您需要从特定单元格获取可选参数值,或者显示一个表单,让用户从可用的已打开工作簿列表中进行选择,然后调用您的过程并将用户的选择作为参数传递。
宏代码很可能最终看起来像这样(YMMV):
Public Sub AddWorksheet()
With New PromptForm
.Show
If .Cancelled Then Exit Sub
OneSheet .SelectedBook
End With
End Sub
关于vba - Worksheets.Add 在 UDF 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43146941/