如何基于下拉框动态更改一件形状数据

时间:2018-09-12 12:14:56

标签: vba visio visio-vba

我有一个用户表单,当电缆形状放到工作表上时会运行:该表单询问用户电缆分类是主要还是次要,以及托盘类型是主要还是次要。例如,如果选择了主电缆和托架,则电缆类型+托盘形状数据将更改为仅包含主电缆和托架的下拉列表。

Public shp3 As Shape
Private Sub CommandButton1_Click()
   Dim CableClass As String
   Dim TrayClass As String
   Dim pg2 As Page

   CableClass = ComboBox1.Value
   TrayClass = ComboBox2.Value
   Set shp3 = ActivePage.Shapes.ItemFromID(cID)

   If CableClass = "Primary" Then
        shp3.Cells("Prop.Row_CableClass.Value").FormulaU = """Primary"""
        shp3.Cells("Prop.Row_CableType.Format").FormulaU = """Cable 1;Cable 
        2;Cable 3;Cable 4"""
   ElseIf CableClass = "Secondary" Then
       shp3.Cells("Prop.Row_CableClass.Value").FormulaU = """Secondary"""
       shp3.Cells("Prop.Row_CableType.Format").FormulaU = """Cable 1;Cable 
       2;Cable 3;Cable 4"""
   End If

   If TrayClass = "Primary" Then
       shp3.Cells("Prop.Row_TrayClass.Value").FormulaU = """Primary"""
       shp3.Cells("Prop.Row_TrayType.Format").FormulaU = """cable tray 
       1;cable tray 2;cable tray 3;cable tray 4"""
   ElseIf TrayClass = "Secondary" Then
       shp3.Cells("Prop.Row_TrayClass.Value").FormulaU = """Secondary"""
       shp3.Cells("Prop.Row_TrayType.Format").FormulaU = """cable tray 
       1;cable tray 2;cable tray 3;cable tray 4"""
   End If
   Unload Me
End Sub

一旦从形状数据中选择了特定类型的电缆或托架,我希望成本根据选择的内容自动更改。换句话说,我希望根据从下拉框中选择的电缆类型来动态更改形状数据(成本)。

2 个答案:

答案 0 :(得分:1)

答案不是一个完整的答案,但是太长/太复杂了,无法发表评论:

在用户表单代码后面:

Private Sub CableClass_Change() 
  SetCableClassValues CableClass, shape
End Sub

Private Sub TrayClass_Change() 
  SetTrayClassValues TrayClass, shape
End Sub

在单独的标准模块中:

Public Sub SetCableClassValues (ByVal cableClass as ComboBox, ByVal theShape as Visio.Shape)
  theShape.Cells("Prop.Row_CableClass.Value").FormulaU = """Primary"""
  theShape.... 'set the appropriate cost value here
End Sub

Public Sub SetTrayClassValues (ByVal trayClass as ComboBox, ByVal theShape as Visio.Shape)
  theShape.Cells("Prop.Row_CableClass.Value").FormulaU = """Primary"""
  theShape.... 'set the appropriate cost value here
End Sub

请注意,所有代码都是“空中编码”,因此无法完全按照书面规定工作。但是,一旦进入SetCableClassValues例程,就可以访问cableClass组合框中的所有内容,就像直接在后面的代码中一样。您还可以访问theShape-在现有代码中以shp3作为shape参数的任何一种访问。

如果您需要这两个信息来确定成本,那么您将拥有一个将组合框和形状作为参数的例程,请确保都选择了有效值,然后进行所有更新。

我对Visio对象模型一点都不熟悉,因此您必须弄清楚如何设置成本,但是您似乎已经足够了解如何处理该部分。

答案 1 :(得分:0)

您也可以在ShapeSheet中做一些强大的事情,而不必诉诸VBA。您可以对形状下降强制输入问题(数据输入),然后使用属性(Prop.xUser.x)设置下拉列表。

看看您提供的代码,您将执行与ShapeSheet中相同的操作,只是使用不同的语法/语言/界面。逻辑类似,您设置了一个User属性(或两个,因为您正在查看电缆和托架),该属性根据选择的是“主要”还是“次要”而返回true或false。然后,您可以使用该Boolean结果返回相应的选择字符串。

我没有在此计算机上使用Visio来提供具体示例-我已使用此技术来更改形状的颜色,甚至更改几何形状。