У меня возникли проблемы с моими утверждениями 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
, и макрос работал.
Печать экрана с результатом
Кто-нибудь знает, что происходит? Большое спасибо! Любая помощь высоко ценится!!!