在文档中循环显示形状时,我只能看到“评论”types,即使它有很多下拉菜单

我有一个文件,有人做了,我的任务是简单地添加一个autoupdater函数,更新下拉菜单旁边的单元格。

下拉菜单的创build方式是通过数据validation和select列表并在单元格中创build列表。 这些值是从别处读取的。

现在,我试着循环遍历所有的形状:

Dim dd As DropDown Dim i As Integer Debug.Print Sheet1.DropDowns.Count Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets Dim s As Shape For Each s In ws.Shapes Debug.Print CStr(s.Type) Next Next End Sub 

这将打印以下内容: 4是注释,8是控制表单

 444444444444444444444444444 8 

所以,即使我有很多下拉菜单,当我循环它们时,没有任何东西出来。

我想这样做,任何人都可以添加一个下拉框,我的代码会附加一个OnAction Sub,它填充下拉框旁边的单元格,这样用户可以添加任意数量的框,但是他们只需要记住它旁边的单元格(例如右侧)将为空,因为它将被覆盖。

 Dim sh As Shape Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets For Each sh In ws.Shapes If sh.Type = msoFormControl Then If sh.FormControlType = xlListBox Then sh.OLEFormat.Object.OnAction = "UpdateLBCell" End If End If Next Next 

上面的原始代码会导致最内层的行发生对象错误。

我只是愚蠢的,还是不可能循环这些下拉框? 如果这是不可能的,我可以做一些适合单元格的其他下拉单选框? 我尝试过的Combobox,但他们躺在上面,不匹配。

任何在做替代方式的洞察力也非常赞赏。

我把一个列表validation在几个单元格,然后运行这个代码

 Sub Test() Dim dd As DropDown Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets Dim s As Shape For Each s In ws.Shapes Debug.Print CStr(s.Type), s.Top, s.Left s.Visible = msoCTrue '<<<< Next Next End Sub 

之前和之后(黄色细胞有数据validation):

在这里输入图像说明

所以看起来,如果您设置了“列表”数据validation,则Excelpipe理一个通常位于当前活动单元格中的单个(通常不可见和空的)下拉列表。 只有当这也是具有validation设置的单元之一时才显示。

编辑 :这里是一个如何以通用的方式处理下拉式DV列表更新单元格的例子 –

 Private Sub Worksheet_Change(ByVal Target As Range) Dim c As Range On Error GoTo haveError Application.EnableEvents = False For Each c In Target.Cells If HasDVList(c) Then c.Offset(0, 1) = Now End If Next c haveError: Application.EnableEvents = True End Sub 'does a cell have DV list? Function HasDVList(rng As Range) Dim v On Error Resume Next v = rng.Cells(1).Validation.Type On Error GoTo 0 HasDVList = (v = 3) End Function 

Shape应该是Visible ,不pipe该单元是否被“点击”。 我把一个单独的DV下拉列表放在一张纸上,然后运行:

 Sub ShapeLister() Dim s As Shape For Each s In ActiveSheet.Shapes MsgBox s.Type & vbCrLf & s.Name Next s End Sub 

并得到:

在这里输入图像说明

试试这个新的工作表,告诉我们你看到了什么。