Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 保存工作簿时会删除复选框_Excel_Vba - Fatal编程技术网

Excel 保存工作簿时会删除复选框

Excel 保存工作簿时会删除复选框,excel,vba,Excel,Vba,B列包含复选框。我的数据以表格格式组织。我注意到,如果我过滤数据,然后关闭并保存文件,隐藏行中的复选框将被删除。我添加了一个例程,在关闭工作簿之前从所有工作表中删除过滤器,但它仍然会删除复选框。保存工作簿时,这些复选框似乎已被删除。请帮助解决此问题 多谢各位 用于删除筛选器的代码(removeAllFilters) 关闭前在工作簿中调用子对象 Private Sub Workbook_BeforeClose(Cancel As Boolean) Call removeAllFilter

B列包含复选框。我的数据以表格格式组织。我注意到,如果我过滤数据,然后关闭并保存文件,隐藏行中的复选框将被删除。我添加了一个例程,在关闭工作簿之前从所有工作表中删除过滤器,但它仍然会删除复选框。保存工作簿时,这些复选框似乎已被删除。请帮助解决此问题

多谢各位

用于删除筛选器的代码(removeAllFilters)

关闭前在工作簿中调用子对象

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)
  • 取消隐藏所有复选框(两组)
  • 根据当前行垂直和水平重新对齐它们
  • 重新初始化活动集
  • 关闭前保存文件

只有当过滤器处于打开状态时才会发生此情况。。。我该怎么办?如果我在单击退出文件之前手动或使用代码删除过滤器,它工作正常…但我不能指望用户记住删除过滤器,因为我知道他们会忘记,我会遇到麻烦。啊,我明白了,我正在过滤,然后关闭了过滤器,该死的东西就消失了。@user3781528在复选框和下拉列表方面也有类似的问题:这些控件没有被删除-它们仍然存在-但是当控件位于隐藏的单元格上时,它们的尺寸为0。一旦关闭工作簿,控件将保存这些维度,并且在再次打开工作簿时不会重新定位。我的解决方法是在关闭前取消筛选数据并保存筛选信息。在工作簿打开事件中,我再次设置了过滤器,之后一切正常-从那时起没有问题。这开始有意义了。ThanksHow它与If(ActiveSheet.AutoFilterMode和
不同吗?您在关闭之前从工作簿调用过此代码吗?谢谢,在关闭之前,我尝试从工作簿中调用您的代码,但没有成功。谢谢,我在
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