Как избежать использования выделения и выбора при переходе к нижней части столбца - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь прекратить использование ActiveCell и т. Д., Поскольку StackOverflow очень часто объявляет это «nono»

Мой текущий код:

Sub SitesAndProd()

Set wb = ActiveWorkbook
Set ws = Worksheets("Data")
Set rng = ws.Cells(1, 13)

    LastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
    rng.FormulaR1C1 = "SitesAndProd"                                              'Rename Cell SitesAndProd

Set rng = ws.Cells(2, 13)

    rng.FormulaR1C1 = "=RC[-12]&RC[-4]"
    rng.Offset(0, -1).Select                                                     'Move left 1 column
    Selection.End(xlDown).Select                                                        'Go to bottom of column
    rng.Offset(0, 1).Select                                                      'Move right 1 column
    Range(Selection, Selection.End(xlUp)).Select                                        'Go to top of Column
    Selection.FillDown                                                                  'Copy Formula Down "Fill"

    Selection.Copy                                                                      'Ctrl + C
    Selection.PasteSpecial xlPasteValues                                                'Right click + V
    Application.CutCopyMode = False                                                     'Esc (stops the crawling ants


End Sub

При использовании Selection.End(xlDown).Select и xlUp позже - это не сохранение позиции диапазона

Какой лучший способ убедиться, что диапазон здесь сохранен?

При использовании следующего:

Range("M2").Select
ActiveCell.FormulaR1C1 = "=RC[-12]&RC[-4]"
Range("M2").Select
ActiveCell.Offset(0, -1).Select
Selection.End(xlDown).Select
ActiveCell.Offset(0, 1).Select
Range(Selection, Selection.End(xlUp)).Select
Selection.FillDown

код вытащит правильную форму - перейдя влево 1, вниз, вправо 1, выбрав до, затем скопировав

Любой шанс, что кто-то может указать мне правильное направление, чтобы сделать этобез ActiveCell, Selection и Select?

Ответы [ 2 ]

2 голосов
/ 05 марта 2019

Предполагается, что LastRow, рассчитанный вами для столбца A, равен тому же количеству строк в столбце M

Option Explicit
Sub SitesAndProd()

    Dim wb As Workbook, ws As Worksheet, LastRow As Long

    Set wb = ThisWorkbook
    Set ws = Worksheets("Data")
    ws.Cells(1, 13) = "SitesAndProd"
    LastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    With ws.Range(ws.Cells(2, 13), ws.Cells(LastRow, 13))
        .FormulaR1C1 = "=RC[-12]&RC[-4]"
        .Value = .Value
    End With

End Sub

Я немного подправил твой код. Вам нужно объявить ваши переменные, wb As Workbook и ws As Worksheet. Если рабочая тетрадь является той, в которой вы получили свой код, используйте ThisWorkbook вместо ActiveWorkbook, и вы получите меньше ошибок от этого.

Редактировать: Старайтесь избегать как можно больше глобальных переменных. Передайте их на ваши сабвуферы или функции как переменные.

0 голосов
/ 05 марта 2019

Я ожидаю, что ваш код:

Range("M2").Select
ActiveCell.FormulaR1C1 = "=RC[-12]&RC[-4]"
Range("M2").Select
ActiveCell.Offset(0, -1).Select
Selection.End(xlDown).Select
ActiveCell.Offset(0, 1).Select
Range(Selection, Selection.End(xlUp)).Select
Selection.FillDown

можно заменить на:

Range(Range("M2"), Range("M" & ActiveSheet.Rows.Count).End(xlUp)).Formula = "=RC[-12]&RC[-4]"

Если столбец, который вы хотите использовать для определения последней заполненной ячейки, это столбец Q:

Range(Range("M2"), Range("Q" & ActiveSheet.Rows.Count).End(xlUp).Row).Formula = "=RC[-12]&RC[-4]"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...