Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Сравнение двумерных массивов - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Сравнение двумерных массивов
Travelstar Дата: Пятница, 16.05.2014, 09:28 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 21
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Доброго времени суток!
Прошу помощи в написании функции для сравнения двух двумерных массивов размерностью [n, 2].

[vba]
Код

Function Compare(arr1 As Variant, arr2 As Variant)
' массивы типа Variant - хранят диапазоны значений - каждый по 2 столбца
Sheets(1).Activate

      Dim i As Long
      Dim k As Long

      For i = LBound(arr1) To UBound(arr1)
              For k = LBound(arr2) To UBound(arr2)
                      If arr1(i, 1) = arr2(k, 2) Then ' тут сравниваю первую колонку первого массива и вторую колонку второго массива
                          If arr1(i, 2) = arr2(k, 1) Then ' если ввреху всё ОК, то сравниваю вторую колонку первого и первую колонку второго...
                    Cells(i, 2).Interior.Color = 255 ' ну и если совпало - что-то делаю..
                          End If
                      End If
              Next k
      Next i
        
End Function
[/vba]

Данные сравниваются, но почему-то не все.
Подскажите, пожалуйста, в чём я ошибаюсь?


Сообщение отредактировал Travelstar - Пятница, 16.05.2014, 09:29
 
Ответить
СообщениеДоброго времени суток!
Прошу помощи в написании функции для сравнения двух двумерных массивов размерностью [n, 2].

[vba]
Код

Function Compare(arr1 As Variant, arr2 As Variant)
' массивы типа Variant - хранят диапазоны значений - каждый по 2 столбца
Sheets(1).Activate

      Dim i As Long
      Dim k As Long

      For i = LBound(arr1) To UBound(arr1)
              For k = LBound(arr2) To UBound(arr2)
                      If arr1(i, 1) = arr2(k, 2) Then ' тут сравниваю первую колонку первого массива и вторую колонку второго массива
                          If arr1(i, 2) = arr2(k, 1) Then ' если ввреху всё ОК, то сравниваю вторую колонку первого и первую колонку второго...
                    Cells(i, 2).Interior.Color = 255 ' ну и если совпало - что-то делаю..
                          End If
                      End If
              Next k
      Next i
        
End Function
[/vba]

Данные сравниваются, но почему-то не все.
Подскажите, пожалуйста, в чём я ошибаюсь?

Автор - Travelstar
Дата добавления - 16.05.2014 в 09:28
Hugo Дата: Пятница, 16.05.2014, 09:58 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3859
Репутация: 819 ±
Замечаний: 0% ±

365
Почему решили что не все? Думаю все, и даже излишне все - ведь после получения результата сравнения продолжаются...
Вообще со словарём было бы быстрее - ну если строк пара тысяч, то не важно...


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеПочему решили что не все? Думаю все, и даже излишне все - ведь после получения результата сравнения продолжаются...
Вообще со словарём было бы быстрее - ну если строк пара тысяч, то не важно...

Автор - Hugo
Дата добавления - 16.05.2014 в 09:58
Travelstar Дата: Пятница, 16.05.2014, 10:19 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 21
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Вот и по логике, вроде как всё и проверяется...А строк и действительно много... по несколько тысяч в каждом массиве...
А вот факт показывает несколько не тот результат (очень жаль, что не могу сейчас вложить программку...).
В массивы я вгоняю диапазон из разных книг, первый столбец - данные типа String, второй - Date и при проверке, если совпали String-и, то проверяю даты, так вот, при проверке работы алгоритма видно, что не все значения, хоть они и равны, совпадают...
Возможно ли такая ситуация, что в одном из массивов в значениях типа String присутствуют буквы не EN, а RUS? /
 
Ответить
СообщениеВот и по логике, вроде как всё и проверяется...А строк и действительно много... по несколько тысяч в каждом массиве...
А вот факт показывает несколько не тот результат (очень жаль, что не могу сейчас вложить программку...).
В массивы я вгоняю диапазон из разных книг, первый столбец - данные типа String, второй - Date и при проверке, если совпали String-и, то проверяю даты, так вот, при проверке работы алгоритма видно, что не все значения, хоть они и равны, совпадают...
Возможно ли такая ситуация, что в одном из массивов в значениях типа String присутствуют буквы не EN, а RUS? /

