Страницы: 1
RSS
Поясните пожалуйста действия ("Scripting.Dictionary")
 
Доброго времени суток. Если кто разбирается в словарях ("Scripting.Dictionary"), поясните пожалуйста. Есть макрос (ниже в текстовом файле).  
Если не сложно поясните, как правильно читать каждую строчку. Сейчас этот макрос выводит мне все идентичные значения обоих диапазонов. Я хочу его переделать на: Выводить диапазон "a", за исключением тех значений из "a", которые повторяются в "b". Но для того чтобы это сделать надо ПОНЯТЬ процесс.    
Поясните пожалуйста.
 
Вот, вложил его в отдельный файл.
 
Почитайте, если всё равно не поймёте - пишите
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
я бы так сделал...  
Sub test()  
Dim oWbk_T As Workbook, llastr&  
   Dim a(), b(), i&, ii&   'Создаём переменные  
 
   Set oWbk_T = ThisWorkbook  
 
   With oWbk_T.Sheets(1)    'В исходном файле  
       llastr = .Range("A" & .Rows.Count).End(xlUp).Row   'Номер последней строки в столбце "A"  
       a = .Range(.[A3], .Range("A" & llastr)).Value 'Что ищем: (A3:A103 )диапазон
       b = .Range(.[D3], .Range("F" & .Rows.Count).End(xlUp)).Value 'Где ищем: (D3:F27 )диапазон
   End With  
    With CreateObject("Scripting.Dictionary")  
           For i = 1 To UBound(b)   ' For i = 1 to 22  
               .Item(b(i, 1)) = i   'Заносим все значения в словарь  
           Next  
             For i = 1 To UBound(a)   ' For i = 1 to 22  
              If Not .exists(a(i, 1)) Then ' проверяем если этого значения нет в словаре, то перезаписываем массив а  
              ii = ii + 1  
              a(ii, 1) = a(i, 1)  
              End If  
           Next  
   End With  
           With oWbk_T.Sheets(1)  
           .[K3].Resize(ii) = a 'Вывод данных в столбец "K", начиная со 3-ей ячейки.
           End With  
End Sub
Спасибо
 
b = .Range(.[D3], .Range("D" & .Rows.Count).End(xlUp)).Value
"D" у Вас "F" надо исправить в коде.
Спасибо
 
LightZ - Спасибо за инфу, сижу изучаю. Инфа ЦЕННАЯ. Мало что в сети можно найти по этой теме, тем более на русском с примерами.    
R Dmitry - прошу прощения, я двусмысленно объяснил задачу. Я хотел выводить диапазон "a", за исключением тех значений из "a", которые равны значениям в "b". (Т.е. за исключением значений использованных и в "a" и в "b")  
 
Из моего макроса мне как-бы весь основной процесс понятен. Смущают только строчки    
                   If .exists(a(i, 1)) Then  
                       ii = .Item(a(i, 1))  
                       c(i, 1) = b(ii, 1)  
если будет время, поясните дураку как каждую из них читать.
 
там ошибка - у коллекции нет метода clear юзаю свой класс и не заморачиваюсь )   
http://www.excelworld.ru/forum/3-2045-1  
в планах - подправить метод ToArray, чтобы вложенные коллекции / массивы раскрывал
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
гм :)  
честно говоря - по коллекциям и не смотрел, встроенной справки достаточно.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Я всё прочёл, что-то понял, что-то нет. Тема непростая.  
Т.к. хочу выводить диапазон "a", за исключением значений использованных и в "a" и в "b", сделал так:  
1)Собрал КЛЮЧИ "b" в Словарь.  
2)Задал: Если КЛЮЧЕЙ "а" в Словаре не существует То  
3)Добавить их в Словарь и задать их ЗНАЧЕНИЯ как "ii"  
4)Обозначил "c" как все значения из диапазона "а", которых нет в диапазоне "b".  
 
Выдаёт ошибку. Подскажите как побороть железяку ?
 
