vba - Worksheets.Add 在 UDF 中不起作用

标签 vba excel

我有一个可以从 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/

相关文章:

VBA:将具有值的字段添加到记录集

excel - 如何从作为所选单元格内容的名称列表创建多个工作表

sql - 如何导入具有动态工作表名称的 Excel 文件? (T-SQL)

arrays - 在 Excel VBA 中对二维数组进行排序

excel - 为什么 `On Error Resume Next` 在下面的代码中没有跳过错误 `File not found`?

vba - 使用字符串值调用 VBA 子程序

excel - 编辑 VBA 脚本用户窗体

vb.net - 如何在 vb.net 中将数据网格保存为 excel?

SUMIFS 的 VBA 代码?

regex - 如何在 VBA 中使用 RegExp 隔离空格(\s 与\p{Zs})?