Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/92: Рейтинг темы: голосов - 92, средняя оценка - 4.57
2 / 2 / 0
Регистрация: 10.05.2012
Сообщений: 45
1

Сравнение двух диапазонов ячеек на совпадение

29.05.2012, 00:04. Показов 18498. Ответов 20
Метки нет (Все метки)

Здравствуйте! Подскажите пожалуйста...
Имеется 2 диапазона ячеек А1:A3 и C1:C3, в которых забиты цифры, допустим в ячейках А1:A3 (3,6,2 соответственно), а в C1:C3 (2, 4, 8) и мне необходимо, чтобы при нахождении одинаковых значений выводилось сообщение. Спасибо
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2012, 00:04
Ответы с готовыми решениями:

Сравнение двух диапазонов на идентичность без анализа отдельных ячеек
Здравствуйте! Подскажите, как сравнить два диапазона на результат ЛОЖЬ или ИСТИНА (в коде 10-я...

Сравнение диапазонов на НЕ полное совпадение
Здравствуйте! Мне требуется помощь в сравнении двух диапазонов. Находятся диапазоны на...

Сравнение диапазонов ячеек
Здравствуйте! Простая задача сравнить два диапазона ячеек(A1:A3 и C1:C5), если в одном диапазоне...

Сравнение двух диапазонов на несовпадение
Подскажите пожалуйста, как организовать поиск на несовпадение? На первом листе таблицу надо...

20
Заблокирован
29.05.2012, 06:59 2
Visual Basic
1
2
3
4
5
6
7
8
Sub cmp()
Dim a As Range, c As Range
For Each a In [A1:A3]
  For Each c In [C1:C3]
    If a = c Then MsgBox a & "=" & c
  Next c
Next a
End Sub
1
2 / 2 / 0
Регистрация: 10.05.2012
Сообщений: 45
31.05.2012, 13:37  [ТС] 3
Спасибо, а как сделать чтобы этот же код продолжал работать в след.ячейках например не А1:А3 и С1:С3, а изменил диапазон со сдвигом вправо, т.е. В1:В3 и D1: D3 стало, чтобы не писать его для всех ячеек, а просто со сдвигом вправо? Спасибо
0
Эксперт WindowsАвтор FAQ
17605 / 7448 / 884
Регистрация: 25.12.2011
Сообщений: 11,236
Записей в блоге: 16
01.06.2012, 09:20 4
И сколько таких сдвигов планируется?
0
2 / 2 / 0
Регистрация: 10.05.2012
Сообщений: 45
01.06.2012, 13:00  [ТС] 5
Примерно 30 сдвигов
0
Эксперт WindowsАвтор FAQ
17605 / 7448 / 884
Регистрация: 25.12.2011
Сообщений: 11,236
Записей в блоге: 16
01.06.2012, 16:15 6
Лучший ответ Сообщение было отмечено как решение

Решение

1. Прокрутка через смещения
2. Исключено сравнение пустых строк
3. Информация о позиции найденных ячеек
Visual Basic
1
2
3
4
5
6
7
8
9
Sub cmp()
Dim a As Range, c As Range, n As Integer
For n = 0 To 30 'êîë-âî ñìåùåíèé
  For Each a In [A1:A3].Offset(, n)
    For Each c In [C1:C3].Offset(, n)
      If a = c And Len(a) <> 0 Then MsgBox a & "=" & c & " (" & _
        Replace(a.Address & " = " & c.Address & ")", "$", "")
Next c, a, n
End Sub
4
призрак
3261 / 885 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
01.06.2012, 16:38 7
Цитата Сообщение от Diskretor Посмотреть сообщение
Visual Basic
1
Replace(a.Address & " = " & c.Address & ")", "$", "")
а так не проще?
Visual Basic
1
a.Address(0,0) & " = " & c.Address(0,0)
0
Dragokas
01.06.2012, 17:23
  #8

Не по теме:

Да, я забыл как это делается. Спасибо.

0
2 / 2 / 0
Регистрация: 10.05.2012
Сообщений: 45
01.06.2012, 22:54  [ТС] 9
Спасибо!
Цитата Сообщение от Diskretor Посмотреть сообщение
Len(a) <> 0
а что значит эта строка?
0
Эксперт WindowsАвтор FAQ
17605 / 7448 / 884
Регистрация: 25.12.2011
Сообщений: 11,236
Записей в блоге: 16
02.06.2012, 05:16 10
Без нее, если попадутся 2 пустые ячейки, начнет писать о совпадении.

У меня они были почти все пустые, поэтому я это дело отключил.
1
2 / 2 / 0
Регистрация: 10.05.2012
Сообщений: 45
02.06.2012, 08:45  [ТС] 11
Спасибо! Как раз то, что нужно.
0
2 / 2 / 0
Регистрация: 10.05.2012
Сообщений: 45
03.07.2012, 23:15  [ТС] 12
Visual Basic
1
2
3
4
5
6
Dim a As Range, c As Range, n As Integer
For n = 0 To 150 Step 3 'кол-во смещений
  For Each a In [F3:H3].Offset(, n)
    For Each c In [CC3:CE3].Offset(, n)
      If a = c And Len(a) <> 0 Then letters8 = letters8 + 1
Next c, a, n
Подскажите пожалуйста, а как написать так, чтобы к letters8 прибавлялось 1 при одном совпадении и прибавлялась 2 при больше двух совпадениях.
0
Эксперт WindowsАвтор FAQ
17605 / 7448 / 884
Регистрация: 25.12.2011
Сообщений: 11,236
Записей в блоге: 16
04.07.2012, 02:51 13
Если правильно Вас понял, общее кол-во совпадений считаем, как сумму любых совпадений значений в 3 х 3 ячеек в текущем смещении. При этом, если совпадений ровно 2, то ничего не прибавляем.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim a As Range, c As Range, n As Integer, k As Integer
For n = 0 To 150 Step 3 'кол-во смещений
  k = 0
  For Each a In [F3:H3].Offset(, n)
    For Each c In [CC3:CE3].Offset(, n)
      If a = c And Len(a) <> 0 Then k = k + 1
    Next
  Next
  Select Case k
    Case 1
      letters8 = letters8 + 1
    Case Is > 2
      letters8 = letters8 + 2
  End Select
Next
1
2 / 2 / 0
Регистрация: 10.05.2012
Сообщений: 45
07.07.2012, 13:52  [ТС] 14
При выполнении данного кода, у меня при 1 совпадении все правильно происходит, а при больше двух к letters8 прибавляется 5 вместо 2.
0
Эксперт WindowsАвтор FAQ
17605 / 7448 / 884
Регистрация: 25.12.2011
Сообщений: 11,236
Записей в блоге: 16
07.07.2012, 14:09 15
Так здесь добавляется сразу же, как только найдет совпадения в одном смещении.
А Вам нужно, чтобы после просчета всех 150/3 ?

Тогда строку № 15 переместите между 8 и 9 (а № 3 удалить).
1
2 / 2 / 0
Регистрация: 10.05.2012
Сообщений: 45
07.07.2012, 15:31  [ТС] 16
У меня снова не выходит, теперь получается так, что при любом количестве совпадений прибавляется к letters8 значение 2, а должно, чтобы при отсутствии совпадений - не прибавляться ничего, при одном совпадении - прибавляться единица. И проблема по-моему в переменной k. Я в ячейки добавляю все разные значения, а k он мне выводит равное трем, поэтому и прибавляется все время 2 к letters8.
0
Эксперт WindowsАвтор FAQ
17605 / 7448 / 884
Регистрация: 25.12.2011
Сообщений: 11,236
Записей в блоге: 16
07.07.2012, 22:30 17
Можете выложить файл с некоторыми фрагментами цифер для теста.
1
2 / 2 / 0
Регистрация: 10.05.2012
Сообщений: 45
08.07.2012, 01:15  [ТС] 18
А вы можете почту написать свою? я на почту скину файл?

Добавлено через 2 часа 23 минуты
Diskretor, спасибо! Я поняла в чем ошибка была)

