在包含特定公式的列中获取所有单元格,其中值是X

时间:2019-02-25 15:44:49

标签: excel vba

我以前曾问过这个问题的变体,但是当试图将解决方案整合在一起以获得我想要的结果时,最终会出现一些无法点击的情况。

我想遍历列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

2 个答案:

答案 0 :(得分:0)

为什么不仅仅使用findreplace函数,像这样

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,以便每次都可以重新计算。不确定在您的情况下是否需要它。