Как исправить «Ошибку времени выполнения« 1004 »», вызванную функцией Target.Formula

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

Run-tim error '1004' (Application-defined or object defined error).

Я уже играл с целевой формулой, и если я возьму простые формулы, такие как =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 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
234
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В коде 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)"

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

Ответ принят как подходящий

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

Вам нужно переключить ; на ,, потому что .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)"

@Oliver495 Если это ответило на ваш вопрос, проголосуйте за него или отметьте его как решенный: Принятие ответов: как это работает?

Pᴇʜ 22.05.2019 13:25

Пока работает, но мне нужно добавить еще одну строку, которая проверяет, есть ли значение в столбце I. Потому что, если в столбце I нет значения, код создает ошибку. Можете ли вы помочь с этим?

Oliver495 22.05.2019 14:33

Вы можете использовать Me.Cells(iCell.Row, "I").Value для доступа к значению в той же строке в столбце I. Используйте это, чтобы построить свой чек If iCell.Value = vbNullString And Me.Cells(iCell.Row, "I").Value <> vbNullString Then. Также обратите внимание, что я добавил Application.EnableEvents = False включение обработки ошибок, которая необходима, чтобы запись в ячейку не запускала другое событие изменения (я забыл об этом).

Pᴇʜ 22.05.2019 14:47

Другие вопросы по теме