#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
Очки:
- Используйте Long вместо Integer (небольшая оптимизация, поскольку VBA в любом случае преобразует int в long)
- Нет необходимости объявлять i = 1 дважды подряд
- Вы должны сравнивать значения, а не просто выбирать ячейки. Редко, если вообще когда-либо, возникает необходимость использовать .Выберите ключевое слово. Вы можете получить доступ ко всем свойствам объекта напрямую.
- Копирование и вставка — сложная операция. Поскольку вы работаете в VBA, можете просто присвоить значение, которое находится в A, ячейке в столбце B. Это быстрее и эффективнее.
Я надеюсь, что это поможет. Кстати, вы можете просто ввести:
=IF(A1=B1,A1,"")
в F1 и перетащите формулу вниз, чтобы получить аналогичный результат.
Ответ №3:
Вы можете использовать массив вариантов для решения проблемы производительности, о которой говорилось выше. Этот код будет выполняться так же, как и Nicks, за исключением того, что он будет пропускать пустые ячейки, т. Е. Он будет
- обновите значение F, если A и B совпадают
- пропустить обновления, если ячейка A пуста
- оставьте существующие значения 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