我正在尝试阻止我的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
我会感激任何提示! :)
非常感谢您提前! :)
答案 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个条件的行时,您要拒绝保存/关闭:
好吧,让我们把它写成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