Excel VBA:根据用户窗体上多选列表框中的选择更改表值

问题描述 投票:0回答:1

我有一个工作簿,我正在尝试使用用户窗体来控制工作表的可见性。

Table (tblDefaultValues) 包含每个工作表的数据。此表包含的列包含默认工作表可见性(填充打开的工作表上的列表框)和会话可见性(当前工作表可见性):

我使用多选列表框(ListBoxWorksheets)来允许用户控制工作表的可见性。 ListBoxWorksheets(第 1 列和第 4 列的 columnwidth 属性设置为零以隐藏这些列)是从 Userform_Initialize 事件上的 tblDefaultValues 填充的,如下所示:

    ListBoxWorksheets.ColumnCount = 5
    ListBoxWorksheets.RowSource = "tblDefaultValues"

ListBoxWorksheets 上有一个按钮,单击该按钮后,我想更新 tblDefaultValues 中所选行的 SessionVisibility 字段中的值。

因此,例如,要仅显示类别 2 中的那些工作表,用户选择这些行,然后单击用户窗体上的按钮。 目标是将“Visible”写入 tblDefaultValues 的 SessionVisibility 列中的相关行。

我正在使用的按钮的 _Click 代码是:

Private Sub btnShowOnlySelectedWorksheets_Click()

Dim ws As Worksheet
    Dim tbl As ListObject
    Dim i As Long

    'Check if all listbox items are unchecked
    If SelectedRecordCount = 0 Then

        MsgBox "Please make a selection(s) in 'Select Worksheet(s)'!", vbOKOnly, "Not allowed!"
        
        Exit Sub
                      
    End If
  
    'Assign worksheet and table to ws and tbl objects
    Set ws = ThisWorkbook.Worksheets("SheetNameLookup")
    Set tbl = ws.ListObjects("tblDefaultValues")

    'loop through listboxWorksheets rows
    For i = 0 To ListBoxWorksheets.ListCount - 1
    
        'if row is selected
        If ListBoxWorksheets.Selected(i) Then
            
            tbl.DataBodyRange.Cells(i + 1, 5).Value = "Visible" 'table row = i+1, column is 5
            
            Debug.Print "Selected; row " & i + 1
  
        Else 'row is not selected
                
            tbl.DataBodyRange.Cells(i + 1, 5).Value = "Hidden"
         
            Debug.Print "Not selected; row " & i + 1

        End If
        
    Next i

End Sub

发生的情况是,只有第一个选定工作表的 SessionVisibility 值会在 tblDefaultValues 中更新,但前提是第一个选定行也是列表框中的第一行(其余选定行似乎不会被识别为选定行)在列表框中,隐藏被转移到 SessionVisibility 列中)。如果仅选择列表框中的一行(并且不是第一行),则表中的相关行将被标记为隐藏。如果列表框中第一个选定的行不是第一行(并且选择了多行),则 tblDefaultValues 中的所有内容都将标记为隐藏。

如果我注释掉

tbl.DataBodyRange.Cells(i + 1, 5).Value
代码行,则 Debug.Print 会写入预期的输出,表明所选行仍被识别为在
For i = 0 To ListBoxWorksheets.ListCount - 1 loop
中选择。

你知道这里出了什么问题吗?

最后一个请求:有人可以向我指出一个资源来学习如何单步执行

For i = 0 To ListBoxWorksheets.ListCount - 1
循环中的代码吗?如果我在 button_Click 子项的末尾设置一个断点,并单步执行代码,则列表框将打开。但是在我选择行并单击按钮后,代码停在子末尾,不允许我单步执行它。

预先感谢您的帮助!

编辑:

如果我将

Debug.Print ListBoxWorksheets.Selected(i) & "; " & i & ";  " & tbl.DataBodyRange.Cells(i + 1, 5).Value
放在
For i = 0 To ListBoxWorksheets.ListCount - 1
循环的 If...Else 和 Else...End If 行之间,会发生什么:

如果我注释掉 both

tbl.DataBodyRange.Cells(i + 1, 5).Value = "Visible"
and
tbl.DataBodyRange.Cells(i + 1, 5).Value = "Hidden"
并在列表框中选择多行,则 debug.print 每次都会给出我期望的输出(例如,如果第一行为“False; 0; 未更改”)如果选择了第二行,则未选择列表框,并且“True; 1; 不变”...)。注意:在运行代码之前,我将 tblDefaultValues 的 SessionVisibility 列中的每个值设置为“未更改”。

如果我注释掉 only

tbl.DataBodyRange.Cells(i + 1, 5).Value = "Visible"
,则 debug.print 会为所有行提供“False;递增 i ;隐藏”,无论选择状态如何。

如果我注释掉 only

tbl.DataBodyRange.Cells(i + 1, 5).Value = "Hidden"
,debug.print 会给我“False; i 仅第一个选定行的值;可见”。其余行是“False;递增 i;不变”。

我还能尝试什么来解决这个问题?我有点受阻,因为我不知道如何单步执行代码,而不是在单击命令按钮后运行到 -click 过程末尾的断点。

如果有人认为有帮助并愿意查看,很高兴上传该文件的清理版本。

再次感谢!

excel vba listbox userform
1个回答
0
投票

原因:当您覆盖 ListObject 的单元格时,ListBox 中的所有选择都会被删除。

解决方案:

更换

  ListBoxWorksheets.RowSource = "tblDefaultValues"

  ListBoxWorksheets.List = tblDefaultValues.DataBodyRange.value
© www.soinside.com 2019 - 2024. All rights reserved.