我以前曾问过这个问题的变体,但是当试图将解决方案整合在一起以获得我想要的结果时,最终会出现一些无法点击的情况。
我想遍历列A
中包含“ CalcText()”公式的所有单元格。如果它们确实包含公式,则如果它们包含值Z
,则它们匹配。如果它们全部都满足,则用户定义的函数将报告“匹配”,否则将显示“无匹配”。我的代码如下:
Function IsAMatch() As String
Dim Cell As Range
'Look at each cell in the A column
For Each Cell In Range("A:A")
'Check if the cell does not contain the wanted text
If (InStr(0, "CalcText", Cell, vbTextCompare) > 0) Then
If (InStr(0, "Z", Cell.Value2, vbTextCompare) = 0) Then
IsAMatch = "No Match"
End If
End If
Next Cell
IsAMatch = "Match"
End Function
我想我正在做的事情是遍历列A
中的每个单元,并检查它是否不包含所需的文本。但是,该函数的结果为#Value
,而不是两个文本结果字符串。
示例:
单元格A1包含公式CalcText()
,其值为Z
。
答案 0 :(得分:0)
为什么不仅仅使用find
和replace
函数,像这样
Dim r As Excel.Range
Set r = ActiveSheet.UsedRange.Find(What:="=CalcText()", After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
Set r = r.Find("z", r.Cells(1, 1), xlValues, XlLookAt.xlWhole)
r.Value = "NEW VAL"
答案 1 :(得分:0)
这应该做到:
Public Function IsAMatch()
Application.Volatile
Dim Cell As Range
Dim Ws As Worksheet
Set Ws = Application.Caller.Parent
IsAMatch = "No Match"
For Each Cell In Ws.Range("A1:A" & Ws.Cells(Ws.Rows.Count, "A").End(xlUp).Row) ' only scan used range of A:A
If (InStr(1, Cell.Formula, "calctext", vbTextCompare) > 0) And (InStr(1, Cell.Value2, "z", vbTextCompare) > 0) Then
IsAMatch = "Match"
Exit For ' added as per comment from .nomad - Exit Function could be used if no other work required.
End If
Next Cell
End Function
我添加了Application.Volatile
,以便每次都可以重新计算。不确定在您的情况下是否需要它。