Операторы VBA If-ElseIf не возвращают правильные результаты - PullRequest
0 голосов
/ 30 января 2020

У меня возникли проблемы с моими утверждениями If-ElseIf, поскольку значения ячеек не дали правильных результатов.

Ниже приведены коды в моем модуле:

1-й пакет:

Sub compare2()
Dim i As Long
Dim A As Long
Dim B As Long
Dim c As Long

A = 14
B = 15
c = 16

Do While A <= 42
i = 2
Do Until Len(Cells(i, A)) = 0

If Cells(i, A) = "Green" And Cells(i, B) = "Rollup" Then
Cells(i, c) = "Green"

ElseIf Cells(i, A) = "Rollup" And Cells(i, B) = "Rollup" Then
Cells(i, c) = "Rollup"

ElseIf Cells(i, A) = "Rollup" And Cells(i, B) = "Green" Then
Cells(i, c) = "Green"

ElseIf Cells(i, A) = "Rollup" And Cells(i, B) = "Yellow" Then
Cells(i, c) = "Yellow"

ElseIf Cells(i, A) = "Rollup" And Cells(i, B) = "Red" Then
Cells(i, c) = "Red"

ElseIf Cells(i, A) = "Rollup" And Cells(i, B) = "Overdue" Then
Cells(i, c) = "Overdue"

ElseIf Cells(i, A) = " " And Cells(i, B) = " " Then
Cells(i, c) = " "

Else

End If

i = i + 1

Loop


A = A + 4

B = A + 1

c = A + 2

Loop


End Sub

2-й пакет в модуле:

Public Sub single_change(changed_cell As Range)

    Dim sales_cell As Range
    Dim production_cell As Range
    Dim day_cell As Range
    Dim col_num As Integer

col_num = changed_cell.Column
If changed_cell.Column < 14 Then 'Dont do anything before Col N
Exit Sub
Else
col_num = changed_cell.Column - 14
End If

If col_num Mod 4 = 0 Then

Set sales_cell = changed_cell
Set production_cell = changed_cell.Offset(, 1)
Set day_cell = production_cell.Offset(, 1)

ElseIf (col_num - 1) Mod 4 = 0 Then

Set sales_cell = changed_cell.Offset(, -1)
Set production_cell = changed_cell
Set day_cell = production_cell.Offset(, -1)

Else

'Dont do anything between Col N,O and their repeated values

Exit Sub

End If

On Error GoTo multiple_changes

If sales_cell = "Green" And production_cell = "Rollup" Then
day_cell = "Green"

ElseIf sales_cell = "Rollup" And production_cell = "Rollup" Then
day_cell = "Rollup"

ElseIf sales_cell = "Rollup" And production_cell = "Green" Then
day_cell = "Green"

ElseIf sales_cell = "Rollup" And production_cell = "Yellow" Then
day_cell = "Yellow"

ElseIf sales_cell = "Rollup" And production_cell = "Red" Then
day_cell = "Red"

ElseIf sales_cell = "Rollup" And production_cell = "Overdue" Then
day_cell = "Overdue"

ElseIf sales_cell = " " And production_cell = " " Then
day_cell = " "

Else
'Do nothing
End If
Exit Sub

multiple_changes:
Dim i As Long
Dim A As Long
Dim B As Long
Dim c As Long

A = 14
B = 15
c = 16

Do While A <= 42
i = 2
Do Until Len(Cells(i, A)) = 0

If Cells(i, A) = "Green" And Cells(i, B) = "Rollup" Then
Cells(i, c) = "Green"

ElseIf Cells(i, A) = "Rollup" And Cells(i, B) = "Rollup" Then
Cells(i, c) = "Rollup"

ElseIf Cells(i, A) = "Rollup" And Cells(i, B) = "Green" Then
Cells(i, c) = "Green"

ElseIf Cells(i, A) = "Rollup" And Cells(i, B) = "Yellow" Then
Cells(i, c) = "Yellow"

ElseIf Cells(i, A) = "Rollup" And Cells(i, B) = "Red" Then
Cells(i, c) = "Red"

ElseIf Cells(i, A) = "Rollup" And Cells(i, B) = "Overdue" Then
Cells(i, c) = "Overdue"

ElseIf Cells(i, A) = " " And Cells(i, B) = " " Then
Cells(i, c) = " "

Else
End If
i = i + 1
Loop

A = A + 4
B = A + 1
c = A + 2

Loop
End Sub

И это в рабочей таблице:

Private Sub Worksheet_Change(ByVal Target As Range)

    Call Module1.single_change(Target)

End Sub

Первоначально в моих кодах была ошибка времени выполнения "Ошибка приложения или объекта" "но все операторы If и ElseIf вернули правильные значения. После изменения моих кодов на код, рекомендованный пользователем (см. Здесь Ошибка выполнения VBA 1004 «Ошибка приложения или объекта» при использовании Range.Offset ), значение ячейки всегда изменяется само по себе, даже если Я поставил другое значение.

Например, когда я ввел Rollup в ячейку N2 (столбец Sales), а затем Green в ячейку O2 (столбец Production), должна была возвращаться ячейка P2 (столбец Day). Green за ElseIf sales_cell = "Rollup" And production_cell = "Green" Then day_cell = "Green". Однако, когда я нажал Enter после заполнения ячейки O2 (Производство), ячейка N2 (Продажа) автоматически изменилась на Green. Затем после этого я изменил ячейку N2 обратно на Rollup, и макрос работал.

Печать экрана с результатом

Кто-нибудь знает, что происходит? Большое спасибо! Любая помощь высоко ценится!!!

1 Ответ

1 голос
/ 30 января 2020

Это не решение вашей проблемы.

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

Возможно, вам удастся обнаружить проблему самостоятельно.

Удалите все эти If..ElseIf...Else утверждения и замените их на Select, который намного легче читать (и намного быстрее).

Option Explicit

Private Const Green As String = "Green"
Private Const Rollup As String = "Rollup"
Private Const Yellow As String = "Yellow"

Sub Something()

    Dim A As Long, B As Long, C As Long, i As Long

    Select Case True
        Case Cells(i, A) = Green  And Cells(i, B) = Rollup: Cells(i, C) = Green
        Case Cells(i, A) = Rollup And Cells(i, B) = Rollup: Cells(i, C) = Rollup
        Case Cells(i, A) = Rollup And Cells(i, B) = Green:  Cells(i, C) = Green

        'Add more cases here...

    End Select

End Sub

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...