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

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

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

Восстановить пароль

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

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

Анна, попробуйте такой вариант:

Код:
Option Explicit

Sub UniqSumm()

    Dim ilist As Worksheet, rcnt As Long
    Dim a, b, oDict As Object, i&, ii&, temp$, x&
    Dim ind&, r As Range

    For Each ilist In Worksheets
        rcnt = rcnt + ilist.UsedRange.Rows.Count
    Next

    ReDim b(1 To rcnt, 1 To 3)
    Set oDict = CreateObject("Scripting.Dictionary")
    oDict.CompareMode = 1

    For Each ilist In Worksheets
        With ilist
        Set r = Intersect(.UsedRange, .[a:c])
        If Not r Is Nothing Then
            a = r.Value
            ind = UBound(a, 2)
            For i = 1 To UBound(a)
                If Not IsEmpty(a(i, ind)) Then
                    If IsNumeric(a(i, ind)) Then
                        temp = Trim(a(i, 1)) & "|" & Trim(a(i, 2))
                        If Not oDict.Exists(temp) Then
                            ii = ii + 1
                            b(ii, 1) = Trim(a(i, 1)): b(ii, 2) = Trim(a(i, 2)): b(ii, 3) = a(i, ind)
                            oDict.Add temp, CStr(ii)
                        Else
                            x = oDict.Item(temp)
                            b(x, 3) = b(x, 3) + a(i, ind)
                        End If
                    End If
                End If
            Next
            End If
        End With
    Next

    On Error Resume Next    'если вдруг ii=0
    With Workbooks.Add.Worksheets(1)
        .Columns(1).NumberFormat = "@"
        .Range("A1:C1").Resize(ii) = b
    End With
    On Error GoTo 0

End Sub
В общем-то переменная ind в этих конкретных случаях не нужна, её можно заменить на 3, это рудимент универсального кода.
Но я решил оставить - потому, что так проще код менять под задачу - изменили например диапазон, а в коде эта переменная всегда указывает на последний элемент массива (который нужно суммировать), менять не нужно 3 на n при таких изменениях.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 31.08.2011 в 14:05.
Hugo121 вне форума Ответить с цитированием
Старый 31.08.2011, 13:41   #12
АННА-ЕАО
Форумчанин
 
Аватар для АННА-ЕАО
 
Регистрация: 24.08.2011
Сообщений: 193
По умолчанию

Hugo121 БОЛЬШОЕ, БОЛЬШОЕ ВАМ СПАСИБО. Данный код работает в моем файле (с моими данными).
А можно ещё вопросик?
Тот макрас который похож на Результирующий_файл.xls: и в котором я все заменила, что Вы мне сказали у меня работал , но только в файле который был для примера дан изначально, а в моеём файле работать отказывается выделяет мне жёлтым цветом данную строчку:
b(ii, 1) = temp: b(ii, 2) = Trim(a(i, 2)): b(ii, 3) = Trim(a(i, 4)): b(ii, ubb) = a(i, 3). Что не так?
АННА-ЕАО вне форума Ответить с цитированием
Старый 31.08.2011, 13:49   #13
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Я думаю, что проблема в a(i, 4) - если у Вас диапазон не
Код:
[a:d]
, а уже, то такого элемента нет.
Эта строка вероятно так должна быть написана:

b(ii, 1) = Trim(a(i, 1)): b(ii, 2) = Trim(a(i, 2)): b(ii, ubb) = a(i, 3)
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 31.08.2011, 14:41   #14
АННА-ЕАО
Форумчанин
 
Аватар для АННА-ЕАО
 
Регистрация: 24.08.2011
Сообщений: 193
По умолчанию

Hugo121 Да, так код работает, но...
Видимо данный код как то рассчитан толи на количество листов в книге (из который мы хотим взять данные), то ли на то что заполняются только 21 графа. Т.е. если в моем файле только 15 листов с данными, то в результате я получаю таблицу, которая меня устраивает, но после 17 графы по 21 все заполняется такими знаками #Н/Д, это конечно не беда я и удалить их могу, но...
В моем файле 75 листов и в итоге в сводной таблице по данному макросу получается, что заполняется только 21 графа (1-номер, 2- наименование, с 3 по 21 суммы) т.е. данные взялись только с первых 19 листов.
Как можно решить такую проблему?
АННА-ЕАО вне форума Ответить с цитированием
Старый 31.08.2011, 15:01   #15
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Проблему всегда можно решить...
Чуть прокомментирую.

'определяем массив высотой с сумму количества строк ранее просмотренных листов
ReDim b(1 To rcnt, 1 To 3)

'определяем, использованы ли вообще выбранные столбцы, определяем нужный диапазон
Set r = Intersect(.UsedRange, .[a:c])
'если использовались
If Not r Is Nothing Then
'данные в массив
a = r.Value
ind = UBound(a, 2)
For i = 1 To UBound(a)
'если есть что суммировать
If Not IsEmpty(a(i, ind)) Then
'если это цифра, а не буквы
If IsNumeric(a(i, ind)) Then

