根据特定单元格值清除 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
我的启用宏的 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