Excel VBA Использование INDIRECT в проверке данных - PullRequest
0 голосов
/ 13 декабря 2018

У меня проблема с применением функции Excel INDIRECT при проверке данных при применении VBA.Я использую VBA для заполнения критериев проверки данных и использую INDIRECT для поиска подходящего именованного диапазона рабочей книги из другого именованного диапазона через HLOOKUP.Я думаю, что моя проблема связана только с синтаксисом кода VBA, но я не могу понять, как правильно расположить двойные кавычки, чтобы заставить его работать.При запуске это возвращает уведомление об ошибке 400.

В настоящее время у меня есть следующее (функциональные разделы кода опущены для ясности).Столбец F, на который ссылается HLOOKUP, содержит выбираемое пользователем значение, а DepartmentRef представляет собой именованный диапазон:

Sub AddNewRoom()
Dim targetRow As Integer
targetRow = Range("EndRoomData").Row
With Worksheets("RoomData")
    With .Range("G" & targetRow).Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:="=indirect(hlookup(F" & targetRow & ",DepartmentRef,2,false))"
    End With
End With
End Sub

Когда я изменяю формулу проверки для удаления переменной кода, как показано ниже, код функционирует правильно, то есть:

With .Range("G" & targetRow).Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=indirect(hlookup(F7,DepartmentRef,2,false))"
End With

Любая помощь оценена, эта начинает меня угнетать ...

Спасибо в ожидании

RJ

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Результат формулы проверки должен возвращать результат во время выполнения кода.Если ячейка, на которую ссылается HLOOKUP, пуста, то Excel видит ошибку источника и код завершается.Если эта ошибка возникает при вводе ссылки вручную, Excel позволяет продолжить независимо, но вы не можете (насколько я могу судить) сделать это в VBA.Чтобы обойти это, введите (допустимое) значение в ячейку, на которую указывает ссылка, перед вводом данных проверки, а затем удалите ссылочное значение.Например:

With Worksheets("RoomData")    
    .Range("F" & targetRow).Value = ThisWorkbook.Names("DepartmentName").RefersToRange(1, 1)
    strFormula = "=INDIRECT(HLOOKUP(" &    
        Worksheets("RoomData").Cells(targetRow,6).Address(True, True) & ",DepartmentRef,2,FALSE))"
    With .Range("G" & targetRow).Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=strFormula
    End With
    .Range("F" & targetRow).ClearContents
End With
0 голосов
/ 13 декабря 2018

Не используйте прямую ссылку на имя ячейки, но попробуйте:

Formula1:="=INDIRECT(HLOOKUP(" & Worksheets("RoomData").Cells(targetRow, 6).Address(False, False) & ",DepartmentRef,2,FALSE))"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...