【问题标题】:Public function to search for inside formula and make changes搜索内部公式并进行更改的公共功能
【发布时间】:2022-01-11 20:46:27
【问题描述】:

我写了一个函数,你把列名作为字符串和行号。然后它转到那个单元格并在 formula 内部发生变化,比如说 sheet1 到 sheet2

但是当我应用它时,excel 多次关闭。能有什么道理。这是代码

Public Function formchange( c As String, n As Integer, Optional valueLookFor As Variant, Optional valueChangeTo As Variant) As Variant

valueLookFOr ='sheet1'
condOne = ThisWorkbook.ActiveSheet.Range(c & n).Find(What:= valueLookFor)
valueChangeTo = 'sheet2'
If condOne <> 0 Then
    ThisWorkbook.ActiveSheet.Range(c&n).Replace(valueLookFor,valueChangeTo).Select
End If
End Function

【问题讨论】:

  • 你到底是如何“应用”它的?
  • 在 Excel 电子表格中。在公式栏上......这是你要求的吗? =formchange("F";7;"sheet1";"sheet2")
  • 你不能 .Select 使用 .Replace 的单元格,如果在该单元格中找不到该值,Find 将返回 Nothing 而不是 0。此外,对于 Find,您希望使用更多标准来确保您正在查看公式,并且您正在查看字符串的一部分而不是完整的字符串。此外,不需要查找,因为如果找不到要替换的值,替换不会出错。此外,从工作表调用的 UDF 不能对单元格进行更改,只能将值返回到它调用的单元格,除非您进行一些 hack。
  • 与您的主要问题无关,您可能会从阅读How to avoid using Select in Excel VBA 中受益。
  • 简短的回答:不要从单元格中调用它,将其设为Sub,并解决上述所有问题。

标签: excel vba replace


【解决方案1】:

正如 cmets 中所说,一个函数不能改变它所在的单元格以外的单元格。所以,我宁愿写:

Sub frmCh_caller()
    '
    formchange "a", "6"
    '
End Sub

和功能

Sub formchange(c As String, n As Integer, Optional valueLookFor As String, Optional valueChangeTo As String = "")
Dim dumstr As String, condOne as String

If valueLookFor = "" Then valueLookFor = "sheet1"
If valueChangeTo = "" Then valueChangeTo = "sheet2"

With ThisWorkbook.ActiveSheet.Range(c & n)
    condOne = lcase(.Formula())
    If Len(condOne) > 1 Then
        dumstr = Replace(condOne, valueLookFor, valueChangeTo)
        .Formula() = dumstr
    End If
End With

End Sub

就是这样。使用 Caller-sub,事情就简单多了 :) 干杯

【讨论】:

  • 谢谢!出于我的好奇,即使您将其称为 Sub(procedure),它是否也能正常工作?
  • 在 VBA 中,一个函数返回一些东西,而一个 Sub 只是做“事情”。从工作表中使用/调用的函数有很多限制/限制。从代码或按钮调用的 sub 更“强大”。干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
相关资源
最近更新 更多