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

Я разрабатываю инструмент для отслеживания оценок учеников и использую пользовательскую форму для управления данными учеников.

Я написал код, основанный на ответах на предыдущие вопросы, для удаления той же строки на 14 листах в рабочей книге, которыесодержат различные данные ученика, но я получаю сообщение об ошибке «Требуется объект» в строке WshtNameCrnt.Rows(l).Delete в приведенном ниже коде:

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 голосов
/ 13 октября 2018

@ BigBen обнаружил проблему и возможное решение

другое решение - перебрать коллекцию Worksheets, чьи имена вы собрали в WshtNames массив

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

в обоих решениях(и ваш код) страдают из-за того, что имя листа не соответствует ни одному из текущих листов рабочей книги

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

WshtNameCrnt - это имя Worksheet, а не фактический Worksheet объект.

Поэтому вместо

WshtNameCrnt.Rows(l).Delete

используйте коллекцию Worksheets, которая работает либо с индексом Worksheet, либо с именем , чтобывернуть Worksheet рассматриваемый объект.

ThisWorkbook.Worksheets(WshtNameCrnt).Rows(1).Delete
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...