如果多个条件不满足excel vba,则停止保存更改

如果多个条件不满足excel vba,则停止保存更改,vba,Vba,我是vba的新手,我一直花时间在网上冲浪,试图找到解决方案,但我不能 有人能帮我写下面的代码吗?我希望excel在保存前,每当B列填写数据(即B列不是空的)时,强制用户在K列、L列和S列中插入数据 我能知道我错过了什么让它运行吗 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Set rng = Worksheets("Sheet1").Range("B7:B10000") Applic

我是vba的新手,我一直花时间在网上冲浪,试图找到解决方案,但我不能 有人能帮我写下面的代码吗?我希望excel在保存前,每当B列填写数据(即B列不是空的)时,强制用户在K列、L列和S列中插入数据

我能知道我错过了什么让它运行吗

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Set rng = Worksheets("Sheet1").Range("B7:B10000")
Application.ScreenUpdating = False
For Each cell In rng
If Not IsEmpty(cell) And IsEmpty(cell.Offset(-1, 9)) Then
Application.Goto cell.Offset(-1, 9)
Cancel = True
MsgBox "Save is cancelled!" & _
vbNewLine & "" & vbNewLine & "Please fill in cells in column K."

End If
Next
Application.ScreenUpdating = True
End Sub

Private Sub column_L()
Set rng = Worksheets("Sheet1").Range("B7:B10000")
Application.ScreenUpdating = False
For Each cell In rng
If Not IsEmpty(cell) And IsEmpty(cell.Offset(-1, 10)) Then
Application.Goto cell.Offset(-1, 10)
Cancel = True
MsgBox "Save is cancelled!" & vbNewLine & "" & vbNewLine & "Please fill in cells in column L."

End If
Next
Application.run macro:="column_L"
End Sub

Private Sub column_S()
Set rng = Worksheets("Sheet1").Range("B7:B10000")
Application.ScreenUpdating = False
For Each cell In rng
If Not IsEmpty(cell) And IsEmpty(cell.Offset(-1, 17)) Then
Application.Goto cell.Offset(-1, 17)
Cancel = True
MsgBox "Save is cancelled!" & _
vbNewLine & "" & vbNewLine & "Please fill in cells in column S."

End If
Next
Application.run macro:="column_S"
End Sub
您有两个子例程(
column\u L
column\u S
),它们没有从任何地方被调用,但如果它们被调用,它们将进入无限循环,因为它们调用了自己

您的代码应仅放置在
BeforeSave
事件中,如下所示:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim rng As Range
    Set rng = Worksheets("Sheet1").Range("B7:B10000")
    Cancel = True
    For Each cell In rng
        If Not IsEmpty(cell) Then
            'Check column K of current row
            If IsEmpty(cell.Offset(0, 9)) Then
                Application.Goto cell.Offset(0, 9)
                MsgBox "Save is cancelled!" & _
                       vbNewLine & vbNewLine & "Please fill in cells in column K."
                Exit Sub
            End If
            'Check column L of current row
            If IsEmpty(cell.Offset(0, 10)) Then
                Application.Goto cell.Offset(0, 10)
                MsgBox "Save is cancelled!" & _
                       vbNewLine & vbNewLine & "Please fill in cells in column L."
                Exit Sub
            End If
            'Check column S of current row
            If IsEmpty(cell.Offset(0, 17)) Then
                Application.Goto cell.Offset(0, 17)
                MsgBox "Save is cancelled!" & _
                       vbNewLine & vbNewLine & "Please fill in cells in column S."
                Exit Sub
            End If
        End If
    Next
    Cancel = False
End Sub
(我删除了你的
屏幕更新
代码,因为你的代码实际上没有更新任何单元格,所以我认为除了转到引起的移动之外,你不应该看到任何屏幕闪烁,你可能希望用户看到它。)

你有两个子例程(
column\u L
column\u S
)它们不是从任何地方被调用的,但如果它们被调用,它们将进入无限循环,因为它们调用自己

您的代码应仅放置在
BeforeSave
事件中,如下所示:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim rng As Range
    Set rng = Worksheets("Sheet1").Range("B7:B10000")
    Cancel = True
    For Each cell In rng
        If Not IsEmpty(cell) Then
            'Check column K of current row
            If IsEmpty(cell.Offset(0, 9)) Then
                Application.Goto cell.Offset(0, 9)
                MsgBox "Save is cancelled!" & _
                       vbNewLine & vbNewLine & "Please fill in cells in column K."
                Exit Sub
            End If
            'Check column L of current row
            If IsEmpty(cell.Offset(0, 10)) Then
                Application.Goto cell.Offset(0, 10)
                MsgBox "Save is cancelled!" & _
                       vbNewLine & vbNewLine & "Please fill in cells in column L."
                Exit Sub
            End If
            'Check column S of current row
            If IsEmpty(cell.Offset(0, 17)) Then
                Application.Goto cell.Offset(0, 17)
                MsgBox "Save is cancelled!" & _
                       vbNewLine & vbNewLine & "Please fill in cells in column S."
                Exit Sub
            End If
        End If
    Next
    Cancel = False
End Sub

(我删除了你的
屏幕更新
代码,因为你的代码实际上没有更新任何单元格,所以我认为除了转到引起的移动之外,你不应该看到任何屏幕闪烁,你可能希望用户看到。)

非常感谢,但它仍然不起作用……也就是说,我希望用户只能在K、L或S列不为空的情况下进行保存。@Florid您的原始代码似乎正在检查K列(可能还有L和S列)是否为空在B列的非空单元格之前的行为空。这是您想要的吗?还是要检查与B列的非空单元格位于同一行的单元格?或者“仅当K、L或S列不为空时才能保存”表示如果这些列中的任何一列不为空,则可以保存(只有当三列都为空时才是错误)?只要B列中的单元格填充了数据,那么K、L和s列中同一行的单元格也必须填充数据,否则文件无法保存。@Florid-如果要检查同一行的单元格,而不是前一行的单元格,则需要更改偏移量(例如,从
.Offset(-1,9)
.Offset(0,9)
)。我已经更新了答案。你能帮我做点什么吗?请欣赏,但它仍然不起作用……也就是说,我希望用户只有在K、L或S列不为空时才能保存。@Florid你的原始代码似乎正在检查K列(可能是L和S列)是否为空在B列的非空单元格之前的行为空。这是您想要的吗?还是要检查与B列的非空单元格位于同一行的单元格?或者“仅当K、L或S列不为空时才能保存”表示如果这些列中的任何一列不为空,则可以保存(只有当三列都为空时才是错误)?只要B列中的单元格填充了数据,那么K、L和s列中同一行的单元格也必须填充数据,否则文件无法保存。@Florid-如果要检查同一行的单元格,而不是前一行的单元格,则需要更改偏移量(例如从
.Offset(-1,9)
.Offset(0,9)
)。我已经更新了答案。你能帮我做点别的吗