当某些单元格为空时阻止保存/关闭excel文件

时间:2018-04-16 12:35:53

标签: excel vba excel-vba excel-formula excel-2010

我正在尝试阻止我的excel文件保存和关闭,而不使用VBA将数据填充到一列中。

我有一张名为“Action Tracker”的工作表,其中包含一个名为“tb_Action_Tracker”的表。

列K被命名为“当前状态”,它包含一个下拉菜单,您可以从中选择创建状态(新建,打开,风险,过期,已关闭)。

我的目标是:如果有人将新的行/数据集添加到表中,并选择列K中的任何状态(名为“当前状态”),则无法关闭/保存文件没有将信息填入名为“上次更新”的列L中。

换句话说:如果我在表格中添加一个新行,那么我将在列K中选择状态“新建”(或从下拉菜单中的任何其他位置),并将列L清空,然后我将得到一个警告信息“xyz”。

有人知道如何解决这个问题吗?

这是我的代码,但不起作用:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Sheets("Action Tracker").Select

Dim tbl As ListObjects
Set tbl = Sheets("Action Tracker").ListObjects("tb_Action_Tracker")

If ListObjects("tb_Action_Tracker").Column("Last update").Value = "" Then
Cancel = True

MsgBox "Save cancelled"
Else
ActiveWorkbook.Close SaveChanges:=True
End If

End Sub

我会感激任何提示! :)

非常感谢您提前! :)

2 个答案:

答案 0 :(得分:0)

您可以尝试计算列中的空白单元格:

If WorksheetFunction.CountBlank(Sheets("Action Tracker").ListObjects("tb_Action_Tracker").ListColumns("Last update").Range) > 0 then 
    Cancel = True
    MsgBox "Save cancelled"
Else
    ...

答案 1 :(得分:0)

您不需要ActiveWorkbook.Close SaveChanges:=True,因为这是BeforeClose事件,因此它已经开始关闭。 (您可能仍然希望ThisWorkbook.Save在那里 - ThisWorkbook是调用代码的工作簿,因此比使用ActiveWorkbook更安全

如果您设置了Cancel = True,那么它将取消关闭 - 如果您要取消保存,那么您需要BeforeSave事件中的类似内容。< / p>

现在,当存在满足以下3个条件的行时,您要拒绝保存/关闭:

  1. 不是第1行(例如列K不是“当前状态”列K不是“最后更新”
  2. 列K 空白
  3. L栏 空白
  4. 好吧,让我们把它写成COUNTIFS

    =COUNTIFS($K:$K, "<>" & $K$1, $K:$K, "<>", $L:$L, "")
    

    您可以在VBA中使用带有WorksheetFunction.<FunctionName>的Excel工作表函数,因此转换上面的内容:

    WorksheetFunction.CountIfs(Worksheets("Action Tracker").Columns(11), "<>" & Worksheets("Action Tracker").Cells(1,11).Value, Worksheets("Action Tracker").Columns(11), "<>", Worksheets("Action Tracker").Columns(12), "")
    

    如果该公式给我们1或更多,那么我们有一个无效的行,所以我们要禁用save&amp;闭幕!把它们放在一起,然后你就去了:

    Option Explicit
    
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        If WorksheetFunction.CountIfs(ThisWorkbook.Worksheets("Action Tracker").Columns(11), "<>" & ThisWorkbook.Worksheets("Action Tracker").Cells(1, 11).Value, _
                ThisWorkbook.Worksheets("Action Tracker").Columns(11), "<>", ThisWorkbook.Worksheets("Action Tracker").Columns(12), "") > 0 Then
            Cancel = True
        'Else 'Optional - if you uncomment this it will always save when you close
        '    ThisWorkbook.Save
        End If
    End Sub
    
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
        If WorksheetFunction.CountIfs(ThisWorkbook.Worksheets("Action Tracker").Columns(11), "<>" & ThisWorkbook.Worksheets("Action Tracker").Cells(1, 11).Value, _
                ThisWorkbook.Worksheets("Action Tracker").Columns(11), "<>", ThisWorkbook.Worksheets("Action Tracker").Columns(12), "") > 0 Then
            Cancel = True
        End If
    End Sub