Удаление строк на нескольких листах - PullRequest
0 голосов
/ 11 сентября 2018

Исходя из предыдущего вопроса, который я задал сегодня - я изменил код, написанный Роем Коксом (спасибо, что сэкономили мне так много времени!), Чтобы создать пользовательскую форму для добавления, изменения и удаления сведений о пользователях в инструменте анализа I создаю.

Отлично работает при работе с пользовательскими данными на одном листе.

Выбор пользователя и нажатие «удалить» удаляет его пользовательские данные на рабочем листе. Я изменил код, чтобы при добавлении или удалении пользователя он проверял каждый лист и соответственно добавлял или удалял строки.

Это код для удаления данных ученика на одном листе:

Private Sub cmbDelete_Click()

Dim msgResponse As String    'confirm delete

Application.ScreenUpdating = False

'get user confirmation
msgResponse = MsgBox("This will delete the selected record. Continue?", _
    vbCritical + vbYesNo, "Delete Entry")
Select Case msgResponse    'action dependent on response

Case vbYes
'c has been selected by Find button on UserForm
Set c = ActiveCell
    c.EntireRow.Delete    'remove entry by deleting row

'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
End With

Case vbNo
Exit Sub    'cancelled
End Select

Application.ScreenUpdating = True

End Sub

Я попытался изменить его, чтобы удалить пользовательские данные на каждом листе, следующим образом:

Private Sub cmbDelete_Click()

Dim Sh As Worksheet
Dim msgResponse As String    'confirm delete

Application.ScreenUpdating = False

'get user confirmation
msgResponse = MsgBox("This will delete the selected record. Continue?", _
    vbCritical + vbYesNo, "Delete Entry")
Select Case msgResponse    'action dependent on response

Case vbYes
For Each Sh In ThisWorkbook.Sheets
With Sh.UsedRange
    'c has been selected by Find button
    Set c = ActiveCell
        c.EntireRow.Delete    'remove entry by deleting row
End With
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
End With

Case vbNo
Exit Sub    'cancelled
End Select

Application.ScreenUpdating = True

End Sub

но эта версия удаляет данные пользователя и данные в 4 строках под ними. Он вообще не удаляет данные из следующего листа.

Может кто-нибудь дать какой-нибудь совет, пожалуйста?

1 Ответ

0 голосов
/ 11 сентября 2018

изменение:

Case vbYes
    For Each Sh In ThisWorkbook.Sheets
    With Sh.UsedRange
        'c has been selected by Find button
        Set c = ActiveCell
            c.EntireRow.Delete    'remove entry by deleting row
    End With
    Next

до:

Case vbYes
    Dim l As Long
    l = ActiveCell.Row 'store currently active cell row
    For Each Sh In ThisWorkbook.Worksheets
        Sh.Rows(l).Delete
    Next

если вам когда-нибудь будет интересно узнать, почему ваш предыдущий код не работал:

1)

Set c = ActiveCell

установит c на текущую активную ячейку, т. Е. На ячейку, выбранную вашей кнопкой «Найти» на текущем активном листе

2) пока

c.EntireRow.Delete

всегда, что неудивительно, удаляло бы c всю строку , то есть ту же строку на листе, где был найден c, поскольку никто не устанавливает c снова и указывает на другую диапазон листов.

и простой просмотр коллекции листов не меняет Active sheet

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...