Instr в vba не работает с ячейкой формулы - PullRequest
0 голосов
/ 26 января 2020

У меня есть ячейка (пример L22) с формулой (которая относится к другому листу (Лист! 1A22) и возвращает значение продажи 110 (108%). Я хотел изменить цвет текста только (108%) (а не все значение ячейки). Мой подход состоял в том, чтобы использовать Instr, чтобы найти "(" и найти длину до ")" и раскрасить его. Это код, который я использовал.

Sub colr()
Dim StartChar As Integer, LenColor As Integer
    With Flash.Range("L22")
        StartChar = InStr(1, .Value, "(")
        If StartChar <> 0 Then
            LenColor = Len(.Value) - StartChar + 1
            .Characters(Start:=StartChar, Length:=LenColor).Font.Color = RGB(255, 0, 0)
        End If

    End With
End Sub

, но код ничего не делает. Но если я заменю формулу значением, она будет работать нормально.

Ответы [ 2 ]

0 голосов
/ 27 января 2020

, когда вы используете значение, так что это даст вам фактическое число, но с текстом, это даст вам отображение в ячейке. Таким образом, вы можете изменить:

StartChar = InStr(1, .Value, "(")

на:

StartChar = InStr(1, .text, "(")
0 голосов
/ 27 января 2020

Как прокомментировали другие, невозможно манипулировать Characters результатом формулы - по крайней мере, насколько я знаю.

Самая очевидная альтернатива - записать значение и процент в две соседние ячейки, а затем используйте условное форматирование для последней.

Однако, если вы застряли в имеющемся формате, вам придется обойти проблему формулы. Расчет формулы в основном запускается при изменении любого указанного значения диапазона. Вы можете захватить это событие самостоятельно, скажем, в обработчике Worksheet_Change и записать результат вашего алгоритма в Sheet2. Это позволит вам раскрасить символы результата.

Скелетный код будет выглядеть так (в вашем объекте Sheet1):

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim cell As Range
    Dim result As Variant
    Dim pt As Long

    For Each cell In Target.Cells
        'Test for a change in the desired range.
        If Not Intersect(cell, Me.Range("A:A")) Is Nothing Then
            'Check that your cell value matches the conditions you want, eg
            If IsNumeric(cell.Value) Then
                'Calculate the result - as per your cell formula.
                result = cell.Value * 2 & " (" & cell.Value * 2 / 100 & "%)"
                'Write and colour the result.
                pt = InStr(result, "(")
                With Sheet2.Cells(cell.Row, "L")
                    .Value = result
                    .Characters(pt, Len(result)).Font.Color = RGB(255, 0, 0)
                End With
            End If
        End If
    Next
End Sub
...