Excel 保存工作簿时会删除复选框
B列包含复选框。我的数据以表格格式组织。我注意到,如果我过滤数据,然后关闭并保存文件,隐藏行中的复选框将被删除。我添加了一个例程,在关闭工作簿之前从所有工作表中删除过滤器,但它仍然会删除复选框。保存工作簿时,这些复选框似乎已被删除。请帮助解决此问题 多谢各位 用于删除筛选器的代码(removeAllFilters) 关闭前在工作簿中调用子对象Excel 保存工作簿时会删除复选框,excel,vba,Excel,Vba,B列包含复选框。我的数据以表格格式组织。我注意到,如果我过滤数据,然后关闭并保存文件,隐藏行中的复选框将被删除。我添加了一个例程,在关闭工作簿之前从所有工作表中删除过滤器,但它仍然会删除复选框。保存工作簿时,这些复选框似乎已被删除。请帮助解决此问题 多谢各位 用于删除筛选器的代码(removeAllFilters) 关闭前在工作簿中调用子对象 Private Sub Workbook_BeforeClose(Cancel As Boolean) Call removeAllFilter
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call removeAllFilters
Application.OnKey "^m"
End Sub
当我显示所有数据,然后关闭自动过滤时,文本框似乎又回到了原来的位置,我确实看到这个问题已经存在了一段时间。这对我来说是有效的,显示所有数据,然后关闭过滤器。可能还需要进行一些错误检查
With ActiveSheet
If .AutoFilterMode = True Then
.ShowAllData
.AutoFilterMode = False
End If
End With
由于与相关,关闭文件时不会删除以下复选框:
- 使用“自动筛选”时,框与隐藏行一起移动(位于彼此的顶部)
Option Explicit
Private Sub Workbook_Open()
Application.OnKey "^m", "LoadForm"
setSheets
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.OnKey "^m"
removeAutoFilter
ThisWorkbook.Save
End Sub
在VBA模块中,添加两个子模块:
Public Sub removeAutoFilter()
Dim ws As Worksheet, lRow As Range, cRow As Long, thisWs As Worksheet, cbN As String
Dim l As Double, r As Double, aSet As Byte, s1 As Boolean, s2 As Boolean
Dim tbl As ListObject, done As Boolean, isUsed As Boolean
Application.ScreenUpdating = False: setSheets
For Each ws In ThisWorkbook.Worksheets
If ws.Name = wsColon.Name Or ws.Name = wsLung.Name Or ws.Name = wsMela.Name Then
If Not ws.AutoFilter Is Nothing Then
For Each tbl In ws.ListObjects
tbl.Range.AutoFilter: tbl.Range.AutoFilter: done = True
Next
If Not done Then ws.UsedRange.AutoFilter: ws.UsedRange.AutoFilter
End If
For Each lRow In ws.UsedRange.Rows
With lRow
cRow = .Row: isUsed = Len(.Cells(1, EMPTY_ROW_CHECK_3).Value2) > 0
If (cRow > 2 And isUsed) Or (cRow > 2 And .Cells(1, 3).Value > 0) Then
getAlignment .Cells(1, 2), l, r
cbN = IIf(cRow < 10, "_0" & cRow, "_" & cRow)
If cRow = 3 Then
s1 = ws.CheckBoxes("cb" & SET_Name1 & 1 & cbN).Visible
s2 = ws.CheckBoxes("cb" & SET_Name1 & 2 & cbN).Visible
aSet = IIf(s1, IIf(s2, 3, 1), 2)
End If
restCB ws, "cb" & SET_Name1 & 1 & cbN, .Top, l - 1
restCB ws, "cb" & SET_Name1 & 2 & cbN, .Top, r + 7
End If
End With
Next
End If
Next
Application.ScreenUpdating = True
updateSet aSet
End Sub
- 它删除所有图纸上的任何过滤器,并将数据重置为自动过滤
- 确定激活集(1、2或3)
- 取消隐藏所有复选框(两组)
- 根据当前行垂直和水平重新对齐它们
- 重新初始化活动集
- 关闭前保存文件
不同吗?您在关闭之前从工作簿调用过此代码吗?谢谢,在关闭之前,我尝试从工作簿中调用您的代码,但没有成功。谢谢,我在ws.Cells(1,1)行上遇到错误(运行时错误'1004'范围类的Select方法失败)。请选择removeAutoFilter sub.Paul的
,如果在工作簿关闭之前删除所有复选框并重新添加它们,那么B列中的真/假指定会发生什么情况?我使用新的解决方案对其进行了更新,该解决方案保留了所有复选框的真/假值。我应该使用旧/新版本的AddAllCheckBox吗?我想我不再需要删除所有复选框了,对吗?谢谢,我明天早上会测试。不再需要AddAllCheckBox和RemoveAllCheckBox(旧的和新的之间没有显著的变化,只是调用它们进行清理)。如果需要重置所有对象,仍然可以单独调用它们
Public Sub removeAutoFilter()
Dim ws As Worksheet, lRow As Range, cRow As Long, thisWs As Worksheet, cbN As String
Dim l As Double, r As Double, aSet As Byte, s1 As Boolean, s2 As Boolean
Dim tbl As ListObject, done As Boolean, isUsed As Boolean
Application.ScreenUpdating = False: setSheets
For Each ws In ThisWorkbook.Worksheets
If ws.Name = wsColon.Name Or ws.Name = wsLung.Name Or ws.Name = wsMela.Name Then
If Not ws.AutoFilter Is Nothing Then
For Each tbl In ws.ListObjects
tbl.Range.AutoFilter: tbl.Range.AutoFilter: done = True
Next
If Not done Then ws.UsedRange.AutoFilter: ws.UsedRange.AutoFilter
End If
For Each lRow In ws.UsedRange.Rows
With lRow
cRow = .Row: isUsed = Len(.Cells(1, EMPTY_ROW_CHECK_3).Value2) > 0
If (cRow > 2 And isUsed) Or (cRow > 2 And .Cells(1, 3).Value > 0) Then
getAlignment .Cells(1, 2), l, r
cbN = IIf(cRow < 10, "_0" & cRow, "_" & cRow)
If cRow = 3 Then
s1 = ws.CheckBoxes("cb" & SET_Name1 & 1 & cbN).Visible
s2 = ws.CheckBoxes("cb" & SET_Name1 & 2 & cbN).Visible
aSet = IIf(s1, IIf(s2, 3, 1), 2)
End If
restCB ws, "cb" & SET_Name1 & 1 & cbN, .Top, l - 1
restCB ws, "cb" & SET_Name1 & 2 & cbN, .Top, r + 7
End If
End With
Next
End If
Next
Application.ScreenUpdating = True
updateSet aSet
End Sub
Private Sub restCB(ByRef ws As Worksheet, cbN As String, t As Double, l As Double)
Dim cb As Shape
For Each cb In ws.Shapes
With cb
If .Name = cbN Then
.Visible = True
.Top = t
.Left = l
Exit For
End If
End With
Next
End Sub