Преобразовать только часть формулы в абсолютную ссылку из относительной ссылки

#vba #excel

#vba #excel

Вопрос:

Прежде всего, я прошу прощения, если это глупый вопрос, но я просто не смог найти ответа нигде в Интернете. У меня есть вопрос ко всем, кто знаком с изменением относительной формулы на абсолютную формулу с помощью vba.

Моя проблема прямо сейчас заключается в том, что моя абсолютная формула определяется путем вычисления разности строк различных условий ячеек в других столбцах (столбец C), поскольку я ввел несколько формул в столбце (столбец B) с помощью vba. Следовательно, абсолютная формула, которой я хочу достичь, непредсказуема и постоянно меняется.

    Set Rng = Range(Cells(2, 3), Cells(lastrow, 3))
        Range("B2").Select
        startb = lastrow
        For b = lastrow To 2 Step -1
        If Cells(b, 3) <> Cells(b - 1, 3) Then
        endb = b
        rowdiff = startb - endb
        Cells(end, 2).Select
        ActiveCell.FormulaR1C1 = "=Countif(RC[-1]:R[" amp; rowdiff amp; "]C[-1],RC[-1])"
        ActiveCell.Formula = Application.ConvertFormula(Formula:=ActiveCell.Formula, fromreferencestyle:=Application.ReferenceStyle, toabsolute:=xlAbsolute)
        Selection.Copy
        Range(Cells(startb, 2), Cells(endb, 2)).Select
        ActiveSheet.Paste
        Application.CutCopyMode = False

        End If
        Next b
  

Как вы, ребята, можете видеть, у меня есть строка кода, которая может сразу преобразовать относительную формулу в абсолютную. К сожалению, в моей формуле COUNTIF мне нужен абсолютный диапазон (раздел перед запятой), но относительные критерии (в данном случае RC [-1] после запятой).

Могу ли я что-нибудь сделать, чтобы просто преобразовать частичную формулу в абсолютную? Или такой вещи нет? Мы высоко ценим любую помощь и совет. Пожалуйста, дайте мне знать, если я делаю это совершенно неправильным способом.

Спасибо за чтение и потраченное время.

Комментарии:

1. выполняется ли ваш код без проблем? После нее не может быть вызвана ни одна переменная end . Вызываемая переменная используется lastRow в качестве индекса столбца . Какова фактическая цель вашего кода?

2. извините за все опечатки. Я отредактировал соответствующим образом. Ранее я менял имена строк на более короткие, потому что имя переменной в моих кодах было слишком длинным. забыли о невозможности использования «end» в качестве переменной. Этот код выполняется без проблем.

3. смотрите мой опубликованный ответ

Ответ №1:

что касается вашего самого момента частичного преобразования формулы из относительной в абсолютную, за исключением ссылки на последнюю ячейку, вы могли бы использовать эту функцию

 Function LeaveLastRelative(strng As String) As String
    LeaveLastRelative = Left(strng, InStrRev(strng, ",")) amp; Replace(Right(strng, Len(strng) - InStrRev(strng, ",")), "$", "")
End Function
  

чья более подробная и (возможно) понятная версия:

 Function LeaveLastRelative(strng As String) As String
    Dim strng1 As String, strng2 As String

    strng2 = Right(strng, Len(strng) - InStrRev(strng, ","))
    strng1 = Left(strng, InStrRev(strng, ","))
    LeaveLastRelative = strng1 amp; Replace(strng2, "$", "")
End Function
  

для использования в качестве:

             ActiveCell.FormulaR1C1 = "=Countif(RC[-1]:R[" amp; rowdiff amp; "]C[-1],RC[-1])"
            ActiveCell.formula = Application.ConvertFormula(formula:=ActiveCell.formula, fromreferencestyle:=Application.ReferenceStyle, toabsolute:=xlAbsolute)
            ActiveCell.formula = LeaveLastRelative(ActiveCell.formula) '<--| here you use the function
  

Комментарии:

1. Спасибо пользователю 3598756 за ваш ответ и помощь. Весь раздел формулы активной ячейки стал абсолютной ссылкой, как это было представлено ранее. Я попробовал обе ваши функции. Где я сделал неправильно?

2. моя ошибка: Application.ConvertFormula() не возвращает преобразованную формулу, поэтому ее нужно вызвать самостоятельно, а затем использовать LeaveLastRelative() функцию для ее результата, оставленного в ячейке. смотрите отредактированный ответ

3. @Skyler, ты справился с этим?

4. да, наконец-то это сработало! это фантастика, и она хорошо работает! большое спасибо за это! Я не знаком с функциями [Right] и [Left], и я обязательно хорошо это изучу.