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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2010, 11:51   #21
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Обрубил массив Range([H2], Cells(d.Count + 1, 10)).Value = arr2 - стало быстрее:

nilem 0.71875 сек.
hugo 0.34375 сек.
sas888 0.5 сек.
nilem 0.703125 сек.
hugo 0.359375 сек.
sas888 0.5 сек.
nilem 0.7226563 сек.
hugo 0.3398438 сек.
sas888 0.5 сек.
nilem 0.7070313 сек.
hugo 0.359375 сек.
sas888 0.5 сек.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 08.09.2010, 11:57   #22
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Убрал сортировку - стало быстрее: 0,36 сек.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 08.09.2010, 12:44   #23
Nicotinni
 
Регистрация: 07.09.2010
Сообщений: 5
По умолчанию

Отлично, ребят!!!!! Все работает... пока что проверил только на 120 тыс... думал около 4 секунд. Но это не столь важно!
Я вам очень и очень благодарен!!!!!!!!!!!!!!!!!!!!!!!!! !! будете в питере, с меня чашка горячего шоколада)

Одно только.... он не считает книги без автора.... вот это не айс. много книг, типа библия, а там автора нет..

Последний раз редактировалось Nicotinni; 08.09.2010 в 12:57.
Nicotinni вне форума Ответить с цитированием
Старый 08.09.2010, 12:59   #24
Nicotinni
 
Регистрация: 07.09.2010
Сообщений: 5
По умолчанию

похрен. сделал заполнение на все -"Неизв.". обойдутся.
Nicotinni вне форума Ответить с цитированием
Старый 08.09.2010, 13:03   #25
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Мой код считает, пока не отсортировано другими кодами . А после сортировки - считает, если в коде заменить строку на
Set rng = Range("A2:C" & Cells(Rows.Count, 2).End(xlUp).Row)
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 08.09.2010 в 13:09.
Hugo121 вне форума Ответить с цитированием
Старый 08.09.2010, 13:20   #26
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Аналогично. Замените в коде строку на
Set y = Range("A2:C" & Cells(Rows.Count, 2).End(xlUp).Row)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 08.09.2010, 13:23   #27
Nicotinni
 
Регистрация: 07.09.2010
Сообщений: 5
По умолчанию

Ну все. Радости моей нет предела... правда чувствую себя теперь инвалидом... сам бы никогда до такого не догадался)
Nicotinni вне форума Ответить с цитированием
Старый 26.04.2011, 15:23   #28
Dosugx
 
Регистрация: 01.10.2009
Сообщений: 5
По умолчанию

Привет всем! Только что недавно делал подобное, но задача немного универсальней:
Из диапазона A1:B2 или C3:XFD1048576 (указываем сами) выбирае одинаковые строки суммируя их колличество, тоесть у нас есть:
'Яблоко' 'красное' 'сладкое'
'Груша ' ' ' ' '
'Яблоко' 'красное' ' '
'Тыква ' 'большая' ' '
'Яблоко' 'красное' 'сладкое'

Получаем:
'Яблоко' 'красное' 'сладкое' '2'
'Груша ' ' ' ' ' '1'
'Яблоко' 'красное' ' ' '1'
'Тыква ' 'большая' ' ' '1'

