Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2013, 11:54   #1
RTFM
Пользователь
 
Регистрация: 03.10.2013
Сообщений: 22
По умолчанию Удаление одинаковых значений с массива.

Доброго времени суток!
Вопрос следующего типа:
Есть массив данных, в нем выражения типа String, необходимо удалить одинаковые значения, и вернуть полученное в новый массив, или в этот же. Не могу понять как делать, буду благодарен =)
RTFM вне форума Ответить с цитированием
Старый 03.10.2013, 12:04   #2
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

Код:
Sub Main()
    Dim i As Long, j As Long, a(), x:
    Set x = CreateObject("Scripting.Dictionary")
    a = Range("A1:B" & Cells(Rows.Count, 1).End(xlUp).Row).Value
    For i = 1 To UBound(a, 1)
        If x.Exists(a(i, 1)) Then x.Item(a(i, 1)) = x.Item(a(i, 1)) & "; " & a(i, 2) Else x.Add a(i, 1), a(i, 2)
    Next
'Для наглядности, выведем на второй лист:
    Sheets(2).[A1].Resize(x.Count).Value = Application.Transpose(x.Keys)
    Sheets(2).[B1].Resize(x.Count).Value = Application.Transpose(x.Items)
End Sub
спасибо SAS888, за эту чудную выборку,использующую словарь.
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!

Последний раз редактировалось SaLoKiN; 03.10.2013 в 12:07.
SaLoKiN вне форума Ответить с цитированием
Старый 03.10.2013, 12:06   #3
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Создаёте другой массив, куда с помощью словаря (Dictionary) отбираете только нужные строки.
Возможно использовать и исходный массив.
Но вот что такое "удалить одинаковые значения" - требует пояснения.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 03.10.2013, 12:18   #4
RTFM
Пользователь
 
Регистрация: 03.10.2013
Сообщений: 22
По умолчанию

Цитата:
Сообщение от SaLoKiN Посмотреть сообщение
Код:
Sub Main()
    Dim i As Long, j As Long, a(), x:
    Set x = CreateObject("Scripting.Dictionary")
    a = Range("A1:B" & Cells(Rows.Count, 1).End(xlUp).Row).Value
    For i = 1 To UBound(a, 1)
        If x.Exists(a(i, 1)) Then x.Item(a(i, 1)) = x.Item(a(i, 1)) & "; " & a(i, 2) Else x.Add a(i, 1), a(i, 2)
    Next
'Для наглядности, выведем на второй лист:
    Sheets(2).[A1].Resize(x.Count).Value = Application.Transpose(x.Keys)
    Sheets(2).[B1].Resize(x.Count).Value = Application.Transpose(x.Items)
End Sub
спасибо SAS888, за эту чудную выборку,использующую словарь.
Я это гуглил уже, мне не надо для экселя, мне надо просто вернуть из массива в массив, а у вас я не понимаю что происходит, я новичок. массив одномерные, ну типо (0,1,2,3,4) 0=А 1=А 2=В 3=С
RTFM вне форума Ответить с цитированием
Старый 03.10.2013, 12:23   #5
RTFM
Пользователь
 
Регистрация: 03.10.2013
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Создаёте другой массив, куда с помощью словаря (Dictionary) отбираете только нужные строки.
Возможно использовать и исходный массив.
Но вот что такое "удалить одинаковые значения" - требует пояснения.
есть слово - Array (0,1,2,3,4,5,n) в них значения: 0=А 1=А 2=В 3=С 4=С, вот нудно что бы он был урезанный, но без одинаковых значений, типо:
ArraNew (0,1,2) 0=A 1=B 2=C
С Dictionary, я пробовал, что то мне VB выдает нету такого типа кароче оО, пишу вот че: Dim d As New Dictionary, а он говорит нету такого =) есть форма, класс какойто, ну список вылазит.
RTFM вне форума Ответить с цитированием
Старый 03.10.2013, 12:29   #6
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

Цитата:
Я это гуглил уже, мне не надо для экселя,
а теперь дружно смотрим в какой ветке форума мы находимся!!!


великий гугл подсказал
Цитата:
Цикл по элементам массива, в нём вложенный цикл, внутри которого проверяется количество вхождений каждого элемента (на 2 можно прерывать внутренний цикл).
Те, для которых число вхождений не превышает 1, добавляются в коллекцию типа ArrayList. Дальше полученный ArrayList преобразуется в массив int, который и возвращается.
Еще тупой вариант,который пришел в голову случайно
Внешний цикл от 0 до n по i
Внутренний от i+1 до n по j
Если Array(i)=Array(j) тогда Array(j)= " спец символ" который не будет в массиве никогда
Конец Цикла
Конец Цикла
Цикл от 0 до N
Если Array(i) != " спец символ" вывод Array(i)
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!

Последний раз редактировалось SaLoKiN; 03.10.2013 в 12:38.
SaLoKiN вне форума Ответить с цитированием
Старый 03.10.2013, 12:31   #7
RTFM
Пользователь
 
Регистрация: 03.10.2013
Сообщений: 22
По умолчанию

Цитата:
Сообщение от SaLoKiN Посмотреть сообщение
а теперь дружно смотрим что написано в ветке форума!!!
я в курсе, но я не думаю что есть мега разница в выборке элементов массива и удаления из него одинаковых значений, между vba и Vb. Не обязательно всякие ячейки Excel использовать, можно просто с переменными поработать, если есть опыт я думаю не сложно объяснить.

Последний раз редактировалось RTFM; 03.10.2013 в 12:33.
RTFM вне форума Ответить с цитированием
Старый 03.10.2013, 12:42   #8
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

Код,который я скинул предназначен для других целей и здесь он не подходит
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!

Последний раз редактировалось SaLoKiN; 03.10.2013 в 12:53.
SaLoKiN вне форума Ответить с цитированием
Старый 03.10.2013, 12:52   #9
RTFM
Пользователь
 
Регистрация: 03.10.2013
Сообщений: 22
По умолчанию

Во что накалякал:

Set regs_sn = CreateObject("Scripting.Dictionary" )
For i = 1 To UBound(regs_sp)
If regs_sn.Exists(regs_sp(i)) Then regs_sn.Item(regs_sp(i)) = regs_sn.Item(regs_sp(i)) & "; " & regs_sp(i) Else regs_sn.Add regs_sp(i), regs_sp(i)
Next
regs_sn - новая пустая переменная
regs_sp - откуда дёргаю данные, массив

тока как вывести теперь значения? ну типо MsgBox (Cstr(regs_sn.count(1)), так выведет?
RTFM вне форума Ответить с цитированием
Старый 03.10.2013, 12:54   #10
RTFM
Пользователь
 
Регистрация: 03.10.2013
Сообщений: 22
По умолчанию

Цитата:
Сообщение от SaLoKiN Посмотреть сообщение
Отбой,не то скинул
я кстат типо такого писал, что то не вышло нормально =) какой то кривой цикл, хотя может у вас подойдет, попробую как вариант попозже написать.
RTFM вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление одинаковых строк из массива Алексей_2012 Общие вопросы Delphi 10 14.05.2013 09:19
Отброс одинаковых значений ZanderBlack1 Microsoft Office Excel 2 02.02.2011 20:13
Удаление одинаковых символов из массива maxflint Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 09.05.2010 13:18
Замена одинаковых значений Ярик 555 Microsoft Office Excel 6 09.02.2010 04:50
удаление одинаковых элементов из массива sauron99 Общие вопросы Delphi 6 15.04.2009 21:27