Dynami c Назначение автозаполнения - PullRequest
3 голосов
/ 28 января 2020

Нужна помощь с этим кодом:

Dim numRows As Long

numRows = Cells(Rows.Count, "A").End(xlUp).Row

Selection.AutoFill Destination:=Range(Cells(1, 12), Cells(numRows, 12)), Type:=xlFillDefault

Макрос должен заполнить столбец L формулой. Он работает с файлами с несколькими строками, но заканчивается на:

Не удалось выполнить автозаполнение класса Range.

Для файлов с одной строкой.

Ответы [ 3 ]

3 голосов
/ 28 января 2020

Советы:

  1. Избегайте использования Selection. В вашем коде выделение может быть не тем «выделением», о котором вы думаете;) Возможно, вы захотите увидеть Как избежать использования Select в Excel VBA

  2. Ваши объекты не полностью квалифицированы. Вы можете захотеть увидеть ЭТО

  3. Вы можете использовать .Formula для ввода значений во всем диапазоне за один go.

Это то, что вы пытаетесь ( Не проверено )?

Sub Sample()
    Dim ws As Worksheet
    Dim lRow As Long

    Set ws = Sheet1 '<~~ Change as applicable

    With ws
        '~~> Get the last row
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row

        .Range("L1:L" & lRow).Formula = .Range("L1").Formula
    End With
End Sub
2 голосов
/ 28 января 2020

Проверьте, равно ли число строк нулю или меньше нуля с помощью оператора if:

Dim numRows As Long

With Sheets("Yoursheetname")

    numRows = .Cells(.Rows.Count, "A").End(xlUp).Row

    If Not numRows <= 1 Then .Cells(1, 12).AutoFill Destination:=.Range(.Cells(1, 12), .Cells(numRows, 12)), Type:=xlFillDefault

End With

Согласно моему комментарию, вы также можете использовать On Error Resume Next:

Dim numRows As Long

numRows = Cells(Rows.Count, "A").End(xlUp).Row

On Error Resume Next 'turn of error handling for the next statement

Selection.AutoFill Destination:=Range(Cells(1, 12), Cells(numRows, 12)), Type:=xlFillDefault

On Error GoTo 0 'turn error handling back on

Edit: согласно комментарию @ Peh, первый предпочтителен, так как отключение обработки ошибок (даже для одного оператора) может стать проблематичным c, если ваш код имеет (или разрабатывает) какие-либо другие проблемы.

1 голос
/ 28 января 2020

В качестве альтернативы:

Sub Test()

Dim lr As Long

With Sheet1
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    If lr > 1 Then .Range("L1:L" & lr).FillDown
End With

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...