首页 文章

Worksheets.Add在UDF中不起作用

提问于
浏览
2

我有一个可以从我的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()从单元格调用该函数

2 回答

  • 3

    函数(UDF)有一个作用:计算一个值并将该值返回给调用它的单元格(或公式/表达式) .

    这是一个功能:

    Public Function Foo(ByVal bar As String) As String
        Foo = "Hello, " & bar
    End Function
    

    您可以在工作表单元格中使用它,如下所示:

    =Foo("dsdavidson")
    

    并且每次Excel重新计算该单元格's value, it calls the UDF, making the cell'的值时都会读取 Hello, dsdavidson .

    功能没有副作用 . 函数不会修改其他单元格 . 函数接受输入,处理并输出结果 .

    你做错了什么,使用UDF就好像它是一个宏 .

    Function 更改为 Sub ,并且不要't call it from within a cell. Make a button to call it instead. Or whatever rocks your boat. But you can' t有一个单元格公式,每次重新计算时都会将工作表添加到工作簿中 .


    宏需要 Public 和无参数 . 所以你选择'll want to take your optional parameter value from a specific cell, or display a form that lets the user pick from a list of available opened workbooks - and then call your procedure and pass the user'作为参数 .

    很可能宏代码最终可能看起来像这样(YMMV):

    Public Sub AddWorksheet()
        With New PromptForm
            .Show
            If .Cancelled Then Exit Sub
            OneSheet .SelectedBook
        End With
    End Sub
    
  • 3

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

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

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

    有关详细信息,请访问此站点... https://support.microsoft.com/en-in/help/170787/description-of-limitations-of-custom-functions-in-excel

相关问题