【问题标题】:VBA Excel - Remove a row from a multiple sheet if it is equal toVBA Excel - 从多个工作表中删除一行,如果它等于
【发布时间】:2021-01-29 03:26:07
【问题描述】:

我目前正在删除行。我已经让它在一张纸上工作了,但我只想问有没有办法同时删除几张纸上的行?我有一个唯一的键,即 student ID,它位于所有将受到影响的工作表的 Column C 中。所以,点击删除按钮,所有带有student ID的数据都会被删除。

使用下面的代码,我可以从STUDENTS_INFO 表中删除一行。

Sub del_stud()

    Set ws = ActiveWorkbook.Worksheets("STUDENTS_INFO")
    LastRow = ws.Cells(Rows.Count, "C").End(xlUp).Row
    For r = 10 To LastRow
        If CStr(ThisWorkbook.Sheets("HOME").Range("K11").Value) = ws.Cells(r, 3) Then
            ws.Rows(r).EntireRow.Delete
            MsgBox "Student's data is now deleted!"
            Unload Me
        End If
    Next r
    
End Sub

将受到影响的工作表是STUDENTS_INFOG1-Q1G1-Q2G1-Q3G1-Q4G2-Q1G2-Q2G3-Q3G4-Q4 等。 ..我也有床单,希望不会被触及。这可能吗?

根据我的研究,它使用For Each ws In ThisWorkbook.Sheets。我尝试使用它,但它仍然删除了STUDENTS_INFO 工作表中的行,而不是多张工作表上的行。

这是我尝试过的代码。

Application.ScreenUpdating = False
    
    For Each ws In ThisWorkbook.Sheets
        LastRow = ws.Cells(Rows.Count, "C").End(xlUp).Row
        For r = 10 To LastRow
            If CStr(ThisWorkbook.Sheets("HOME").Range("K11").Value) = ws.Cells(r, 3) Then
                ws.Rows(r).EntireRow.Delete
                MsgBox "Student's data is now deleted!"
                Unload Me
            End If
        Next r
    Next ws
    
Application.ScreenUpdating = True

【问题讨论】:

  • 注意,循环和删除时最好使用Union,如here所示。另一种选择是自下而上循环。
  • “我也有床单,希望不会被碰。这可能吗?”是的,通过检查工作表的.Name
  • 我会为您的目标 ID 过滤每个工作表,然后删除可见单元格。此处无需循环
  • 另外,@BigBen 的意思是 here ;)
  • 不知道为什么您的代码在一张纸上工作,而在其他任何一张纸上都没有。是否有其他相关代码未显示?比如On Error 之类的?

标签: excel vba


【解决方案1】:

我同意 @urdearboy 的建议,即使用过滤器删除行 - 加上循环遍历您指定的工作表数组。以下代码假定学生 ID 来自 HOME 表上的单元格 K11。您可以根据需要从阵列中添加/删除工作表。

试试下面的方法,让我知道你的进展。

Option Explicit
Sub del_stud()
Dim StudID As String, ws As Worksheet

'Get the filter criteria from cell K11 in the HOME sheet
StudID = ThisWorkbook.Sheets("HOME").Range("K11").Value

'Do the STUDENTS_INFO sheet by itself
With ThisWorkbook.Sheets("STUDENTS_INFO").Cells(8, 3).CurrentRegion
    .AutoFilter 1, StudID
    .Offset(1).EntireRow.Delete
    .AutoFilter
End With

'Do the other generic sheets next - add/remove sheets as required
For Each ws In Sheets(Array("G1-Q1", "G1-Q2"))

    With ws.Cells(9, 3).CurrentRegion
        .AutoFilter 1, StudID
        .Offset(1).EntireRow.Delete
        ws.AutoFilterMode = False
    End With

Next ws

End Sub

【讨论】:

  • 我收到一条错误消息,上面写着AutoFilter method of Range class failed。这是突出显示的行.AutoFilter 1, StudID
  • 一些按钮和其他东西。表头在Row 8,所以数据从row 9开始,然后是column C
  • 是的。除了STUDENTS_INFO 之外,所有G1-Q1 等都相同,但StudID 的行和列在每个工作表中都相同。修改的结果是删除了G1-Q1Q2-G1的header,而不是StudID
  • 请问.AutoFilter 1, StudID中的1是什么?
  • STUDENTS_INFO 的标头位于 Row 8
猜你喜欢
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 2017-07-24
相关资源
最近更新 更多