首先,我想为我糟糕的语言道歉,希望你能理解我的问题。
我研究了一种在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
没有产生任何影响。
我非常感谢你的帮助。
答案 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