如何确定包含各种形状的工作表上的形状的types?

我想通过工作表上的形状来确定它们是否是DropDown,然后如果特定的下拉列表位于特定的行上。 该工作表包含许多checkbox和下拉列表。 我正在用循环创build下拉列表,如下所示:

wsBank.DropDowns.Add(Range(AnsPositionAddress).Left, Range(AnsPositionAddress).Top, Range(AnsPositionAddress).Width, Range(AnsPositionAddress).Height).Select With Selection '.ListFillRange = AnsPositionRng.Offset(0, 1) '.LinkedCell = AnsPositionRng.Offset(0, 1) .DropDownLines = 4 .Display3DShading = False .Name = "QuestionDrop" & QuizQuestionNumber .OnAction = "recordAnswer" End With Number = 1 For Each Q In AnsRng wsBank.DropDowns("QuestionDrop" & QuizQuestionNumber).AddItem Number & " - " & Q Number = Number + 1 Next Q 

我正在创buildcheckbox,如下所示:

 ActiveSheet.CheckBoxes.Add(Range(chkbxAddress).Left, Range(chkbxAddress).Top, Range(chkbxAddress).Width, Range(chkbxAddress).Height).Select With Selection .Caption = "" .Value = xlOff .LinkedCell = AnsPositionRng.Offset(0, -4).Address .Display3DShading = True End With 

如果一个范围内的特定单元格包含“True”,那么我希望find保存在同一行上的下拉列表,因此我将循环查看形状,确定形状是否为下拉列表,然后检查其BottomRight Cell属性查看它是否与包含“True”的行匹配。 这可能吗? 我到目前为止:

  wsBank.Activate With wsBank IndicatorLstRow = .Range("C" & .Rows.Count).End(xlUp).Row Set IndicatorRng = wsBank.Range("B4:B" & IndicatorLstRow) End With For Each c In IndicatorRng If c = "True" Then QuestionRow = c.Row For Each ComboShape In wsBank.Shapes test = ComboShape.Type Next ComboShape End If Next c 

你在正确的轨道上。 首先find包含“真”的单元格。 这将给你的单元格地址,从那里你会得到单元格的行。 接下来只需循环遍历形状并find他们的.TopLeftCell并从中得到该行,看看它是否匹配。

这里是一个例子( UNTESTED

 Dim shp As Shape For Each c In IndicatorRng If c = "True" Then QuestionRow = c.Row For Each shp In wsBank.Shapes If shp.Type = 8 And shp.Name Like "Drop*" Then If shp.TopLeftCell.Row = QuestionRow Then ' '~~> Rest of the code ' End If End If Next shp End If Next c 

如果你运行:

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

您会发现数据validation的下拉菜单是types8 ,名称类似于下拉菜单1
实验将产生您工作表上所有形状的types。