...
...
'выгружаем с первой строки по число использованных строк массива
.Range("A1:C1").Resize(ii) = b


Если у Вас #Н/Д, то это значит, что переменная ii имеет не то значение (больше нужного), или массив меньше, чем Вы задали выгрузку.
В общем, желательно видеть пример файла.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 31.08.2011, 15:15   #16
АННА-ЕАО
Форумчанин
 
Аватар для АННА-ЕАО
 
Регистрация: 24.08.2011
Сообщений: 193
По умолчанию

Вот файлы для примера .
Вложения
Тип файла: rar Для примера.rar (243.2 Кб, 12 просмотров)
АННА-ЕАО вне форума Ответить с цитированием
Старый 31.08.2011, 16:32   #17
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Да, была моя ошибка - выгрузка была нединамическая
Вот тут: .Range("A1:C1").Resize или .Range("A1:U1").Resize...

Код:
Option Explicit


Sub UniqSumm()
    Dim ilist As Worksheet, rcnt As Long, scnt As Long, ubb As Long, ash As Long
    Dim a, b, oDict As Object, i&, ii&, temp$, x&
    Dim r As Range

    For Each ilist In Worksheets
        With ilist
            Set r = Intersect(.UsedRange, .[a:c])
        End With
        If Not r Is Nothing Then
        scnt = scnt + 1
        rcnt = rcnt + ilist.UsedRange.Rows.Count
        End If
    Next

    ubb = scnt + 3
    ReDim b(1 To rcnt + 1, 1 To ubb)
    b(1, 1) = "PART N"
    b(1, 2) = "Description"
    b(1, ubb) = "ВСЕГО"
    
    Set oDict = CreateObject("Scripting.Dictionary")
    oDict.CompareMode = 1
    ii = 1: ash = 2
    For Each ilist In Worksheets
        With ilist
        Set r = Intersect(.UsedRange, .[a:c])
        If Not r Is Nothing Then
            a = r.Value
            ash = ash + 1
            b(1, ash) = .Name
            For i = 1 To UBound(a)
                If Not IsEmpty(a(i, 3)) Then
                    If IsNumeric(a(i, 3)) Then
                        temp = Trim(a(i, 1)) & "|" & Trim(a(i, 2))
                        If Not oDict.Exists(temp) Then
                            ii = ii + 1
                            b(ii, ash) = a(i, 3)
                            b(ii, 1) = Trim(a(i, 1)): b(ii, 2) = Trim(a(i, 2)): b(ii, ubb) = a(i, 3)
                            oDict.Add temp, CStr(ii)
                        Else
                            x = oDict.Item(temp)
                            b(x, ash) = a(i, 3)
                            b(x, ubb) = b(x, ubb) + a(i, 3)
                        End If
                    End If
                End If
            Next
            End If
        End With
    Next

    On Error Resume Next    'если вдруг ii=0
    With Workbooks.Add.Worksheets(1)
        .Columns(1).NumberFormat = "@"
        .Range(.[A1], .Cells(1, ubb)).Resize(ii) = b
        .UsedRange.EntireColumn.AutoFit
    End With
    On Error GoTo 0
End Sub
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 31.08.2011 в 16:54.
Hugo121 вне форума Ответить с цитированием
Старый 31.08.2011, 16:54   #18
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Код выше слегка изменил - так правильнее.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 31.08.2011, 17:01   #19
АННА-ЕАО
Форумчанин
 
Аватар для АННА-ЕАО
 
Регистрация: 24.08.2011
Сообщений: 193
По умолчанию

Hugo121 ОГРОМНОЕ, ОГРОМНОЕ ВАМ СПАСИБО Все получилось.
Буду работать, пользоваться и вспоминать Вас добрым словом. Спасибо.
АННА-ЕАО вне форума Ответить с цитированием
Старый 31.08.2011, 17:35   #20
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

На здоровье

Кстати, если "Буду работать, пользоваться", то удобнее этот код держать в отдельном файле.

1. Открыть этот файл
2. Открыть анализируемый файл.
3. По Alt+F8 выбрать макрос UniqSumm из ЭТОГО файла.
Вложения
Тип файла: zip Анна_Для примера 1 ЛИСТ.zip (15.4 Кб, 15 просмотров)
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос Сводной Таблиц для всех листов Richard123 Microsoft Office Excel 4 21.01.2011 12:53
Классический макет сводной таблицы. Макрос. Serge 007 Microsoft Office Excel 1 05.01.2011 14:30
Макрос создания таблицы в MS Word 2007 kotkuban Microsoft Office Word 8 20.07.2010 20:37
Макрос для сводной таблицы kipish_lp Microsoft Office Excel 2 21.04.2010 10:58
Макрос создания таблицы в ворде по шаблону. opengeimer Microsoft Office Word 14 02.02.2009 11:41