【问题标题】:Worksheets.Add in UDF Not WorkingWorksheets.Add 在 UDF 中不起作用
【发布时间】:2017-03-31 17:59:51
【问题描述】:

我有一个可以从我的 Excel 工作簿的单元格中调用的 UDF。我需要它在工作簿末尾添加一个工作表。我在我的 VBA 脚本中多次使用 sheet.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()

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    函数 (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
    

    【讨论】:

      【解决方案2】:

      您不能通过用户定义的功能添加工作表。 以下是用户定义函数的限制。

      由工作表单元格中的公式调用的用户定义函数无法更改 Microsoft Excel 的环境。这意味着这样的函数不能执行以下任何操作:

      1) 在电子表格中插入、删除或格式化单元格。 2)更改另一个单元格的值。 3) 向工作簿移动、重命名、删除或添加工作表。 4) 更改任何环境选项,例如计算模式或屏幕视图。 5) 将名称添加到工作簿。 6) 设置属性或执行大部分方法。

      欲了解更多详情,请访问此网站... https://support.microsoft.com/en-in/help/170787/description-of-limitations-of-custom-functions-in-excel

      【讨论】:

        猜你喜欢
        • 2015-02-19
        • 1970-01-01
        • 2016-08-07
        • 1970-01-01
        • 1970-01-01
        • 2022-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多