Добавлено через 13 минут
Последний вопрос по теме: имеется массив значений в excel и выполняется огромный код на строку 3. Необходимо сделать так, чтобы этот же код выполнялся на все заполненные последующие строки в excel. В самом коде было использовано свойство Range с конкретным указанием на ячейки в строке.
0
Эксперт WindowsАвтор FAQ
17605 / 7448 / 884
Регистрация: 25.12.2011
Сообщений: 11,236
Записей в блоге: 16
08.07.2012, 02:03 19
Да? А я - нет. Можете просветить, чтобы в следующий раз тоже знать как правильно объяснять?

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Dim Rng As Range, c As Range, n%, k%, R%
Dim letters8(3 To 10)
For R = 3 To 10 'номера строк
  For n = 0 To 150 Step 3 'кол-во смещений
    k = 0 'в каждом смещении вправо K подсчитываем отдельно
    For Each Rng In Range("F" & R & ":H" & R).Offset(, n)
      For Each c In Range("CC" & R & ":CE" & R).Offset(, n)
        If Rng = c And Len(Rng) <> 0 Then k = k + 1
      Next
    Next
    Select Case k
      Case 1
        letters8(R) = letters8(R) + 1
      Case Is > 2
        letters8(R) = letters8(R) + 2
    End Select
  Next n
Next R
Из леттерсов тоже сделал массив, так как не знал они теперь отдельно подсчитываются или складываются из всех строк. Если что поубираете массивы (скобки).
1
2 / 2 / 0
Регистрация: 10.05.2012
Сообщений: 45
08.07.2012, 10:30  [ТС] 20
Вы в самом начале правильно мне все написали, ошибка у меня была в диапазоне: было от 0 до 150, а нужно было от 0 до 75, и в кейсах у меня он не понимал что такое Case 1, поэтому я ему указала конкретно на равенство через Case Is. И все, спасибо вам)

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim a As Range, c As Range, n As Integer, k As Integer
For n = 0 To 75 Step 3 'кол-во смещений
  For Each a In [F3:H3].Offset(, n)
    For Each c In [CC3:CE3].Offset(, n)
      If a = c And Len(a) <> 0 Then k = k + 1
    Next
  Next
Next
'MsgBox k
  Select Case k
    Case Is = 1
      letters8 = letters8 + 1
    Case Is >= 2
      letters8 = letters8 + 2
  End Select
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.07.2012, 10:30

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Сравнение двух диапазонов по последней строке
Здравствуйте, Проблема такова. Необходимо сравнить значения в последних строках двух диапазонов,...

Сравнение двух диапазонов и вывод различий на другой лист
Добрый день уважаемые форумчане! Нашёл в инете такой вот код: Option Explicit Sub...

Сравнение двух ячеек из разных файлов
Здравствуйте! Есть 2 разных файла, в которых необходимо сравнить столбцы с номерами основных...

Сравнение ячеек в двух разных таблицах
Имеются две очень объемные таблицы на разных листах одной книге , в первой таблице в третьем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.