加载项函数Range.Delete方法失败

时间:2018-04-19 18:48:39

标签: excel vba excel-vba range excel-addins

首先,我想为我糟糕的语言道歉,希望你能理解我的问题。

我研究了一种在Excel中获取泛型函数的方法,并找到了加载项方法。所以我试着用它来开发自定义功能,这可以帮助我完成日常工作。我开发了第一个工作的功能。所以我认为我的插件编程和安装很好。但是当我尝试实现工作表交互时,没有任何内容。

我的代码必须删除由这些代码的单元格中的特殊代码标识的行。我没有得到任何错误消息,代码似乎完全执行。我尝试过其他方法,如Cells.delete,Cells.select,worksheet.activate或range.delete,但我遇到了同样的问题。

这是我的函数代码:

Public Function NotBin1Cleaning(rSCell As Range) As Integer
Dim sht                 As Worksheet
Dim aLine               As New ArrayList
Dim iLine               As Integer
Dim iCpt                As Integer
Dim iFail               As Integer
Dim i                   As Integer
Dim oRange              As Object

Set sht = rSCell.Parent
iLine = sht.Cells.Find("*PID*").Row
For Each rCell In Range(sht.Cells(iLine, 1), sht.Cells(sht.Cells(iLine, 1).End(xlDown).Row, 1))
    If sht.Cells(rCell.Row, 2) > 1 Then
        iLine = rCell.Row
        iCpt = iLine + 1
        Do Until sht.Cells(iCpt, 2) = 1
            If Not sht.Cells(iCpt, 1) = rCell Then Exit Do
            iCpt = iCpt + 1
        Loop
        If sht.Cells(iCpt, 1) = rCell Then
            sht.Range(sht.Cells(iLine, 1), sht.Cells(iCpt - 1, sht.Cells(iCpt, 1).End(xlToRight).Column)).Delete xlUp
            iFail = iFail + 1
        End If
    End If
Next
NotBin1Cleaning = iFail
End Function

这就是行:

sht.Range(sht.Cells(iLine, 1), sht.Cells(iCpt - 1, sht.Cells(iCpt, 1).End(xlToRight).Column)).Delete xlUp

没有产生任何影响。

我非常感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

此问题在Microsoft支持网站上作为有意设计的一部分进行了描述

以下部分,more detail here(强调我的)

  

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

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

用户定义函数的目的是允许用户创建   自定义函数,不包含在附带的函数中   Microsoft Excel。 Microsoft Excel中包含的功能也不能   改变环境。函数可以执行计算   将值或文本返回到输入它们的单元格。   任何环境变化都应该通过使用Visual来实现   基本子程序。

基本上,这意味着您尝试做的事情不会以如此简洁的方式运作。正如我从进一步阅读中所理解的那样,限制是因为Excel多次运行单元格方程/函数来确定依赖关系。这将导致您的函数被调用两次或更多次。如果你可以删除行,由于运行次数过多,可能会意外删除超过两倍的行数。

但是,另一种方法是让函数输出一个唯一的字符串结果,不应该在工作簿中的任何其他位置找到(可能类似[@]><)。

然后你可以有一个sub,手动运行 ,它会找到该唯一字符串的所有实例,并删除这些行。 (注意:如果您在字符串中包含任何典型的通配符,则必须在它们前面加~才能使用.Find方法找到它们。)甚至可以用快捷键设置子/宏。 警告:如果复制Excel已使用的快捷键,它将运行宏而不是默认值。如果有其他用户使用此工作簿,他们可能会遇到一些意想不到的结果。

如果您决定采用这条路线,我建议您使用此行:

Public Const dummy_str = "[@]><" ' whatever string you decided on.
使用您的代码在您的模块中

。它不在任何函数或子函数之外,因此它是全局的,然后你可以像引用任何其他字符串变量一样引用const。

答案 1 :(得分:-3)

当你写:

sht.Range(sht.Cells(iLine, 1),....

第一个参数应该是行号,但是你要引用一个Cell。您应该更改sht.Cells(iLine, 1)的{​​{1}}。

BUT

而不是所有这些,更容易使用方法iLine

Row.Delete