GJSS Ответов: 1

Обновление значений столбцов на основе других значений столбцов в коде excel VBA


Привет - я пытаюсь обновить некоторые значения столбцов на основе значения одного значения столбца с помощью этого кода VBA.

Но я получаю ошибку, что она не закончилась должным образом.

Не могли бы вы помочь мне это исправить?

Что я уже пробовал:

Sub Test()
    Dim LastRow As Long
    Dim i As Long
    LastRow = Range("AY" & Rows.Count).End(xlUp).Row
    For i = 2 To LastRow
    If Range("AY" & i).Value = "1478" and “1476” Then
            Range("BL" & i).Value = " XYZ "
        End If
           If Range("AY" & i).Value = "1589" And "1595” Then
            Range("BL" & i).Value = "ABC"
        End If
        If Range("AY" & i).Value = "484" and “1447” and “1695” Then
            Range("BL" & i).Value = "XZ"
        End If
        If Range("AY" & i).Value = "1447" Then
             Range("BM" & i).Value = "AZ” and Range("BL" & i).Value = "SPT" 
        End If        
    Next i
End Sub

1 Ответов

Рейтинг:
10

Maciej Los

Этот кусок кода никогда не станет правдой:

If Range("AY" & i).Value = "1478" and "1476" Then

Ячейка не может иметь оба значения одновременно! Кстати: почему вы думаете, что это значение основано на строке?

[Правка#1]

Я бы поменял несколько Ifв Выберите Дело[^]:
Select Case Range("AY" & i).Value
    Case 1476, 1478
            Range("BL" & i).Value = " XYZ "
    Case 1589, 1595
            Range("BL" & i).Value = "ABC"
    Case 484, 1447, 1695
            Range("BL" & i).Value = "XZ"
    Case 1447
             Range("BM" & i).Value = "AZ" 
             Range("BL" & i).Value = "SPT" 
End Select

что эквивалентно:
If Range("AY" & i).Value = 1478 OR Range("AY" & i).Value = 1476 Then
        Range("BL" & i).Value = " XYZ "
End If
'and so on...


Вы видите разницу?

[Правка#2]
Другой способ заключается в использовании объект Dictionary[^].

'needs reference to MS Scripting Runtime
    Dim myDictionary As Dictionary
    
    Set myDictionary = New Dictionary
    With myDictionary
        .Add 1476, "XYZ"
        .Add 1478, "XYZ"
        .Add 1589, "ABC"
        .Add 1595, "ABC"
        '...
    End With
    'later...
    For i = 2 To LastRow
        Range("BL" & i).Value = myDictionary(Range("AY" & i).Value)
    Next


GJSS

Здесь я пытаюсь обновить столбец BL со значением "XYZ" на основе столбца AY со значениями 1478 и 1476

Maciej Los

Нет, это не так. Вы проверяете, содержит ли ячейка значение...

GJSS

Да..если значение AY = "1478" и "1476", то я хочу обновить значение столбца BL с помощью "XYZ"

Maciej Los

Как я уже упоминал... ячейка не может иметь одно и то же значение в одно и то же время... Если есть "1478", то как может быть "1476"?
Подумай об этом!

GJSS

Это все значения столбцов, где он имеет несколько значений, но здесь я рассматриваю два значения столбцов, основанных на этих значениях, и пытаюсь обновить столбец по
ДА
147839
147839
147697
147697
147697

Maciej Los

Проверьте обновленные ответ ;)

GJSS

Код с "select case" отработан. Спасибо Мацей

Maciej Los

Всегда пожалуйста.

Richard Deeming

If Range("AY" & i).Value = "1478" and "1476" Then

Это не проверка того, равна ли ячейка двум разным значениям одновременно. Он проверяет, равна ли ячейка первому значению, а второе значение может быть приведено к чему-то похожему True, используя "полезное" принуждение типа VB.
If (Range("AY" & i).Value = "1478") and ("1476") Then

:)

Maciej Los

Хорошая мысль, Ричард! Вторая часть If оператор вычисляется в "что-то похожее True".
Приведенный ниже код доказывает это:

Dim y As Integer() = {1478, 1476}
For i As Integer = 0 To y.Length-1
	Dim result As Boolean = y(i)=1478 And 1476
	Console.WriteLine("A statement ({0}=1478 And 1476) evaluates into {1}", y(i), result)
Next


Что ж... Я очень торопился... ;)