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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2011, 19:37   #1
Djeki
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 136
Вопрос Убрать дубликаты и подсчёт суммы по каждому уникальному значению.

Уважаемые знатоки Excel. Помогите пожалуста доработать макрос. Есть на листе "Массив" список фамилий в столбце А, а рядом в столбце В число, напротив каждой фамилии. Фамилии повторяются. На вашем форуме я нашёл макрос, который очень быстро делает список фамилий без повторов (уникальные значения) и выводит его на лист "Выводы". Дальше необходимо по каждой уникальной фамилии посчитать сумму по столбцу В ,с листа "Массив" и записать её на лист "Выводы". Сделал я это с помощью функции Find (поиск). Но у меня эта часть макроса работает очень медленно. Вопрос к Вам : Как ускорить эту часть макроса?? Т.е. во вложенном Excel после появления
MsgBox "Выполнено за " & timeGetTime - d & " милисекунд"
доработать код. Спасибо за ответ..
Djeki вне форума Ответить с цитированием
Старый 31.05.2011, 21:05   #2
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

Он у Вас еще и считает не все.
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728
kuklp вне форума Ответить с цитированием
Старый 31.05.2011, 21:06   #3
nilem
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 616
По умолчанию

Юзаем зеленую стрелку.
Данные сократил - слишком большой файл.
Вложения
Тип файла: zip ДжекиУбрать дубликаты.zip (87.0 Кб, 46 просмотров)
nilem вне форума Ответить с цитированием
Старый 31.05.2011, 21:19   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Я универсальный код для таких задач написал:
http://www.planetaexcel.ru/forum.php?thread_id=26105
Вашу задачу на полном файле делает секунды за полторы.
Просто выделяете два столбца и запускаете по Alt+F8 код из открытого в фоне файла по ссылке.
Результат будет в новой книге.
Результат как у Николая, только общего подсчёта нет - это не универсальная задача
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 31.05.2011 в 21:22.
Hugo121 вне форума Ответить с цитированием
Старый 31.05.2011, 22:07   #5
nilem
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 616
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Я универсальный код для таких задач написал ...
Примерно также хотел сделать, но засомневался с Application.Transpose(oDict.keys). Вдруг там уникальных более 60000? Обрежет.
nilem вне форума Ответить с цитированием
Старый 31.05.2011, 22:42   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Да, спасибо за замечание.
Тогда нужно доделать - сперва переложить без транспонирования в массивы/массив, потом их выгрузить.
Займусь на досуге...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 01.06.2011, 09:04   #7
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Убрал Transpose - сразу набираем данные в массив, который будем выгружать.
Немного изменил по мелочи для ускорения.
42000 строк с 4-мя уникальными обрабатывает за полсекунды.
Код:
Option Explicit

Sub UniqSummUniversal() 'вариант без Transpose - для больших объёмов
'Выделить диапазон, где в первом столбце - неуникальные, в последнем - суммы
Dim a(), b(), oDict As Object, i&, ii&, temp$, x&
Dim ind&
'Dim tm: tm = Timer
a = Selection.Value
ReDim b(1 To UBound(a, 1), 1 To 2)
ind = UBound(a, 2)
Set oDict = CreateObject("Scripting.Dictionary")
oDict.CompareMode = 1
For i = 1 To UBound(a)
    If Not IsEmpty(a(i, ind)) Then
        If IsNumeric(a(i, ind)) Then
        temp = Trim(a(i, 1))
            If Not oDict.Exists(temp) Then
            ii = ii + 1
            b(ii, 1) = temp: b(ii, 2) = a(i, ind)
            oDict.Add temp, CStr(ii)
            Else
            x = oDict.Item(temp)
            b(x, 2) = b(x, 2) + a(i, ind)
            End If
        End If
    End If
Next

On Error Resume Next 'если вдруг ii=0
With Workbooks.Add.Worksheets(1)
.Range("A1:B1").Resize(ii) = b
End With
On Error GoTo 0
'Debug.Print Timer - tm
End Sub
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 01.06.2011, 10:25   #8
Djeki
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 136
Хорошо

Спасибо всем ответившим !! Предложенные варианты работают очень быстро..
Djeki вне форума Ответить с цитированием
Старый 02.06.2011, 08:19   #9
Miguel Sanchez
Пользователь
 
Регистрация: 09.03.2011
Сообщений: 33
По умолчанию

Всем здрасте!
Может не совсем по теме, но все же... Хочется поподробней узнать о принципах работы с коллекцией и, как частного случая- со словарем. В хэлпе справка какая-то замученная. Может кто ссылками поделится?
Miguel Sanchez вне форума Ответить с цитированием
Старый 02.06.2011, 10:11   #10
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Dictionary - это совсем не сложно!
Alex_ST
постарался (описание свойств и методов объектов Dictionary и Collection) :
http://www.excelworld.ru/forum/3-313-1
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 02.06.2011 в 10:15.
Hugo121 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
убрать дубликаты Nasten'ka7 Microsoft Office Excel 1 21.03.2011 18:49
подсчёт суммы, если меняется количество слагаемых kaa1977 Microsoft Office Excel 1 17.03.2011 17:52
окрасить дубликаты Romuald Microsoft Office Excel 5 07.03.2011 16:33