当某些单元格中没有内容时,代码不会停止文件的保存

时间:2019-07-12 18:39:31

标签: excel vba

我正在处理一些代码,应该检查这些代码以确保D列页面底部的单元格中包含内容,然后才允许用户保存文件,但是由于某些原因不会这样做,即使这些单元格为空,我也可以保存文件,而且我不确定原因。 我将此代码作为BeforeSave动作放入“ ThisWorkbook”对象中。保存此代码的主要方式是使用一个按钮,该按钮用于自动将文件保存到特定位置,但是保存时会发生相同的情况手动。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim names As Variant 
Dim name As Variant
names = Array("sheet1", "sheet2", "sheet3") 'set up array of sheet names

For Each name In names 'check to see if cell is filled out or not
    If Worksheets(name).Cells(Rows.Count, 4).End(xlUp).value = 0 
        MsgBox "Save cancelled. Sheet " & name & " is missing signature."
    Cancel = True 'stop save from occurring
    End If

Next name

End Sub

因此,从本质上讲,我希望它遍历按名称显示的特定工作表-我已更改了该帖子的工作表名称和工作表数,但我认为这不会影响代码的工作方式-检查它们查看它们是否在D列的最后一行中包含内容(除非用户放入信息,否则它将为空),然后如果这些单元格中的任何一个为空,则不要让用户继续保存文件,直到签名至少具有一些内容。它不执行任何操作,允许文件保存,并显示错误消息“运行时错误'9'下标超出范围”。希望对这个问题有任何帮助!

1 个答案:

答案 0 :(得分:1)

将评论作为答案:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim names As Variant 
Dim name As Variant
Dim lr as Long 'ADDED
names = Array("sheet1", "sheet2", "sheet3") 'set up array of sheet names

For Each name In names 'check to see if cell is filled out or not
    With Sheets(name)
        lr = .Cells(.Rows.Count, 4).End(xlUp).Row 'ADDED
        If .Cells(lr, 4).value = "" Then 'CHANGED, but does not make sense as written unless NOTHING exists in column D (4)
            MsgBox "Save cancelled. Sheet " & name & " is missing signature."
            Cancel = True 'stop save from occurring
            Exit For
        End If
    End With
Next name

End Sub

编辑1:

关于您对结构不正确的评论,您很可能希望根据ANOTHER列检查最后一行。

由于我们看不到您的工作表,因此我假设相邻单元格中有一个用于签名的标头,这可能对您有利。可能像这样:

Cells(lr,3)    |    Cells(lr,4)
Signature:     |    ""

如果以上是正确的情况,则可以将以上代码修改为:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim names As Variant 
Dim name As Variant
Dim lr as Long 'ADDED
names = Array("sheet1", "sheet2", "sheet3") 'set up array of sheet names

For Each name In names 'check to see if cell is filled out or not
    With Sheets(name)
        lr = .Cells(.Rows.Count, 3).End(xlUp).Row 'ADDED
        If .Cells(lr, 4).value = "" Then 'CHANGED, but does not make sense as written unless NOTHING exists in column D (4)
            MsgBox "Save cancelled. Sheet " & name & " is missing signature."
            Cancel = True 'stop save from occurring
            Exit For
        End If
    End With
Next name

End Sub

唯一的变化是在定义lr的行中,我将列从4换成了3。