Может кто-нибудь сказать мне, что не так с моим кодом «MsgBox»? - PullRequest
1 голос
/ 10 ноября 2019

Я получаю сообщение об ошибке компиляции в этой кодировке и не могу понять, что не так со строкой, выделенной красным?

Я искал несколько сайтов, чтобы определить, что может быть не так, но ничего не нашелчто отвечает на мою проблему?

    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 ]

1 голос
/ 10 ноября 2019

Существует две проблемы с кодом 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 вызова . Однако, это, вероятно, добавит необычное число в конец строки.

Вторая проблема состоит в том, что ваши текстовые строки обернуты вокруг и представлены в отдельных строках. Это может привести к ошибке компиляции.

Попробуйте сделать следующее:

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 предоставляет некоторую дополнительную информацию при отладке.

1 голос
/ 10 ноября 2019

Ошибка компиляции означает, что VBA не может скомпилировать код. Таким образом, он выделяет строку, которая является «странной». В этом случае два условия If немного неправильны. Это стандартный способ записи And. Это написано с 1 Если:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...