【问题标题】:List Box Dependent on two Combo Boxes VBA列表框依赖于两个组合框 VBA
【发布时间】:2018-05-29 00:05:34
【问题描述】:

我正在尝试根据我对前两个组合框的选择创建三个列表框列。

这是我当前表单的截图:

我尝试过做案例,但这仅适用于两个组合框本身,不会说

有什么办法吗?

目前我有这个:

Private Sub UserForm_Initialize()

With StateComboBox


    .AddItem "CO - Colorado"

End With
End Sub
____________________________________________________
Private Sub StateComboBox_Change()

Dim index As Long
index = StateComboBox.ListIndex

RoleComboBox.Clear

Select Case StateComboBox.Value
    Case Is = "CO - Colorado"
     With RoleComboBox
        .AddItem "District"
        .AddItem "School"
        .AddItem "Test Administrator"
    End With


End Select
End Sub
____________________________________________
Private Sub PermissionSetList_change()

If StateComboBox.Value = "CO - Colorado" And RoleComboBox.Value = "District" Then
Call ColoradoDPermissionSet
Call ColoradoDRemovePermissions
Call ColoradoDAddPermissions
End If

End Sub
____________________________________________
Sub ColoradoDPermissionSet()

With PermissionSetList

.AddItem "Administrator"
.AddItem "Correction Primary Window"
.AddItem "Documents - View"

End With
End Sub
________________________________________________________
Sub ColoradoDRemovePermissions()

With RemoveList

.AddItem "Corrections - Primary"
.AddItem "Student Transfer Form"

End With
End Sub
_________________________________________________
Sub ColoradoDAddPermissions()

With AddList

.AddItem "Test Tickets - End Incomplete Test"
.AddItem "Test Tickets - Invalidate"
.AddItem "Test Tickets - Regenerate"

End With
End Sub

我已在代码中放置了 IF 语句,当我选择 CO - Colorado 和 District 时,列表框将不会填充。我想让它在我选择状态和角色时在列表框中填充特定值,当我更改状态和/或角色时,它会给出一组不同的“权限”,这就是我放置的原因在 sub 中列出并调用它们。

【问题讨论】:

  • 请进一步澄清您的问题。见stackoverflow.com/help/mcve ...你到底想在第三个列表框中做什么?
  • 去掉Call关键字,没用。然后删除逗号,它们是不合法的。并添加 End If 以关闭您的 If 块。
  • 你有错误吗?请添加它们...“这不起作用”不是很有帮助...也许您需要在 IF 语句中访问列表框的 TEXT(或 SelectedItem)属性
  • 您将 IF 语句放在哪里?即它什么时候被调用,你希望它什么时候被调用?
  • 在代码中添加了 If 语句,当我选择 Colorado 和 District 时,它仍然将 List Boxes 留空

标签: vba combobox listbox dependencies


【解决方案1】:

我已经想通了,我没有单独使用 If 语句,而是执行了以下操作,它填充了我想要的方式:

Private Sub RoleComboBox_Change()

Dim index As Long
index = RoleComboBox.ListIndex

PermissionSetList.Clear
RemoveList.Clear
AddList.Clear

If StateComboBox.Value = "CO - Colorado" Then
  Select Case RoleComboBox.Value
    Case Is = "District"
      With PermissionSetList
        Call ColoradoDPermissionSet
        Call ColoradoDRemovePermissions
        Call ColoradoDAddPermissions
      End With
 End Select
End If
End Sub

这是可扩展的,因此添加更多 If 可以允许更多选择:

https://i.imgur.com/lkGDrLs.png

Private Sub RoleComboBox_Change()

Dim index As Long
index = RoleComboBox.ListIndex

PermissionSetList.Clear
RemoveList.Clear
AddList.Clear

If StateComboBox.Value = "AL - Alabama" Then
With PermissionSetList
 Select Case RoleComboBox.Value

 Case Is = "District"
     Call WIDADPermissionSet
     Call AlabamaDRemovePermissions
     Call AlabamaDAddPermissions

  Case Is = "School"
     Call AlabamaSPermissionSet
     Call AlabamaSRemovePermissions
      Call AlabamaSAddPermissions

 Case Is = "Test Administrator"
     Call WIDATPermissionSet
     Call WIDATRemovePermissions
     Call WIDATAddPermissions
   End Select
 End With
End If

If StateComboBox.Value = "CO - Colorado" Then
  With PermissionSetList
    Select Case RoleComboBox.Value

   Case Is = "District"
       Call WIDADPermissionSet
       Call ColoradoDRemovePermissions
       Call ColoradoDAddPermissions

   Case Is = "School"
       Call ColoradoSPermissionSet
       Call ColoradoSRemovePermissions
       Call ColoradoSAddPermissions

   Case Is = "Test Administrator"
       Call WIDATPermissionSet
       Call WIDATRemovePermissions
       Call WIDATAddPermissions
    End Select
  End With
End If


End Sub

【讨论】:

  • 如果它满足您的需求。当您拥有多个状态和角色时,它的可扩展性如何?
  • 已更新以包含更多内容,以及现在带有表单的图像。有了这个,我可以使用顶部组合框来添加更多种类并将其扩展到不同的项目。
  • 以上是我担心的。当您一遍又一遍地重复使用代码部分时,它无法按照我的想法进行扩展。它会减慢您的应用程序并使调试代码成为一场噩梦。
  • 阅读一些面向对象设计的 SOLID 原则,尤其是 SRP 的理念——单一职责原则。此外,对于上面的示例,您只需要第一个 IF StateComboBox.Value = "AL - Alabama" 然后里面有各种 Case 语句。
  • 随着删除 IF 的变化,它仍然有效。在这种情况下,将有大约 39 个州,每个州有 3 个角色,所以这不是一吨。我制作了一个呼叫跟踪器表单,除了使用调用来下拉数百个值的列表并且应用程序没有减速之外,我使用了相同的概念,即根据另一个填充组合框。有没有办法进一步浓缩?
猜你喜欢
  • 1970-01-01
  • 2017-02-19
  • 2014-08-17
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多