Excel-Vba: код для применения формулы до последней строки не работает - PullRequest
0 голосов
/ 12 февраля 2019

Я новичок в VBA, поэтому извините, если это кажется простым вопросом.

Я пытаюсь создать макрос, который будет формировать и включать пару формул в лист, но когда я пытаюсьчтобы включить формулу до последней строки, я получаю ошибку «Ошибка времени выполнения 1004 - определяемая приложением или определяемая объектом ошибка» в следующем коде:

ActiveSheet.Range("U2:U" & LastRow).Formula = "=L2/86400"

Если я изменяю «Последнюю строку» дляНомер Макрос работает нормально.Ниже весь код.

Sheets("DLASpotPlacement").Select
Dim LastRow As Double
LastRow = Sheets("DLASpotPlacement").Cells(Rows.Count, 1).Rows
Range("A1").Select
ActiveSheet.Range("U:U, V:V, W:W").NumberFormat = "[h]:mm:ss;@"
ActiveSheet.Range("U2:U" & LastRow).Formula = "=L2/86400"
ActiveSheet.Range("V2:V" & LastRow).Formula = "=VALUE(H2)"
ActiveSheet.Range("W2:W" & LastRow).FormulaLocal = "=IF(AND(H2>0,0416666666666667;H2<=0,249988425925926);""01 - 06"";IF(AND(H2>=0,25;H2<0,4166551);""06 - 10"";IF(AND(H2>=0,4166667;H2<0,4999884);""10 - 12"";IF(AND(H2>=0,5;H2<0,7499884);""12 - 18"";""18 - 01""))))"

Спасибо за помощь

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

@ Mike;Ваша проблема в этой строке:

LastRow = Sheets("DLASpotPlacement").Cells(Rows.Count, 1).Rows

Вы сделали LastRow массивом, а не числом.Кроме того, это не Double, а Iteger (математически).Однако тип данных Integer слишком мал, и вы получите сообщение об ошибке «Overflow», если объявите его «как целое число».Вот два изменения, которые вам нужны, чтобы все это заработало:

Dim LastRow As Long
LastRow = Sheets("DLASpotPlacement").Rows.Count
...
0 голосов
/ 12 февраля 2019

Копирование формул Excel

Ошибка возникает по двум причинам :

Вы забыли End(xlUp) в расчете LastRow, например:

LastRow = Sheets("DLASpotPlacement").Cells(Rows.Count, 1).End(xlUp).Row

и должен быть объявлен как целое число, например:

Dim LastRow as Long

Код

Option Explicit

Sub CopyFormulas()

    Const cCol As Variant = "A"   ' Last Row Column Letter/Number
    Const cFirstR As Long = 2     ' First Row Number

    Dim LastRow As Long           ' Last Row Number

    With ThisWorkbook.Worksheets("DLASpotPlacement")
        LastRow = .Cells(.Rows.Count, cCol).End(xlUp).Row
        '.Cells(1, cCol).Select ' uncomment if necessary
        ' You don't need to format the entire columns.
        .Range("U" & cFirstR & ":W" & LastRow).NumberFormat = "[h]:mm:ss;@"
        .Range("U" & cFirstR & ":U" & LastRow).Formula = "=L2/86400"
        .Range("V" & cFirstR & ":V" & LastRow).Formula = "=VALUE(H2)"
        .Range("W" & cFirstR & ":W" & LastRow).FormulaLocal = _
                "=IF(AND(H2>0,0416666666666667;H2<=0,249988425925926);""" _
                & "01 - 06"";IF(AND(H2>=0,25;H2<0,4166551);""06 - 10"";IF(" _
                & "AND(H2>=0,4166667;H2<0,4999884);""10 - 12"";IF(AND(H2>=0" _
                & ",5;H2<0,7499884);""12 - 18"";""18 - 01""))))"
    End With

End Sub

Примечания

Использование FormulaLocal являетсяхороший трюк для запоминания.

0 голосов
/ 12 февраля 2019

Для LastRow используйте свойство Worksheet.UsedRange.

Вы также можете использовать свойство Range.Resize, чтобы выбрать диапазон, и заменить «Выбрать» на «С».

Dim LastRow As Double
With Sheets("DLASpotPlacement")
    LastRow = .UsedRange.Rows.count
    .Range("U:W").NumberFormat = "[h]:mm:ss;@"
    .Range("U1").Resize(LastRow - 1).Formula = "=L2/86400"
    .Range("V1").Resize(LastRow - 1).Formula = "=VALUE(H2)"
    .Range("W1").Resize(LastRow - 1).FormulaLocal = "..."
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...