Excel VBA在数据验证中使用INDIRECT

时间:2018-12-13 11:12:25

标签: excel vba excel-vba validation syntax

当通过VBA应用Excel INDIRECT函数在数据验证中时遇到问题。我正在使用VBA填充数据验证条件,并使用INDIRECT通过HLOOKUP从另一个命名范围中查找适当的工作簿命名范围。我认为我的问题仅与VBA代码的语法有关,但我无法弄清楚使双引号正确工作的正确方式。运行时,这将返回错误400通知。

我目前有以下内容(为清楚起见,省略了功能代码部分)。 HLOOKUP引用的F列包含一个用户可选的值,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 :(得分:0)

不要使用直接的“名称”单元格引用,请尝试:

Formula1:="=INDIRECT(HLOOKUP(" & Worksheets("RoomData").Cells(targetRow, 6).Address(False, False) & ",DepartmentRef,2,FALSE))"

答案 1 :(得分:0)

验证公式的结果必须在代码运行时返回结果。如果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