条件循环VBA帮助,感到困惑

时间:2019-02-28 18:43:32

标签: excel vba

所以我问这个问题的原因是因为我不确定为什么这段代码不能正常工作,所以我很困惑。我不知道如何做特定的事情,这不是问题。

因此,某些日期正在“保存”在AK23:AL72范围内。该代码应该将保存的日期与K23:L72范围内的日期进行比较,如果行中的任何日期:23,35,36,45,46,47不同,它将在MsgBox中以可见提示提示用户。如果这些特定行中没有其他日期,则应通过InputBox提示用户输入注释。它所做的只是通过MsgBox提示输入任何不同的日期。它也做其他一些事情,但是都正常工作。我不知道为什么这些提示全都是搞砸了,在这里呆了大约一两个小时。

我知道代码有点像蛮力的,但是在这方面我还是很新的。

    Dim i As Integer
    Dim j As Integer

    For i = 0 To 49

    cRow = i + 23

        For j = 0 To 1

            If Sheets("Monthly Status").Cells(cRow, j + 11) <> Sheets("Monthly Status").Cells(cRow, j + 37) Then

                If cRow = 23 Or 35 Or 36 Or 45 Or 46 Or 47 Then

                    ans = MsgBox("You made a change to a critical deliverable date, do you want to continue?", vbYesNo + vbQuestion)

                    If ans = vbNo Then
                        MsgBox "You are not authorized to make this change!", vbCritical
                        Application.ScreenUpdating = False
                        Sheets("Monthly Status").Cells(cRow, j + 37).Copy
                        Sheets("Monthly Status").Cells(cRow, j + 11).PasteSpecial xlPasteValues
                        Application.CutCopyMode = False
                    End If

                    If ans = vbYes Then
                        ans = MsgBox("Do you have Scope Change Aproval?", vbYesNo + vbQuestion)

                        If ans = vbNo Then
                            MsgBox "You are not authorized to make this change! Changes to critical dates will be rolled back.", vbCritical
                            Application.ScreenUpdating = False
                            Sheets("Monthly Status").Cells(cRow, j + 37).Copy
                            Sheets("Monthly Status").Cells(cRow, j + 11).PasteSpecial xlPasteValues
                            Application.CutCopyMode = False
                        End If

                    End If

                Application.ScreenUpdating = False
                Sheets("Monthly Status").Range("K23:L72").Copy
                Sheets("Monthly Status").Range("AK23:AL72").PasteSpecial xlPasteValues
                Application.CutCopyMode = False

                Application.ScreenUpdating = True

                Else
                End If
            End If



            If Sheets("Monthly Status").Cells(cRow, j + 11) <> Sheets("Monthly Status").Cells(cRow, j + 37) Then

                Worksheets("Monthly Status Footnotes").Unprotect Password:="SCPV3"

                Worksheets("Monthly Status Footnotes").Cells(MSFFreeRow, "D").value = InputBox("You changed a date, you must enter revison notes!", "Notes")

                    Application.ScreenUpdating = False

                Worksheets("Monthly Status Footnotes").Protect Password:="SCPV3"

                    Sheets("Monthly Status").Range("K23:L72").Copy
                    Sheets("Monthly Status").Range("AK23:AL72").PasteSpecial xlPasteValues
                    Application.CutCopyMode = False

                    Application.ScreenUpdating = True
            End
            End If

        Next j
    Next i

进一步澄清:

用文字解释非常令人困惑。因此,我正在检查K23:L72范围内的所有单元格,并将它们与AK23:AL72中各自保存的日期进行比较。然后,如果K23:L72中的日期与其AK23:AL72中的相应日期不同,则我需要检查以下几行之一中是否发生了更改的日期:如果是,则为23,35,36,45,46,47需要向用户提示一系列问题,如果对两个问题的回答均为“是”,那么我将保存工作表并将新日期保存在AK23:AL72中。如果对两个问题的回答均为“否”,则需要用AK23:AL72范围内的旧的对应日期替换更改的日期,然后保存工作表。如果更改的日期不是这些行之一,但是仍然不同,则需要提示用户输入注释,然后保存工作表,然后将新日期保存在AK23:AL72中。如果没有什么不同,则应保存该表。

2 个答案:

答案 0 :(得分:2)

我认为SJR已经指出了需要做的事情,但是也许您没有注意到它:

此if语句If cRow = 23 Or 35 Or 36 Or 45 Or 46 Or 47 Then将始终产生true,因为or不能这样工作。

在伪代码中,这基本上转换为If cRow = 23 or If 35 or If 36 or If 45等。 If 35,所有其他数字将始终生成true。正如SJR所说,您需要将其更改为

If cRow = 23 Or cRow = 35 Or cRow = 36 Or cRow = 45 Or cRow = 46 Or cRow = 47 Then

答案 1 :(得分:1)

在这种情况下,我建议使用Select Case结构,因为您要将变量与多个值进行比较:

Select Case cRow
Case 23, 35, 36, 45, 46, 47
    ' MsgBox
Case Else
    ' No MsgBox
End Select