Вот сам файл.  
 
<EM><STRONG>Файл удален</STRONG> - велик размер - [<STRONG>МОДЕРАТОРЫ</STRONG>]</EM>  
 
<EM>http://www.planetaexcel.ru/forum.php?thread_id=8735</EM>
 
Вот сам файл.
 
проверьте  
 
If Not .exists(a(i, 1)) Then  
 .Item(a(i, 1)) = i  
 ii = ii + 1  
 c(ii, 1) = a(i, 1)  
End If
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Sub test()  
Dim oWbk_T As Workbook, llastr&  
Dim a(), b(), i&, ii& 'Создаём переменные  
set dict=CreateObject("Scripting.Dictionary")  
Set oWbk_T = ThisWorkbook  
 
With oWbk_T.Sheets(1) 'В исходном файле  
llastr = .Range("A" & .Rows.Count).End(xlUp).Row 'Номер последней строки в столбце "A"  
a = .Range(.[A3], .Range("A" & llastr)).Value 'Что ищем: (A3:A103 )диапазон
b = .Range(.[D3], .Range("F" & .Rows.Count).End(xlUp)).Value 'Где ищем: (D3:F27 )диапазон
End With  
With CreateObject("Scripting.Dictionary")  
For i = 1 To UBound(b) ' For i = 1 to 22  
.Item(b(i, 1)) = i 'Заносим все значения в словарь  
Next  
For i = 1 To UBound(a) ' For i = 1 to 22  
If Not .exists(a(i, 1)) Then ' проверяем если этого значения нет в словаре, то перезаписываем массив а  
If Not dict.exists(a(i, 1)) then  
ii = ii + 1  
a(ii, 1) = a(i, 1)  
End If  
end if  
Next  
End With  
With oWbk_T.Sheets(1)  
.[K3].Resize(ii) = a 'Вывод данных в столбец "K", начиная со 3-ей ячейки.
End With  
End Sub
Спасибо
 
{quote}{login=nerv}{date=28.07.2012 03:56}{thema=}{post}юзаю свой класс и не заморачиваюсь )  
{/post}{/quote}Привет Саш, классную вещь сделал, а можешь настройку склепать? ;)
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
>а можешь настройку склепать? ;)  
Привет. Что?
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Надстройку*
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
R Dmitry - Попробовал, но он выдал мне не то что нужно. Данных должно быть гораздо меньше. Но всё равно спасибо, что стараетесь помочь.  
ikki - Большое Спасибо, прямо в точку ! Всё работает как надо, сижу анализирую, чтобы овладеть принципом.    
 
Спасибо всем тем, кто старался помочь и всем, кто просто общался с друзьями в моей теме. Всегда приятно посидеть в хорошей компании :) :) :)  
 
Хорошего дня !
 
В данном случае проще расширенным фильтром:  
 
Sub bb()  
Dim rCrit As Range  
Set rCrit = Cells.SpecialCells(xlCellTypeLastCell).Offset(2).Resize(2, 2)  
[A2].Copy [K2]
rCrit(1).Value = [A2]
rCrit(2, 2).Formula = "=ISNA(MATCH(A3,$D$4:$D$999,))"  
[A2].CurrentRegion.AdvancedFilter xlFilterCopy, rCrit, [K2]
rCrit.Clear  
End Sub
 
{quote}{login=LightZ}{date=28.07.2012 10:08}{thema=}{post}Надстройку*{/post}{/quote}Зачем? Файд .cls перетащи в проект и все )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
пропустил одну строку :(...  
........  
If Not dict.exists(a(i, 1)) then  
dict.add a(i,1),i  
............
Спасибо
 
{quote}{login=R Dmitry}{date=28.07.2012 12:50}{thema=}{post}я бы так сделал...{/post}{/quote}  
Приношу свои извинения R Dmitry, начал записывать макросы, понял что Вами предложенный макрос был ничуть не хуже.
Страницы: 1
Читают тему
Наверх