VBA: Range.Formula Возвращает ошибку приложения или объекта - PullRequest
1 голос
/ 13 февраля 2020

В своем коде я пытаюсь найти разницу между значениями объектов двух разных дней.

Sub GoingBack()

numberCube = InputBox("Which file are we going back to?")
numberYest = numberCube - 1

Workbooks.Open ("C:\Users\user\Downloads\file (" & numberCube & ").xlsx")
Workbooks.Open ("C:\Users\user\Downloads\file (" & numberYest & ").xlsx")

Set Work1 = Workbooks("file (" & numberCube & ").xlsx")
Set Work2 = Workbooks("file (" & numberCube - 1 & ").xlsx")

'Add the Time Difference Column (AA--27)
LastRow67 = Work1.Sheets("67").Cells(Rows.Count, 2).End(xlUp).Row
Work1.Sheets("67").Cells(1, 27).Value = "Time Clock Difference"
Work1.Sheets("67").Cells(1, 27).FormulaR1C1 = "=RC[-15]-VLOOKUP(RC[-21], '[file (" & numberYest & ").xlsx]67'!$F:$L, 7, FALSE)"
Work1.Sheets("67").Range("AA2").Select
Selection.AutoFill Destination:=Range("AA2:AA" & LastRow67)

Work1.Close savechanges:=True
Work2.Close savechanges:=True

End Sub

Строка, которая выдает ошибку «Application Defined или Object Defined», выглядит так:

Work1.Sheets("67").Cells(1, 27).FormulaR1C1 = "=RC[-15]-VLOOKUP(RC[-21], '[file (" & numberYest & ").xlsx]67'!$F:$L, 7, FALSE)"

Я пытался использовать Range.Formula, и это тоже выдает ошибку.

Work1.Sheets("67").Range("AA2").Formula = "=L2-VLOOKUP(F2, '[file (" & numberYest & ").xlsx]67'!$F:$L, 7, FALSE)"

Любая помощь будет оценена. Большое спасибо.

РЕДАКТИРОВАТЬ: Я набрал формулу в Excel, и она работает. Я записал ввод формулы, и ниже приведен результат. Я щелкнул / сослался на столбцы с F по L, поэтому я не уверен, почему он показывает только C6: C12 ниже.

ActiveCell.FormulaR1C1 = "=RC[-15]-VLOOKUP(RC[-21],'[file.xlsx]67'!C6:C12,7,FALSE)"

1 Ответ

0 голосов
/ 13 февраля 2020

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

Рассмотрите этот рефакторинг:

Option Explicit ' always!

Sub GoingBack()
    ' Dim all variables
    Dim numberCube As Variant
    Dim numberYest As Long
    Dim Work1 As Workbook
    Dim Work2 As Workbook
    Dim LastRow67 As Long
    Dim WorkSh1 As Worksheet
    Dim WorkSh2 As Worksheet
    Dim Pth As String

    ' avoid repeats of the same data
    Pth = "C:\Users\user\Downloads\"

    ' Might be better to use FileDialog, but anyway...
    ' Handle user cancel and invalid entry
    Do
        numberCube = InputBox("Which file are we going back to?")
        If numberCube = vbNullString Then
            ' User canceled, exit
            Exit Sub
        End If
        If IsNumeric(numberCube) Then Exit Do
        MsgBox "Enter a Number", vbCritical + vbOKOnly, "Error"
    Loop
    numberYest = numberCube - 1

    ' Handle files missing or won't open
    On Error Resume Next
        Set Work1 = Workbooks.Open(Pth & "file (" & numberCube & ").xlsx")
    On Error GoTo 0
    If Work1 Is Nothing Then
        'Work1 failed to open, what now?
        GoTo CleanUp
    End If

    On Error Resume Next
    Set Work2 = Workbooks.Open(Pth & "file (" & numberYest & ").xlsx")
    On Error GoTo 0
    If Work2 Is Nothing Then
        'Work2 failed to open, what now?
        GoTo CleanUp
    End If

    ' Set refences to worksheets and handle if missing
    On Error Resume Next
        Set WorkSh1 = Work1.Sheets("67")
    On Error GoTo 0
    If WorkSh1 Is Nothing Then
        ' WorkSh1 doesn't exist, what now?
        GoTo CleanUp
    End If

    On Error Resume Next
        Set WorkSh2 = Work2.Sheets("67")
    On Error GoTo 0
    If WorkSh2 Is Nothing Then
        ' WorkSh2 doesn't exist, what now?
        GoTo CleanUp
    End If

    'Add the Time Difference Column (AA--27)
    ' use your references
    With WorkSh1
        LastRow67 = .Cells(.Rows.Count, 2).End(xlUp).Row
        .Cells(1, 27).value = "Time Clock Difference"
        ' no need for select or Autofill
        ' Can't use A1 style in FormulaR1C1
        .Range(.Cells(1, 27), .Cells(LastRow67, 27)).FormulaR1C1 = _
          "=RC[-15]-VLOOKUP(RC[-21], " & WorkSh2.Range("F:L").Address(, , xlR1C1, True) & ", 7, FALSE)"
    End With

CleanUp:
    Work1.Close SaveChanges:=True
    Work2.Close SaveChanges:=False ' you didn't change file 2

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