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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 30.09.2013, 11:05   #41
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Если исходный массив отсортирован, то можно обойтись без словаря, используя один цикл. Так, например, пусть исходные данные находятся в столбцах "A:B" активного листа. И, пусть полученный массив требуется поместить в столбец "A" второго листа. Можно так:
Код:
Sub qq()
    Dim i As Long, j As Long, a(), b(): Application.ScreenUpdating = False
    a = Range("A1:B" & Cells(Rows.Count, 1).End(xlUp).Row).Value
    ReDim b(1 To UBound(a, 1), 1 To 1): b(1, 1) = a(1, 2): j = 1
    For i = 2 To UBound(a, 1)
        If a(i, 1) = a(i - 1, 1) Then
            b(j, 1) = b(j, 1) & "; " & a(i, 2)
        Else
            j = j + 1: b(j, 1) = a(i, 2)
        End If
    Next
    Sheets(2).[A1].Resize(UBound(b, 1)).Value = b
End Sub
Единственный минус в том, что итоговый массив будет "длиннее", чем количество действительных значений. Критично это, или нет - зависит от конкретного применения.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 30.09.2013, 11:10   #42
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

Цитата:
Serge_Bliznykov
результат склейки нужно получить в новом массиве(размерностью nx2) назовем его Strok(i,j), где i элемент -уникальное значение,а j- есть склейка всех элементов подходящих по условию. Будет супер круто, если это можно делать в неотсортированном массиве.
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!
SaLoKiN вне форума
Старый 30.09.2013, 11:16   #43
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

Цитата:
Единственный минус в том, что итоговый массив будет "длиннее", чем количество действительных значений. Критично это, или нет - зависит от конкретного применения
А разве при условии что каждая строка будет иметь одно уникальное значение, длинна итогового массива не будет равна длиннее исходного? по мне самый длинный вариант итогового. При UBound(a, 1) >=2
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!
SaLoKiN вне форума
Старый 30.09.2013, 11:19   #44
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Почему нужен именно новый массив, почему нельзя держать результат в словаре?

Хотя конечно нет проблем в цикле перекинуть, но зачем?

P.S. Можно и сразу собирать строку в новом массиве, а в словаре хранить только ключи и индекс строк - но тогда массив нужно создать с запасом, если заботится о скорости работы (если плевать, то можно "редимпресервить и транспозить", но так никогда не пишу и из лени в том числе - код огроменный и путанный получается...)
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 30.09.2013 в 11:23.
Hugo121 вне форума
Старый 30.09.2013, 11:26   #45
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

Цитата:
Почему нужен именно новый массив, почему нельзя держать результат в словаре?
я не совсем тогда понимаю алгоритм работы...
Т.е. можно создать словарь уникальных значений и потом по циклу добить строку склейки к этому уникальному значению? Если так возможно,то тогда можно отказаться от нового массива.

ваш P.S. меня запутал x__X
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!
SaLoKiN вне форума
Старый 30.09.2013, 11:29   #46
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Полностью согласен с Hugo121
Например:
Код:
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 вне форума
Старый 30.09.2013, 11:50   #47
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

По P.S.
Словарь можно представить себе как массив в два столбца (только два), где в одном ключи, во втором значения. Доступ к значению по ключу.
Но значением может быть почти что угодно - и массив тоже. Но в таком случае доступ к содержимому этого массива несколько муторный.
Поэтому если нужно к одному ключу привязать несколько значений, то можно создать параллельный массив на сколько нужно столбцов, и хранить значения в нём, а в словаре только ключ и индекс этого массива.
И доступ к любому элементу этого масcива удобнен и быстр - по ключу взяли индекс, по индексу "роемся" в массиве.

В данной задаче связанный массив не обязателен - но если например цель всего это выгрузить собранное в два столбца на лист, а значений планируется больше 65536 - то есть смысл собирать сразу в удобный для выгрузки массив. Чтоб не споткнуться на медленной Application.Transpose()
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума
Старый 30.09.2013, 12:07   #48
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

Спасибо, то что нужно! Одной проблемой меньше =) Сейчас допилю, есть еще вопросы у меня=(

P.S.
Цитата:
По P.S.
Разжевали-понял ;-)
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!

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

Кстати ещё применим такой вариант (использовал несколько раз) - если к одному ключу нужно привязать несколько разных значений (например сумму веса и сумму количества), то можно сделать два словаря. Один для веса, другой для количества.
Простой код.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума
Старый 30.09.2013, 12:21   #50
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

И снова я уперся в пень... результат сборки нужно помещать на лист с уже имеющимися данными, но проблема в том что скажем словарь содержит уникальные значения с номерами 1,2,3,5 и не содержит 4. А на листе результатов стоят все порядковые номера,тогда при выгрузке на лист он выгрузит в 4 значения 5ки и все поплывет. Чтобы не поплыло,нужна проверка значения словаря со значением на листе, а как обратиться к определенной строке словаря не знаю
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!
SaLoKiN вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Qt] Вылет при изменении параметров QTableWidgetItem WarAngel-alk Qt и кроссплатформенное программирование С/С++ 4 31.01.2013 17:58
вылет программы при выводе простого числа (cout) Ciberal Общие вопросы C/C++ 7 27.09.2011 01:51
Вылет программы после завершение kloffelin Общие вопросы C/C++ 3 17.04.2010 20:18
Ошибка при использовании copyfile The Best Общие вопросы Delphi 20 22.07.2009 13:26
Проблемка при использовании регрессии 500_pinguins Microsoft Office Excel 0 16.06.2009 08:17