使用用户表单删除多个工作表上的特定行

时间:2018-10-12 14:41:25

标签: arrays excel vba userform

我正在开发一种跟踪学生评估的工具,并正在使用用户表格来管理学生数据。

我已经基于对先前问题的回答编写了代码,以删除工作簿中14个工作表上的同一行,该工作表上包含各种瞳孔数据,但在下面的代码的WshtNameCrnt.Rows(l).Delete行中遇到了“ Object required”错误:

Private Sub cmbDelete_Click()
    Dim WshtNames As Variant
    Dim WshtNameCrnt As Variant

    WshtNames = Array("Pupil Data", "RWM", "Art", "Computing", "Design Technology", "Geography", "History_", _
                        "MFL", "Music", "PE", "RE", "Science", "Bookbands", "KS1 - TRP")

    Dim msgResponse As String    'confirm delete
        Application.ScreenUpdating = False
            msgResponse = MsgBox("This will delete the selected record. Continue?", _
            vbCritical + vbYesNo, "Delete Entry")

    Select Case msgResponse    'action dependent on response

        Case vbYes
            Dim l As Long
            l = ActiveCell.Row 'store currently active cell row

                For Each WshtNameCrnt In WshtNames
                    WshtNameCrnt.Rows(l).Delete
                Next

        'restore form settings
        With Me
            .cmbAmend.Enabled = False    'prevent accidental use
            .cmbDelete.Enabled = False    'prevent accidental use
            .cmbAdd.Enabled = True    'restore use
            'clear form
            Call ClearControls
            Call ResortData
        End With

    Case vbNo
        Exit Sub    'cancelled
    End Select
    Application.ScreenUpdating = True
End Sub

我认为问题是我的工作表名称数组的尺寸是一个变体,但不确定将其设置为对象并在数组中的工作表之间循环的最佳方法。

如果我的假设是正确的,请有人告诉我,并建议/告诉我如何解决该问题?

2 个答案:

答案 0 :(得分:1)

@BigBen找到了问题和可能的解决方案

另一种解决方案是遍历Worksheets数组中收集的名称,这些集合的名称是WshtNames

            For Each WshtNameCrnt In Worksheets(WshtNames)
                WshtNameCrnt.Rows(l).Delete
            Next

两个解决方案(和您的代码)都无法管理工作表名称与当前工作簿工作表都不匹配的情况

答案 1 :(得分:0)

WshtNameCrntWorksheet的名称,而不是实际的Worksheet对象。

所以不是

WshtNameCrnt.Rows(l).Delete

使用Worksheets集合(与Worksheet索引或 name 一起使用)返回有问题的Worksheet对象。

ThisWorkbook.Worksheets(WshtNameCrnt).Rows(1).Delete