根据特定单元格值清除 Excel table 中的列内容

Clear column content in Excel table based on specific cell value

我的启用宏的 excel 文件中有以下 Table,

Table1:

我的目标是:

在关闭此工作簿之前,我需要清除 D 列内容(在 Table1 中显示为“第 4 列”),仅当 D 列单元格值 = 999 时。 例如,查看上面的屏幕截图 - 当“关闭工作簿”事件触发时,必须清除 D2 和 D4 中的单元格内容。

重要 - 如果用户将在此 table 中创建新记录,则 D 列下的任何新单元格也可能具有 999 值。如果新记录在 D 列中包含单元格值 = 999 - 必须将其清除! 必须清除 D 列中单元格值 = 999 的任何新记录!

查看我期望的更新图片 -

单元格 D2、D4 和 D7(在此表中创建新记录之后)的值为 999 并已清除:

使用以下 vba 代码但它不起作用:

     Private Sub Workbook_BeforeClose(Cancel As Boolean)

        Dim sht As Worksheet
        Set sht = ThisWorkbook.ActiveSheet

        If Worksheets("Sheet1").ListObjects("Table1").Columns(4).Value = 999 Then
           Worksheets("Sheet1").ListObjects("Table1").Columns(4).ClearContents
  
        End If

    End Sub

两个紧迫的问题:

  • A ListObject 没有 Columns 属性,而是 ListColumns 属性.
  • 循环* ListColumn.DataBodyRange 中的单元格,而不是尝试将整列与 999 进行比较。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim tbl As ListObject
    Set tbl = Me.Worksheets("Sheet1").ListObjects("Table1")
    
    Dim cell As Range
    For Each cell In tbl.ListColumns(4).DataBodyRange
        If cell.Value = 999 Then 
            cell.ClearContents
        End If
    Next
End Sub

* 使用 Variant 数组可以更快,但对于相对较小的 table.

应该没问题

清除 Excel Table

中的值
Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Dim ws As Worksheet: Set ws = Me.Worksheets("Sheet1")
    Dim tbl As ListObject: Set tbl = ws.ListObjects("Table1")
    Dim lcl As ListColumn: Set lcl = tbl.ListColumns("Column 4") ' 4
        
    lcl.DataBodyRange.Replace 999, Empty, xlWhole
    
End Sub

编辑

  • 如果您想在工作簿已保存时避免 'save alert dialog',您可以通过以下方式进行改进:
Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    
    Dim IsSaved As Boolean: IsSaved = Me.Saved
    
    Dim ws As Worksheet: Set ws = Me.Worksheets("Sheet1")
    Dim tbl As ListObject: Set tbl = ws.ListObjects("Table1")
    Dim lcl As ListColumn: Set lcl = tbl.ListColumns("Column 4") ' 4
        
    lcl.DataBodyRange.Replace 999, Empty, xlWhole
    
    If IsSaved Then Me.Save
    
End Sub