Сравнение значений в Excel VBA

#excel #comparison #vba

#excel #сравнение #vba

Вопрос:

Я пытаюсь сравнить ячейку A1 с B1 и, если это правда, заполнить ячейку F1 значением A1. Но независимо от моих входных значений условие if становится истинным.

 Sub Macro3()
    Dim i As Integer
    i = 1
    For i = 1 To 10
        If (Range("A" amp; i).Select = Range("B" amp; i).Select) Then
            Range("A" amp; i).Select
            Selection.Copy
            Range("F" amp; i).Select
            ActiveSheet.Paste
        End If
    Next i      
End Sub
  

Комментарии:

1. Вы выполняете код с листом, который хотите адаптировать в качестве активного листа? Какие значения лежат в A1 и B1, которые не совпадают, но запускают условие True? Почему не простой тест IF? 🙂

Ответ №1:

Вместо выбора, копирования и вставки вы можете сравнить свойство Value ячеек, а затем соответствующим образом установить значение столбца F:

 Dim i As Integer
For i = 1 To 10
    If Range("A" amp; i).Value = Range("B" amp; i).Value Then
        Range("F" amp; i).Value = Range("A" amp; i).Value
    End If
Next
  

Комментарии:

1. Спасибо за очень полезное предложение.. основная проблема, с которой я сталкиваюсь, — это «If Range («A» amp; i). Значение = диапазон («B» и i). Значение » это условие не выполняется независимо от значений в столбцах A и B.

2. @Venkat — Вы хотите сказать, что совпадения нет, даже если значения совпадают? Что-то не то, что вы думаете…

3. @тим Уильямс: — да, это было раньше…. Но сейчас это работает нормально… эта проблема решена … я завершил код .. Теперь проблема связана с ПРОИЗВОДИТЕЛЬНОСТЬЮ, я использую 2 листа для выполнения задачи. Здесь я сравниваю каждую строку excel 1 со всеми активными строками Excel 2. итак, я попадаю в цикл for … сбой Excel из-за большого количества строк. Могу ли я получить какие-либо предложения по повышению производительности

Ответ №2:

Считайте это комплиментом к ответу Ника (примите его, если вы сочтете, что это сработает, что вам и следует). Я хотел помочь объяснить некоторые неправильные вещи в вашем коде.

Перед ИСПРАВЛЕНИЕМ:

 Sub Macro3()
    Dim i As Integer
    i = 1
    For i = 1 To 10
        If (Range("A" amp; i).Select = Range("B" amp; i).Select) Then
            Range("A" amp; i).Select
            Selection.Copy
            Range("F" amp; i).Select
            ActiveSheet.Paste
        End If
    Next i
End Sub
  

ПОСЛЕ ИСПРАВЛЕНИЯ

 Sub Macro4()
    Dim i As Long
    For i = 1 To 10
        If Range("A" amp; i).Value = Range("B" amp; i).Value Then
            Range("F" amp; i).Value = Range("A" amp; i).Value
        End If
    Next
End Sub
  

Очки:

  1. Используйте Long вместо Integer (небольшая оптимизация, поскольку VBA в любом случае преобразует int в long)
  2. Нет необходимости объявлять i = 1 дважды подряд
  3. Вы должны сравнивать значения, а не просто выбирать ячейки. Редко, если вообще когда-либо, возникает необходимость использовать .Выберите ключевое слово. Вы можете получить доступ ко всем свойствам объекта напрямую.
  4. Копирование и вставка — сложная операция. Поскольку вы работаете в VBA, можете просто присвоить значение, которое находится в A, ячейке в столбце B. Это быстрее и эффективнее.

Я надеюсь, что это поможет. Кстати, вы можете просто ввести:

 =IF(A1=B1,A1,"")
  

в F1 и перетащите формулу вниз, чтобы получить аналогичный результат.

Ответ №3:

Вы можете использовать массив вариантов для решения проблемы производительности, о которой говорилось выше. Этот код будет выполняться так же, как и Nicks, за исключением того, что он будет пропускать пустые ячейки, т. Е. Он будет

  1. обновите значение F, если A и B совпадают
  2. пропустить обновления, если ячейка A пуста
  3. оставьте существующие значения F на месте, если A<>B

Мне было непонятно, как вы сравниваете строки на двух листах, можете ли вы подробнее рассказать об этом?

     Sub MyArray()
    Dim X As Variant
    Dim Y As Variant
    Dim lngrow As Long
    X = Range([a1], Cells(Rows.Count, "B").End(xlUp))
    Y = Range([f1], [f1].Offset(UBound(X, 1) - 1, 0))
    For lngrow = 1 To UBound(X, 1)
       If Len(X(lngrow, 1)) > 0 Then
       If X(lngrow, 1) = X(lngrow, 2) Then Y(lngrow, 1) = X(lngrow, 1)
       End If
    Next
    Range([f1], [f1].Offset(UBound(X, 1) - 1, 0)) = Y
    End Sub