有人可以告诉我“ MsgBox”代码出了什么问题吗?

时间:2019-11-10 00:19:06

标签: excel vba

我在此编码上遇到“编译错误”,无法找出红色的行出了什么问题?

我已经搜索了几个站点以确定可能出了什么问题,但是没有找到可以解决我的问题的东西?

    Sub MsgBoxCritical()


 Dim ws As Worksheet
 Set ws = Worksheets("Travel Expense Form")
 Dim amt As Range
 Set amt = Range("U15:U45")
 Dim proj As Range
 Set proj = Range("N15:N45")


   For Each Cell In ws("amt")
    If Cell.Value > 0 Then
   For Each Cell In ws("proj")
    If Cell.Value = "" Then Cell.Interior.Color = vbRed
        MsgBox "Project Number must be provided for all lines where 
        reimbursement is being requested" & vbCritical
        Cancel = True
   End If
End Sub

我希望在保存工作簿时显示以下消息框:如果U列的第15-45行中的任何单元格大于0,并且对应行的N列中的单元格为空白。

我收到范围U15:U45的编译错误,并且是Expected:Expression错误吗?

2 个答案:

答案 0 :(得分:1)

编译错误表示,VBA无法编译代码。因此,它突出显示了“奇怪”的行。在这种情况下,两个If条件有些错误。这是编写And的标准方法。它写有1 If:

Sub TestMe()

   Dim conditionA As Boolean
   Dim conditionB As Boolean
   conditionA = True
   conditionB = True
   If conditionA And conditionB Then
        MsgBox "Both true!"
   End If

End Sub

关于代码,其中有一些缺陷。通常,如果应该检查范围内的每个单元格,则进行循环检查。在某些情况下,也可以尝试WorksheetFunction.Sum(Worksheets("Travel Expense Voucher").Range("U15:U45"))>0,但是很难获得该行,在这种情况下,该行大于0。无论如何:

Sub MsgBoxCriticalIcon()

    Dim myCell As Range

    With Worksheets("Travel Expense Voucher")
        For Each myCell In .Range("U15:U45")
            If myCell.Value > 0 And .Cells(myCell.Row, "N") = "" Then
                MsgBox "Project must be ... at row " & myCell.Row
                Exit Sub
            End If
        Next myCell
    End With

End Sub

答案 1 :(得分:1)

发布的MsgBox代码有两个问题:

If Cell.Value = "" Then Cell.Interior.Color = vbRed
    MsgBox "Project Number must be provided for all lines where 
    reimbursement is being requested" & vbCritical
    Cancel = True

(在上下文中保留两行代码)

第一个是vbCritical是标志和MsgBox call的单独参数。但是,jsut可能会在字符串的末尾添加一个不寻常的数字。

第二个问题是您的文本行已环绕并且在单独的行中显示。这会导致编译错误。

尝试一下:

If Cell.Value = "" Then Cell.Interior.Color = vbRed
MsgBox "Project Number must be provided for all lines where reimbursement is being requested", vbCritical
Cancel = True

请注意,适当的缩进将帮助您识别代码块并确保If语句正确匹配。同样,不确定Cancel在此循环中正在做什么,但是要了解范围以及如何正确地传递变量(作为参数或通过函数返回它们)。

最后,请始终在模块顶部使用Option Explicit。虽然这样可以确保强类型化并在未声明变量的情况下返回错误(这对于拾取拼写错误非常有用),但在这种情况下,还可以确保VBA IDE在调试时提供一些其他信息。