当通过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
答案 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