Перетащите формулу из активной ячейки вправо, где строка является переменной, но столбец установлен - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь скопировать формулу из ячейки в столбце C прямо в столбец F. Я всегда хочу скопировать формулу из столбца C и перетащить ее через столбец F, однако строка должна определяться активной ячейкой.После перетаскивания формулы я хочу перетащить эти формулы в последнюю строку с данными в столбце B.

Пока мой VBA из записанного макроса выглядит следующим образом:

ActiveCell.FormulaR1C1 = _
    "=INDEX('Item Setup'!C2:C40,MATCH(R[-8]C2,'Item Setup'!C2,0),MATCH(R4C,'Item Setup'!R4C2:R4C40,0))"
    Range("C13").Select
    Selection.AutoFill Destination:=Range("C13:F13"), Type:=xlFillDefault
Dim lastRow As Long
    lastRow = Range("B" & Rows.Count).End(xlUp).Row
    Range("C13:F13").AutoFill Destination:=Range("C13:F" & lastRow)
    Range("C13:F13").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Первый , держитесь подальше от ActiveCell, Selection и Select, вместо этого используйте полностью квалифицированные Range и Worksheet объекты.

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

Модифицированный код

Dim Sht As Worksheet
Dim AnchorRng As Range
Dim LastRow As Long

Set Sht = ThisWorkbook.Sheets("YourSheetName") ' modify with your sheet's name

With Sht
    Set AnchorRng = ActiveCell ' .Range("C13") ' start point of your formula

    LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row ' get last row in column B

    .Range(AnchorRng, .Cells(LastRow, "F")).FormulaR1C1 = _
        "=INDEX('Item Setup'!C2:C40,MATCH(R[-8]C2,'Item Setup'!C2,0),MATCH(R4C,'Item Setup'!R4C2:R4C40,0))"
End With

Примечание : этот код не отлаживает вашу формулу, а присваивает весь диапазон.

0 голосов
/ 24 сентября 2018

Думаю, что вы можете сделать это за один раз, а также без необходимости использовать Select или Автозаполнение.

Обычно не рекомендуется основывать макрос на активной ячейке.

Sub x()

Dim lastRow As Long

lastRow = Range("B" & Rows.Count).End(xlUp).Row

With Range(Cells(ActiveCell.Row, "C"), Cells(lastRow, "F"))
    .FormulaR1C1 = _
        "=INDEX('Item Setup'!C2:C40,MATCH(R[-8]C2,'Item Setup'!C2,0),MATCH(R4C,'Item Setup'!R4C2:R4C40,0))"
    .Value = .Value
End With

End Sub
...