А вот и код:
Код:
Function SumDuplicates(Table As Range)
    Dim y As Boolean
    Dim overlap As Boolean             'частичное совпадение
    Dim ii As Integer
    Dim rs As Long, rr As Long, TRC As Long 'rows source, rows result, Table.Rows.Count
    Dim cs As Integer, cr As Integer, TCC As Integer 'columns source, columns result, Table.Columns.Count
    Dim sum() As Integer
    Dim temp() As Variant              'table temp
    Dim tr() As Variant                'table result
           
    unique = 1                         'уникальные строки
    TRC = Table.Rows.Count             'возвращает количество строк в диапазоне
    TCC = Table.Columns.Count          'возвращает количество столбцов в диапазоне
    ReDim sum(TRC + 1)
    ReDim temp(1, TCC)
    ReDim tr(TRC + 1, TCC + 1)         'изменение размерности динамического массива
    
    'перебираем диапазон строк
    For rs = 1 To TRC
    'копируем всю строку source в temp
        For cs = 0 To TCC - 1
            temp(0, cs) = Table.Cells(rs, cs + 1).Value
        Next cs
        For rr = 1 To unique           'ищем одинаковые в нашем массиве
            cs = 0
            Do While (tr(rr, cs + 1) = temp(0, cs)) And (cs < TCC)
                cs = cs + 1            'сдвиг вправо по столбцу
            Loop
        
            If cs = TCC Then           'полное совпадение
                sum(rr) = sum(rr) + 1  'если строки одинаковы, добавляем к совпадению 1
                overlap = False        'сбрасываем флаг частичное совпадение
                Exit For               'прервать цикл rr (поиска совпадений)
            Else
                overlap = True         'взводим флаг частичное совпадение (нужно записать строку)
            End If
        Next rr
        If overlap Then                'запись строки в таблицу результата
            For cs = 1 To TCC
                tr(unique, cs) = temp(0, cs - 1)
            Next cs
            unique = unique + 1        'увеличиваем счетчик оригинальных строк
        End If
    Next rs
  
    Sheets.Add                         'добавить лист
    ActiveSheet.Name = "SumDuplicates"            'присвоить текущему листу имя
    For rr = 1 To unique - 1
        For cr = 1 To TCC
            Cells(rr, cr).Value = tr(rr, cr)
        Next cr
        Cells(rr, cr).Value = sum(rr) + 1
    Next rr
    SumDuplicates = TRC
    
End Function

Sub stat()
    Dim i

    i = SumDuplicates(Range("B2:DD1000"))   'здесь задаем наш диапазон

End Sub
Все бы нечего, но у Вас как посмотрел код намного меньше. Да к томуже хочется прикрутить форму что бы задавать имя листа и диапазон.
Dosugx вне форума Ответить с цитированием
Старый 26.04.2011, 16:57   #29
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Пора Вам Dictionary осваивать.
Вот близкий по смыслу код -
Код:
Option Explicit

Sub UniqSummUniversal()
'Выделить диапазон, где в первом столбце - уникальные, в последнем - суммы
Dim a(), oDict As Object, i As Long, temp As String
Dim ind As Long
a = Selection.Value
ind = UBound(a, 2) 
Set oDict = CreateObject("Scripting.Dictionary")
oDict.CompareMode = 1
For i = 1 To UBound(a)
If IsNumeric(a(i, ind)) Then
If Not IsEmpty(a(i, ind)) Then
temp = Trim(a(i, 1))
If Not oDict.Exists(temp) Then
oDict.Add temp, CStr(a(i, ind))
Else
oDict.Item(temp) = CStr(--oDict.Item(temp) + a(i, ind))
End If
End If
End If
Next

On Error Resume Next
With Workbooks.Add.Worksheets(1)
.Range("A1").Resize(oDict.Count) = Application.Transpose(oDict.keys)
.Range("B1").Resize(oDict.Count) = Application.Transpose(oDict.items)
End With
On Error GoTo 0

End Sub
Код универсальный - под Вашу задачу нужно сделать два столбца - в один слить 'Яблоко' 'красное' 'сладкое', в другом протянуть единицы.
Ну или дописать это в код - брать как критерий 3 столбца, считать повторы, а не суммировать суммы.
Хотя код можно чуть сократить, если уж придираться...
P.S. Можно столбцы слить через "|", потом результат разбить по колонкам по этому разделителю.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединение 2-х одинаковых баз данных AlexeiDelejov БД в Delphi 6 24.06.2010 17:55
Поиск данных в нескольких таблицах a_n_n_a БД в Delphi 10 23.04.2010 11:33
Подсчет числа одинаковых слов в нескольких категориях. Hagen83 Microsoft Office Excel 2 13.03.2010 09:45
Найти совпадения данных в 2ух таблицах.?? fifty50 Microsoft Office Excel 14 24.02.2010 17:46
Величина изменения данных текущей даты от предыдущей в сводных таблицах. Strelec79 Microsoft Office Excel 0 05.08.2009 19:20