【发布时间】:2019-09-11 10:53:36
【问题描述】:
我正在尝试在 Excel 工作表中放置一个下拉菜单,其中包含另一个工作表中的选项,以及另一个工作簿中的选项。我使用 VBA 是因为 我想根据另一个下拉菜单自定义这些选项。我设法通过命名源工作表中的范围来做到这一点,但该文件是只读的,因此我无法保存名称以自动执行该过程。所以我尝试只使用引用中的列名(如 $B:$B,我只需要 B 列),但是当我运行宏时,它会因运行时错误 1004 而停止。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("H6")
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
Call main
End If
End Sub
Private Sub main()
reason = Range("H6").Value
List = ""
If reason = "Project ID/Task ID" Then
List = "=PIDTID"
Else
List = "=Cost_Center"
End If
With Range("I6").Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, Formula1:=List
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
End Sub
这是我的宏,如您所见,main() 在 H6 更改时被调用,因为那是我的另一个下拉菜单所在的位置。然后,根据该单元格中的值,为 List 分配一个值,该值等于定义的名称,该名称引用另一个工作表中的范围。
例如,如果 PIDTID 名称等于 ='[20190812_WP_and_CostCenters_Responsible.xls]Projects responsibles'!WBSName,则脚本有效。请注意,WBSName 是源工作表中 B 列的名称。
如果我将 PIDTID 设置为='[20190812_WP_and_CostCenters_Responsible.xls]Projects responsibles'!$B:$B,我将在线收到错误
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, Formula1:=List
Cost_Center 名称的作用相同。
我想提一下,这些测试是在打开源文件的情况下完成的。如果我尝试关闭它,我会得到同样的错误。
有没有办法摆脱错误,或者我可以通过其他方式引用其他工作簿工作表中的单元格而不命名它们?我也想工作而不必打开源文件。谢谢!
【问题讨论】:
-
根据this 文档,错误本身是非常合乎逻辑的。
标签: excel vba worksheet-function worksheet