Как исправить ошибку «Ошибка времени выполнения 1004» с помощью функции Target.Formula - PullRequest
0 голосов
/ 22 мая 2019

У меня есть файл, в котором я хочу проверить, пуста ли ячейка "$ A $ 2", и если это правда, я хочу добавить формулу (=VLOOKUP($I$2;'Raw Data'!$A$1:$AH$5000;4;FALSE) в эту ячейку.После запуска кода ниже он генерирует

Ошибка выполнения '1004' (ошибка, определяемая приложением или объектом).

Я уже играл с цельюформула, и если я беру простые формулы, такие как =B1+B2, это работает, и я не получаю сообщение об ошибке.Так что, похоже, что-то в формуле Vlookup вызывает ошибку.

Private Sub Worksheet_Change(ByVal Target As Range)
    If (Target.Cells.Address = "$A$2" And Target = vbNullString) Then
        Target.Formula = "=VLOOKUP($I$2;'Raw Data'!$A$1:$AH$5000;4;FALSE)"
    End If
End Sub

Я ожидаю, что ячейка "$A$2" покажет результат формулы =VLOOKUP($I$2;'Raw Data'!$A$1:$AH$5000;4;FALSE), если только ячейка не будет перезаписана вручную.

Спасибо за вашу помощь @ Pᴇʜ @eirikduade @Gareth!

Теперь я пытаюсь сделать то же самое для всех ячеек в столбце A, где есть значение в столбце I той же строки, и я борюсьс функцией .Range.Не могли бы вы дать мне какие-либо предложения, как исправить следующий код:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim lastRowF As Integer
    lastRowF = Sheet3.Cells(Sheet3.Rows.Count, "I").End(xlUp).Row
    For j = 1 To lastRowF
        If Intersect(Target, Me.Range(Cells(j, 2))) Is Nothing Then Exit Sub
        If Me.Range(.Cells(j, 2)) = vbNullString Then
            Me.Range(.Cells(j, 2)).Formula = "=VLOOKUP(""" & cells.(y, 1) & """,'Raw Data'!$A$1:$AH$5000,4,FALSE)"
            Exit For
        End If
    Next j
End Sub

Ответы [ 3 ]

2 голосов
/ 22 мая 2019

Основная проблема

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

Ваш код не будет работать, если Target - это диапазон нескольких ячеек

Обратите внимание, что ваш код не будет работать, если вы, например.скопируйте и вставьте диапазон (не одну ячейку).

Измените его следующим образом:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Me.Range("A2")) Is Nothing Then Exit Sub

    Application.EnableEvents = False
    On Error Goto ENABLE_EVENTS

    If Me.Range("A2").Value = vbNullString Then
        Me.Range("A2").Formula = "=VLOOKUP($I$2,'Raw Data'!$A$1:$AH$5000,4,FALSE)"
    End If

ENABLE_EVENTS:
    Application.EnableEvents = True
    If Err.Number <> 0 Then Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
End Sub

Если вам нужно сделать это для нескольких ячеек в столбце A, он будет выглядетьнапример:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim AffectedRange As Range
    Set AffectedRange = Intersect(Target, Me.Range("A2:A" & Me.Rows.Count))

    Application.EnableEvents = False
    On Error Goto ENABLE_EVENTS

    If Not AffectedRange Is Nothing Then
        Dim iCell As Range
        For Each iCell In AffectedRange.Cells
            If iCell.Value = vbNullString Then
                iCell.Formula = "=VLOOKUP($I" & iCell.Row & ",'Raw Data'!$A$1:$AH$5000,4,FALSE)"
            End If
        Next iCell
    End If

ENABLE_EVENTS:
    Application.EnableEvents = True
    If Err.Number <> 0 Then Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
End Sub

Обратите внимание, что вы, вероятно, хотите использовать

"=VLOOKUP($I" & iCell.Row & ", 'Raw Data'!$A$1:$AH$5000,4,FALSE)"

вместо

"=VLOOKUP($I$2, 'Raw Data'!$A$1:$AH$5000,4,FALSE)"
0 голосов
/ 22 мая 2019

Вы не можете использовать

Target = vbNullString

, потому что Target - это Range, и когда код запускается, он изменяет ячейку, которая повторно вызывает Sub.Теперь у Range есть формула, которая не может быть явно выражена в Text и, следовательно, выдает ошибку.Чтобы избежать этого, используйте

Target.Cells(1, 1).Text = vbNullString

, который является явным и предотвратит ошибку.

Но, как указал eirikdaude, вам также необходимо изменить точки с запятой на запятые.

Сказав все это, вам на самом деле не нужно явно проверять, какая ячейка изменилась, поэтому вы можете сделать это еще проще.

Private Sub Worksheet_Change(ByVal Target As Range)
    If Me.Range("A2").Text = vbNullString Then
        Me.Range("A2").Formula = "=VLOOKUP($I$2,'Raw Data'!$A$1:$AH$5000,4,FALSE)"
    End If
End Sub
0 голосов
/ 22 мая 2019

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

т.е. изменить строку

Target.Formula = "=VLOOKUP($I$2;'Raw Data'!$A$1:$AH$5000;4;FALSE)"

до

Target.Formula = "=VLOOKUP($I$2,'Raw Data'!$A$1:$AH$5000,4,FALSE)"

и посмотрите, работает ли это

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