Автор - Travelstar
Дата добавления - 16.05.2014 в 10:19
nilem Дата: Пятница, 16.05.2014, 11:45 | Сообщение № 4
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
в значениях типа String присутствуют буквы не EN, а RUS

Редко, но бывает.
Если сравниваете строки, то добавьте Трим (лишние пробелы бываю намного чаще), типа такого
[vba]
Код
If Trim(arr1(i, 1)) = Trim(arr2(k, 2)) Then
[/vba]
и еще , чтобы вести сравнение без учета регистра, в самомо верху модуля
[vba]
Код
Option Compare Text
[/vba]


Яндекс.Деньги 4100159601573
 
Ответить
Сообщение
в значениях типа String присутствуют буквы не EN, а RUS

Редко, но бывает.
Если сравниваете строки, то добавьте Трим (лишние пробелы бываю намного чаще), типа такого
[vba]
Код
If Trim(arr1(i, 1)) = Trim(arr2(k, 2)) Then
[/vba]
и еще , чтобы вести сравнение без учета регистра, в самомо верху модуля
[vba]
Код
Option Compare Text
[/vba]

Автор - nilem
Дата добавления - 16.05.2014 в 11:45
Hugo Дата: Пятница, 16.05.2014, 11:58 | Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3859
Репутация: 819 ±
Замечаний: 0% ±

365
Да и даты там может в секундах отличаются...
Покажите файл - можно неоригинальный :)

Ещё раз столкнулся - два числа совершенно одинаковые всюду глазом (и в Locals тоже) кодом не равны. Но если оба перевести в string - то ОК.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеДа и даты там может в секундах отличаются...
Покажите файл - можно неоригинальный :)

Ещё раз столкнулся - два числа совершенно одинаковые всюду глазом (и в Locals тоже) кодом не равны. Но если оба перевести в string - то ОК.

Автор - Hugo
Дата добавления - 16.05.2014 в 11:58
Travelstar Дата: Пятница, 16.05.2014, 12:19 | Сообщение № 6
Группа: Пользователи
Ранг: Новичок
Сообщений: 21
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Спасибо за подсказки, но не помогло...
Вот несколько файлов
- Checking_Test.xlsm - программа
- Проверяемый файл.xls - то, что будет когда-то проверяться // пока пустой
- Отчёт PCN.xls - файл с которым мне необходимо сравнивать
- Отчёт Sat.xls - файл, который необходимо сравнить с Отчёт PCN

Алгоритм пока пишется, это наработки.
Если будут у кого-нибудь интересные замечания буду признателен.
К сообщению приложен файл: Checking_Test.xlsm (44.5 Kb) · 5306975.xls (74.0 Kb)
 
Ответить
СообщениеСпасибо за подсказки, но не помогло...
Вот несколько файлов
- Checking_Test.xlsm - программа
- Проверяемый файл.xls - то, что будет когда-то проверяться // пока пустой
- Отчёт PCN.xls - файл с которым мне необходимо сравнивать
- Отчёт Sat.xls - файл, который необходимо сравнить с Отчёт PCN

Алгоритм пока пишется, это наработки.
Если будут у кого-нибудь интересные замечания буду признателен.

Автор - Travelstar
Дата добавления - 16.05.2014 в 12:19
Travelstar Дата: Пятница, 16.05.2014, 12:21 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 21
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
и ещё 2 файла

PS: функция называется Compare(arr1 as Variant, arr2 as Variant))
К сообщению приложен файл: _PCN.xls (80.0 Kb) · _Sat.7z (43.5 Kb)


Сообщение отредактировал Travelstar - Пятница, 16.05.2014, 12:31
 
Ответить
Сообщениеи ещё 2 файла

PS: функция называется Compare(arr1 as Variant, arr2 as Variant))

Автор - Travelstar
Дата добавления - 16.05.2014 в 12:21
Hugo Дата: Пятница, 16.05.2014, 12:51 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3859
Репутация: 819 ±
Замечаний: 0% ±

