首页 > 解决方案 > 自动复选框项目生成

问题描述

截图1

大家好,

我已经被困了一段时间......我希望有人能在这方面启发我。所以,我在这里创建了 4 个列表框(ActiveX),我希望在每个列表框中创建复选框,这样每次我可以通过选择它来隐藏/取消隐藏同一工作簿中的 Excel 工作表。但是,仅工作簿中的选项卡就太多了。此外,这些选项卡有点像Warehouse 1, Warehouse 2, Security 1, Security 2, 等等。所以在这些数字之前有一个通用名称。

我想知道是否有办法根据选项卡名称自动生成复选框?

例如,如果我1仓库列表框下选择,它应该链接到Warehouse 1工作簿中的选项卡。

任何帮助都会很棒。谢谢!

标签: excelvba

解决方案


为了实现您的目标,您首先需要对工作listbox表上的属性进行一些更改。

进入设计模式右键单击listbox> 属性。

更改以下属性:

  • 'ListStyle'1 - fmListStyleOption
  • 'MultiSelect'1 - fmMultiSelectMulti

ListStyle 更改会将选项按钮放在每个列表条目的左侧,而 MultiSelect 调整会将选项按钮更改为复选框。

这是一些使用工作表名称填充的示例代码ListBox- 我假设您的工作表包含ListBox已命名 "Main" 并且我已命名"Generate CheckBox"按钮cmdGenerateCheckBox

Private Sub cmdGenerateCheckBox_Click()

Dim WorksheetArray() As Variant
Dim WorksheetIndex As Long
Dim ArrayElement As Variant
Dim NumberOfSheets As Long
Dim MainSheet As Object

Set MainSheet = ThisWorkbook.Sheets("Main")

NumberOfSheets = ThisWorkbook.Sheets.Count
ReDim WorksheetArray(1 To NumberOfSheets)

For WorksheetIndex = 1 To UBound(WorksheetArray)
    WorksheetArray(WorksheetIndex) = ThisWorkbook.Sheets(WorksheetIndex).Name
Next WorksheetIndex

MainSheet.lstWarehouse.Clear
MainSheet.lstSecurity.Clear

For Each ArrayElement In WorksheetArray()
    If ArrayElement Like "Warehouse*" Then
        MainSheet.lstWarehouse.AddItem ArrayElement
    ElseIf ArrayElement Like "Security*" Then
        MainSheet.lstSecurity.AddItem ArrayElement
    End If
Next ArrayElement

Dim ListItemCounter As Long
Dim ListItem As Variant

'----------------lstWarehouse ListBox-----------------
ListItemCounter = 0
For Each ListItem In MainSheet.lstWarehouse.List
    For Each ArrayElement In WorksheetArray()
        If ListItem = ArrayElement Then
            If ThisWorkbook.Sheets(ArrayElement).Visible = True Then
                MainSheet.lstWarehouse.Selected(ListItemCounter) = True
            ElseIf ThisWorkbook.Sheets(ArrayElement).Visible = False Then
                MainSheet.lstWarehouse.Selected(ListItemCounter) = False
            End If
        Else
            'Do nothing
        End If
    Next ArrayElement
    ListItemCounter = ListItemCounter + 1
Next ListItem

'----------------lstSecurity ListBox-----------------
ListItemCounter = 0
For Each ListItem In MainSheet.lstSecurity.List
    For Each ArrayElement In WorksheetArray()
        If ListItem = ArrayElement Then
            If ThisWorkbook.Sheets(ArrayElement).Visible = True Then
                MainSheet.lstSecurity.Selected(ListItemCounter) = True
            ElseIf ThisWorkbook.Sheets(ArrayElement).Visible = False Then
                MainSheet.lstSecurity.Selected(ListItemCounter) = False
            End If
        Else
            'Do nothing
        End If
    Next ArrayElement
    ListItemCounter = ListItemCounter + 1
Next ListItem

End Sub

推荐阅读