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

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

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

Здравствуйте! Подскажите пожалуйста...
Имеется 2 диапазона ячеек А1:A3 и C1:C3, в которых забиты цифры, допустим в ячейках А1:A3 (3,6,2 соответственно), а в C1:C3 (2, 4, 8) и мне необходимо, чтобы при нахождении одинаковых значений выводилось сообщение. Спасибо
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
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
irealife
2 / 2 / 0
Регистрация: 10.05.2012
Сообщений: 45
31.05.2012, 13:37  [ТС] 3
Спасибо, а как сделать чтобы этот же код продолжал работать в след.ячейках например не А1:А3 и С1:С3, а изменил диапазон со сдвигом вправо, т.е. В1:В3 и D1: D3 стало, чтобы не писать его для всех ячеек, а просто со сдвигом вправо? Спасибо
0
Dragokas
Эксперт WindowsАвтор FAQ
17123 / 7178 / 863
Регистрация: 25.12.2011
Сообщений: 10,971
Записей в блоге: 16
01.06.2012, 09:20 4
И сколько таких сдвигов планируется?
0
01.06.2012, 09:20
irealife
2 / 2 / 0
Регистрация: 10.05.2012
Сообщений: 45
01.06.2012, 13:00  [ТС] 5
Примерно 30 сдвигов
0
Dragokas
Эксперт WindowsАвтор FAQ
17123 / 7178 / 863
Регистрация: 25.12.2011
Сообщений: 10,971
Записей в блоге: 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
ikki
призрак
2827 / 884 / 118
Регистрация: 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
irealife
2 / 2 / 0
Регистрация: 10.05.2012
Сообщений: 45
01.06.2012, 22:54  [ТС] 9
Спасибо!
Цитата Сообщение от Diskretor Посмотреть сообщение
Len(a) <> 0
а что значит эта строка?
0
Dragokas
Эксперт WindowsАвтор FAQ
17123 / 7178 / 863
Регистрация: 25.12.2011
Сообщений: 10,971
Записей в блоге: 16
02.06.2012, 05:16 10
Без нее, если попадутся 2 пустые ячейки, начнет писать о совпадении.

У меня они были почти все пустые, поэтому я это дело отключил.
1
irealife
2 / 2 / 0
Регистрация: 10.05.2012
Сообщений: 45
02.06.2012, 08:45  [ТС] 11
Спасибо! Как раз то, что нужно.
0
irealife
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
Dragokas
Эксперт WindowsАвтор FAQ
17123 / 7178 / 863
Регистрация: 25.12.2011
Сообщений: 10,971
Записей в блоге: 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
irealife
2 / 2 / 0
Регистрация: 10.05.2012
Сообщений: 45
07.07.2012, 13:52  [ТС] 14
При выполнении данного кода, у меня при 1 совпадении все правильно происходит, а при больше двух к letters8 прибавляется 5 вместо 2.
0
Dragokas
Эксперт WindowsАвтор FAQ
17123 / 7178 / 863
Регистрация: 25.12.2011
Сообщений: 10,971
Записей в блоге: 16
07.07.2012, 14:09 15
Так здесь добавляется сразу же, как только найдет совпадения в одном смещении.
А Вам нужно, чтобы после просчета всех 150/3 ?

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

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

Добавлено через 13 минут
Последний вопрос по теме: имеется массив значений в excel и выполняется огромный код на строку 3. Необходимо сделать так, чтобы этот же код выполнялся на все заполненные последующие строки в excel. В самом коде было использовано свойство Range с конкретным указанием на ячейки в строке.
0
Dragokas
Эксперт WindowsАвтор FAQ
17123 / 7178 / 863
Регистрация: 25.12.2011
Сообщений: 10,971
Записей в блоге: 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
irealife
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
08.07.2012, 10:30
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2012, 10:30

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

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

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


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

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

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