Страницы: 1
RSS
Сравнение двух столбцов (массив)
 
Добрый день, форумчане! Прошу Вас оказать помощь в решении следующей задачи (на форуме необходимый вариант решения не нашел): есть два столбца с данными на разных листах. Необходимо сравнить два столбца друг с другом и в случае, если есть число, которое присутствует только в одном из 2-х столбцов, вывести это число на Лист3.
Есть файл, в котором есть начало программы - необходимо грамотное завершение (ВАЖНО - завершение именно данного варианта с помощью массива и без использования справочника).

Спасибо.
 
Цитата
Ashas пишет:
без использования справочника
почему?

пс. посмотрел файл - стало ещё смешнее. там используются (вернее. производится попытка использования) две коллекции.
что вы подразумеваете под словом "справочник"?
Изменено: ikki - 09.03.2013 21:42:17
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
Ashas пишет:
на форуме необходимый вариант решения не нашел
А подобных вопросов (с решениями) была целая куча...
 
Цитата
Ashas пишет:  грамотное завершение именно данного варианта
могу вас огорчить - данный вариант УЖЕ начат безграмотно.
включение обработчика ошибок внутри цикла без его отключения где бы то ни было - как минимум бессмысленно и излишне затратно для интерпретатора. хотя, в данном случае, и не чревато ошибками.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
:), если убрать двойное декларирование, объявить переменную x ( это обязательно нужно сделать, без этого не поедешь), то есть вероятность что в последний цикл Вы попадете.
А уже там где у вас  вопросы, необходимо написать код который все сделает, найдет данные, сравнит их и выведет на лист.
---------------
как то так, если по доброму.
Спасибо
 
Решился помочь - ну, думаю, раз в макросе грамотное начало, - ну и доделать макрос несложно будет.

Фиг там - пока все ошибки нашел и исправил, полчаса прошло.
«С нуля» было бы написать в несколько раз быстрее.

Так что, думаю, мое решение не подойдёт
(раз задача была не сделать макрос, а дополнить кривой код)

Но все же выложу свой вариант:

Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Private Sub CommandButton1_Click()
    Dim Uniq As New Collection, Uniq1 As New Collection, Item, _
        LastRow As Long, LastRow1 As Long, a As Long, b As Long, c As Long, Arr(), Arr1()
 
    On Error Resume Next
    Application.ScreenUpdating = False
 
     
    LastRow = Лист1.Cells(Лист1.Rows.Count, 2).End(xlUp).Row
    Arr = Лист1.Range(Лист1.Cells(3, 2), Лист1.Cells(LastRow, 2)).Value
    For a = 1 To UBound(Arr)
        Uniq.Add Arr(a, 1), CStr(Arr(a, 1))
    Next
 
    LastRow1 = Лист2.Cells(Лист2.Rows.Count, 3).End(xlUp).Row
    Arr1 = Лист2.Range(Лист2.Cells(4, 3), Лист2.Cells(LastRow1, 3)).Value
    For b = 1 To UBound(Arr1)
        Err.Clear: Uniq.Add Arr1(b, 1), CStr(Arr1(b, 1))
        If Err Then Uniq1.Add Arr1(b, 1), CStr(Arr1(b, 1))
    Next
 
    For Each Item In Uniq
        Err.Clear: Uniq1.Add Item, CStr(Item)
        If Err = 0 Then Лист3.Range("A" & Лист3.Rows.Count).End(xlUp).Offset(1) = Item
    Next
 
End Sub
 
Спасибо за комментарии и за предложенный вариант.
 
Нельзя ли объяснить смысл:
       Err.Clear: Uniq.Add Arr1(b, 1), CStr(Arr1(b, 1))
       If Err Then Uniq1.Add Arr1(b, 1), CStr(Arr1(b, 1))
И прошу прощение за тривиальный вопрос (мало опыта), а зачем Err.Clear: Uniq.Add Arr1(b, 1), CStr(Arr1(b, 1)) (я так понимаю, при возникновении ошибки происходит очищение). Почему нельзя сразу указать Uniq1.Add Arr1(b, 1), CStr(Arr1(b, 1)). Мы же объявили две коллекции.
 
Этот код помещает ПОВТОРЯЮЩИЕСЯ записи в коллекцию Uniq1

Чтобы определить, повторяющаяся она или нет, мы пытается добавить запись в Uniq
(если она там уже есть - возникает ошибка, мы проверяем возникла ли ошибка(If Err Then), и если да, - заносим запись в Uniq1 - колекцию для повторяющихся значений)

Err.Clear нужно для сброса ошибки, которая могла возникнуть на предыдущем действии внутри цикла.
Страницы: 1
Читают тему
Наверх
Loading...