Как динамически изменить один фрагмент данных формы на основе раскрывающегося списка - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть пользовательская форма, которая запускается при падении формы кабеля на лист: форма спрашивает пользователя, является ли классификация кабелей первичной или вторичной, и является ли тип лотка первичным или вторичным. Если, например, выбран основной кабель и лоток, то тип кабеля + данные о форме лотка изменится на выпадающие списки, содержащие только основные кабели и лотки.

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 голосов
/ 15 сентября 2018

Вы также можете делать некоторые мощные вещи в ShapeSheet, не прибегая к VBA. Вы можете принудительно задать вопрос (ввод данных) при отбрасывании фигуры, а затем использовать свойства (Prop.x, User.x) для настройки раскрывающихся списков.

Глядя на предоставленный код, вы выполняете те же действия, что и в ShapeSheet, просто используя другой синтаксис / язык / интерфейс. Логика аналогична, вы устанавливаете свойство User (или, скорее, два, потому что вы смотрите на кабели и лотки), которое возвращает true или false в зависимости от того, выбран ли у вас «Основной» или «Вторичный». Затем вы используете этот результат Boolean, чтобы вернуть соответствующую строку выбора.

У меня нет Visio на этой машине, чтобы привести конкретный пример - я использовал эту технику, чтобы менять цвета форм и даже менять геометрию.

0 голосов
/ 12 сентября 2018

Не полный ответ, но слишком длинный / сложный для простого комментария:

В вашей форме пользователя код позади:

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.

Если вам нужны оба бита информации для определения стоимости, тогда у вас будет 1 подпрограмма, которая будет принимать и комбобоксен, и фигуру в качестве параметров, убедитесь, что для обоих выбраны действительные значения, затем выполните все обновления.

Я совсем не знаком с объектной моделью Visio, поэтому вам придется выяснить, как установить стоимость, но, похоже, у вас достаточно понимания, чтобы справиться с этой частью.

...