365
Не, я отказываюсь разбираться... :(

Всё так непрозрачно, эта привязка к активной в некий момент книге/листу... Ещё куча MISSING, ну да это меньшее...
Покажите два файла, напишите код открытия этих конкретных файлов, определения диапазонов, передачу диапазонов на сравнение - вот тогда можно посмотреть что где как сравнивается или нет.
Я так и не смог ничего запустить - какие файлы открывать, что нажимать...


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеНе, я отказываюсь разбираться... :(

Всё так непрозрачно, эта привязка к активной в некий момент книге/листу... Ещё куча MISSING, ну да это меньшее...
Покажите два файла, напишите код открытия этих конкретных файлов, определения диапазонов, передачу диапазонов на сравнение - вот тогда можно посмотреть что где как сравнивается или нет.
Я так и не смог ничего запустить - какие файлы открывать, что нажимать...

Автор - Hugo
Дата добавления - 16.05.2014 в 12:51
SkyPro Дата: Пятница, 16.05.2014, 13:53 | Сообщение № 9
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
В месте, где у вас функция сравнения, выведите на лист два массива и покажите их здесь.
Вывести можно вот так:
[vba]
Код
[a1].resize(ubound(имя_массива), 2) = имя_массива
[/vba]


skypro1111@gmail.com
 
Ответить
СообщениеВ месте, где у вас функция сравнения, выведите на лист два массива и покажите их здесь.
Вывести можно вот так:
[vba]
Код
[a1].resize(ubound(имя_массива), 2) = имя_массива
[/vba]

Автор - SkyPro
Дата добавления - 16.05.2014 в 13:53
Travelstar Дата: Пятница, 16.05.2014, 16:08 | Сообщение № 10
Группа: Пользователи
Ранг: Новичок
Сообщений: 21
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Вот и значения массивов
К сообщению приложен файл: 6320135.xlsx (47.5 Kb)
 
Ответить
СообщениеВот и значения массивов

Автор - Travelstar
Дата добавления - 16.05.2014 в 16:08
nilem Дата: Пятница, 16.05.2014, 16:41 | Сообщение № 11
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
например:
[vba]
Код
Sub ertert()
Dim x, i&, s$
x = Range("A1").CurrentRegion.Value
With CreateObject("Scripting.Dictionary")
     .CompareMode = 1
     For i = 2 To UBound(x)
         .Item(x(i, 1) & x(i, 2)) = i
     Next i
     x = Range("D1").CurrentRegion.Value
     For i = 1 To UBound(x)
         s = x(i, 2) & x(i, 1)
         If .Exists(s) Then Cells(.Item(s), 1).Interior.Color = vbGreen
     Next i
End With
End Sub
[/vba]


Яндекс.Деньги 4100159601573
 
Ответить
Сообщениенапример:
[vba]
Код
Sub ertert()
Dim x, i&, s$
x = Range("A1").CurrentRegion.Value
With CreateObject("Scripting.Dictionary")
     .CompareMode = 1
     For i = 2 To UBound(x)
         .Item(x(i, 1) & x(i, 2)) = i
     Next i
     x = Range("D1").CurrentRegion.Value
     For i = 1 To UBound(x)
         s = x(i, 2) & x(i, 1)
         If .Exists(s) Then Cells(.Item(s), 1).Interior.Color = vbGreen
     Next i
End With
End Sub
[/vba]

Автор - nilem
Дата добавления - 16.05.2014 в 16:41
Travelstar Дата: Пятница, 16.05.2014, 16:54 | Сообщение № 12
Группа: Пользователи
Ранг: Новичок
Сообщений: 21
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Благодарю!
Такой подход приемлемый, слегка изменю структуру программы. С таким подходом я могу в принципе отказаться от массивов.
 
Ответить
СообщениеБлагодарю!
Такой подход приемлемый, слегка изменю структуру программы. С таким подходом я могу в принципе отказаться от массивов.

Автор - Travelstar
Дата добавления - 16.05.2014 в 16:54
SkyPro Дата: Пятница, 16.05.2014, 17:14 | Сообщение № 13
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Можно еще SQL запросом.

Использовал класс от Nerv
К сообщению приложен файл: Comparer.xlsm (32.7 Kb)


skypro1111@gmail.com
 
Ответить
СообщениеМожно еще SQL запросом.

Использовал класс от Nerv

Автор - SkyPro
Дата добавления - 16.05.2014 в 17:14
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!