Получить все ячейки в столбце, содержащем определенную формулу, где значение равно X - PullRequest
0 голосов
/ 25 февраля 2019

Я видел варианты этого вопроса, заданные ранее, но при попытке собрать решения вместе, чтобы получить результат, который я ищу, в итоге получается что-то, что просто не щелкает.

Я хочу просмотреть все ячейки в столбце 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 голосов
/ 25 февраля 2019

Это должно сделать это:

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, чтобы заставить его пересчитывать каждый раз.Не уверен, что это необходимо в вашем сценарии.

0 голосов
/ 25 февраля 2019

Почему бы просто не использовать функции 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...