Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Получить сводную таблицу макросом - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Получить сводную таблицу макросом
tsap Дата: Четверг, 29.05.2014, 18:24 | Сообщение № 1
Группа: Проверенные
Ранг: Участник
Сообщений: 60
Репутация: 6 ±
Замечаний: 0% ±

2013
Добрый день, форумчане!
Совсем зашел в глухой угол >(
Задача следующая (необходимо выполнить в макросе): Есть большой перечень данных из которых необходимо выбрать нужные и "свернуть" их в "сводную таблицу" по следующим условиям: в выбранных данных есть 4 колонки. Если есть совпадения по первой+второй в разных строках, то суммировать третью и четвертую.

Пример:
Параметр1 Параметр2 Сумма1 Сумма2
Вишня ранняя 10 20
Вишня ранняя 10 40
Яблоня средняя 20 20
Яблоня ранняя 10 50
Вишня ранняя 30 10

Необходимо получить:
Параметр1 Параметр2 Сумма1 Сумма2
Вишня ранняя 50 70
Яблоня средняя 20 20
Яблоня ранняя 10 50

Пытался провернуть это дело на циклах и массивах, получается не особо, да и думаю что так не оптимально.
Прошу помощи в подсказке как "наиболее правильно" выполнить оное поделится ссылкой на какой-либо способ аналогичного решения или же дельным советом. Буду премного благодарен

Моя попытка с массивами и циклами:




Сообщение отредактировал tsap - Четверг, 29.05.2014, 20:30
 
Ответить
СообщениеДобрый день, форумчане!
Совсем зашел в глухой угол >(
Задача следующая (необходимо выполнить в макросе): Есть большой перечень данных из которых необходимо выбрать нужные и "свернуть" их в "сводную таблицу" по следующим условиям: в выбранных данных есть 4 колонки. Если есть совпадения по первой+второй в разных строках, то суммировать третью и четвертую.

Пример:
Параметр1 Параметр2 Сумма1 Сумма2
Вишня ранняя 10 20
Вишня ранняя 10 40
Яблоня средняя 20 20
Яблоня ранняя 10 50
Вишня ранняя 30 10

Необходимо получить:
Параметр1 Параметр2 Сумма1 Сумма2
Вишня ранняя 50 70
Яблоня средняя 20 20
Яблоня ранняя 10 50

Пытался провернуть это дело на циклах и массивах, получается не особо, да и думаю что так не оптимально.
Прошу помощи в подсказке как "наиболее правильно" выполнить оное поделится ссылкой на какой-либо способ аналогичного решения или же дельным советом. Буду премного благодарен

Моя попытка с массивами и циклами:

Автор - tsap
Дата добавления - 29.05.2014 в 18:24
RAN Дата: Пятница, 30.05.2014, 10:31 | Сообщение № 2
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
[vba]
Код
Sub Мяу()
     Dim arr, a, ditem, i&
     arr = [a1].CurrentRegion.Value
     With CreateObject("Scripting.Dictionary")
         For i = 1 To UBound(arr)
             If .exists(arr(i, 1) & arr(i, 2)) Then
                 a = .Item(arr(i, 1) & arr(i, 2))
                 a(3) = a(3) + arr(i, 3)
                 a(4) = a(4) + arr(i, 4)
                 .Item(arr(i, 1) & arr(i, 2)) = a
             Else
                 a = Application.Index(arr, i, 0)
                 .Item(arr(i, 1) & arr(i, 2)) = a
             End If
         Next
         ditem = .Items
         ReDim arr(1 To .Count, 1 To 4)
         For i = 1 To UBound(arr)
             arr(i, 1) = ditem(i - 1)(1)
             arr(i, 2) = ditem(i - 1)(2)
             arr(i, 3) = ditem(i - 1)(3)
             arr(i, 4) = ditem(i - 1)(4)
         Next
         [f1].Resize(UBound(arr), 4) = arr
     End With
End Sub
[/vba]


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RAN - Пятница, 30.05.2014, 10:32
 
Ответить
Сообщение[vba]
Код
Sub Мяу()
     Dim arr, a, ditem, i&
     arr = [a1].CurrentRegion.Value
     With CreateObject("Scripting.Dictionary")
         For i = 1 To UBound(arr)
             If .exists(arr(i, 1) & arr(i, 2)) Then
                 a = .Item(arr(i, 1) & arr(i, 2))
                 a(3) = a(3) + arr(i, 3)
                 a(4) = a(4) + arr(i, 4)
                 .Item(arr(i, 1) & arr(i, 2)) = a
             Else
                 a = Application.Index(arr, i, 0)
                 .Item(arr(i, 1) & arr(i, 2)) = a
             End If
         Next
         ditem = .Items
         ReDim arr(1 To .Count, 1 To 4)
         For i = 1 To UBound(arr)
             arr(i, 1) = ditem(i - 1)(1)
             arr(i, 2) = ditem(i - 1)(2)
             arr(i, 3) = ditem(i - 1)(3)
             arr(i, 4) = ditem(i - 1)(4)
         Next
         [f1].Resize(UBound(arr), 4) = arr
     End With
End Sub
[/vba]

Автор - RAN
Дата добавления - 30.05.2014 в 10:31
Rioran Дата: Пятница, 30.05.2014, 10:53 | Сообщение № 3
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
tsap, здравствуйте.

Ran меня немного опередил, но дерзну предложить и моё решение, комментарии по макросу вшиты в код приложенного файла =)
К сообщению приложен файл: Table_Compress.xlsm (20.7 Kb)


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
Сообщениеtsap, здравствуйте.

Ran меня немного опередил, но дерзну предложить и моё решение, комментарии по макросу вшиты в код приложенного файла =)

Автор - Rioran
Дата добавления - 30.05.2014 в 10:53
tsap Дата: Пятница, 30.05.2014, 12:43 | Сообщение № 4
Группа: Проверенные
Ранг: Участник
Сообщений: 60
Репутация: 6 ±
Замечаний: 0% ±

2013
RAN, Rioran, Спасибо вам огромное, друзья, выручили!
Оба кода работают как надо! yahoo
Сам бы фиг додумался =)


 
Ответить
СообщениеRAN, Rioran, Спасибо вам огромное, друзья, выручили!
Оба кода работают как надо! yahoo
Сам бы фиг додумался =)

Автор - tsap
Дата добавления - 30.05.2014 в 12:43
baaur Дата: Вторник, 03.06.2014, 11:09 | Сообщение № 5
Группа: Пользователи
Ранг: Участник
Сообщений: 70
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Добрый день, всем!
Можно узнать,
Rioran, а почему ваш макрос не работает если его скопировать в личную книгу макросов?? А работают только если вставлять как исходный текст!?
Новые листы переименованы соответственно в "Data".


Сообщение отредактировал baaur - Вторник, 03.06.2014, 11:14
 
Ответить
СообщениеДобрый день, всем!
Можно узнать,
Rioran, а почему ваш макрос не работает если его скопировать в личную книгу макросов?? А работают только если вставлять как исходный текст!?
Новые листы переименованы соответственно в "Data".

Автор - baaur
Дата добавления - 03.06.2014 в 11:09
RAN Дата: Вторник, 03.06.2014, 12:01 | Сообщение № 6
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
А ларчик просто открывался. :D
Мой макрос написан так, что работает с любым активным в данный момент листом, а макрос Rioran только с листом Data, причем только той книги, в которой живет.
[vba]
Код
With ThisWorkbook.Sheets("Data")
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеА ларчик просто открывался. :D
Мой макрос написан так, что работает с любым активным в данный момент листом, а макрос Rioran только с листом Data, причем только той книги, в которой живет.
[vba]
Код
With ThisWorkbook.Sheets("Data")
[/vba]

Автор - RAN
Дата добавления - 03.06.2014 в 12:01
baaur Дата: Вторник, 03.06.2014, 12:39 | Сообщение № 7
Группа: Пользователи
Ранг: Участник
Сообщений: 70
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Да да!
А что можно переписать, что так же как ваш везде работал?
With ActiveWorkbook.Sheets
он так тоже не хочет работать
подскажите пожалуйста.
 
Ответить
СообщениеДа да!
А что можно переписать, что так же как ваш везде работал?
With ActiveWorkbook.Sheets
он так тоже не хочет работать
подскажите пожалуйста.

Автор - baaur
Дата добавления - 03.06.2014 в 12:39
Rioran Дата: Вторник, 03.06.2014, 14:56 | Сообщение № 8
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
А что можно переписать, что так же как ваш везде работал?


baaur, Вы были довольно близки к ответу =) Надо было поменять на:

[vba]
Код
With ActiveWorkbook.ActiveSheet
[/vba]

Тогда код будет привязан к открытой используемой книге.


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
Сообщение
А что можно переписать, что так же как ваш везде работал?


baaur, Вы были довольно близки к ответу =) Надо было поменять на:

[vba]
Код
With ActiveWorkbook.ActiveSheet
[/vba]

Тогда код будет привязан к открытой используемой книге.

Автор - Rioran
Дата добавления - 03.06.2014 в 14:56
baaur Дата: Вторник, 03.06.2014, 16:03 | Сообщение № 9
Группа: Пользователи
Ранг: Участник
Сообщений: 70
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Тогда код будет привязан к открытой используемой книге.

Большое спасибо! Адаптировал Ваш макрос под свои нужды работает идеально! clap specool
 
Ответить
Сообщение
Тогда код будет привязан к открытой используемой книге.

Большое спасибо! Адаптировал Ваш макрос под свои нужды работает идеально! clap specool

Автор - baaur
Дата добавления - 03.06.2014 в 16:03
Hugo Дата: Вторник, 03.06.2014, 16:40 | Сообщение № 10
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3854
Репутация: 814 ±
Замечаний: 0% ±

365
baaur, почему выбрали именно этот код? Потому что он выглядит серьёзнее (больше), или потому что понятнее? (хотя раз не работал и не исправили - не понятнее...) Я бы взял тот что побыстрее... :)


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
Сообщениеbaaur, почему выбрали именно этот код? Потому что он выглядит серьёзнее (больше), или потому что понятнее? (хотя раз не работал и не исправили - не понятнее...) Я бы взял тот что побыстрее... :)

Автор - Hugo
Дата добавления - 03.06.2014 в 16:40
baaur Дата: Вторник, 03.06.2014, 22:15 | Сообщение № 11
Группа: Пользователи
Ранг: Участник
Сообщений: 70
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
бы взял тот что побыстрее...

Hugo, я его смог адаптировать под свои нужды, то есть он для меня был более понятен. То что не смог исправить, это для личной книги, а как исходный текст он работал.(у меня пока еще мало знаний).
На счет времени, данные из 12 столбцов и 3400 строк 5-10 секунд - это мне кажется довольно быстро он работает. yes
 
Ответить
Сообщение
бы взял тот что побыстрее...

Hugo, я его смог адаптировать под свои нужды, то есть он для меня был более понятен. То что не смог исправить, это для личной книги, а как исходный текст он работал.(у меня пока еще мало знаний).
На счет времени, данные из 12 столбцов и 3400 строк 5-10 секунд - это мне кажется довольно быстро он работает. yes

Автор - baaur
Дата добавления - 03.06.2014 в 22:15
RAN Дата: Вторник, 03.06.2014, 22:57 | Сообщение № 12
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
А Мяу работает за "Мяу". Длительность произнесения "Мяу" замерьте секундомером. :D


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеА Мяу работает за "Мяу". Длительность произнесения "Мяу" замерьте секундомером. :D

Автор - RAN
Дата добавления - 03.06.2014 в 22:57
baaur Дата: Среда, 04.06.2014, 09:37 | Сообщение № 13
Группа: Пользователи
Ранг: Участник
Сообщений: 70
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
А Мяу работает за "Мяу". Длительность произнесения "Мяу" замерьте секундомером.

Ran, у меня не получается адаптировать ваш макрос под свои нужды,
мне нужно было что бы Параметры 1,2,3,5 если равны то параметр 4 суммировался, то есть
если есть совпадения по первой+второй+третей+пятой в разных строках, то суммировать четвертую.
 
Ответить
Сообщение
А Мяу работает за "Мяу". Длительность произнесения "Мяу" замерьте секундомером.

Ran, у меня не получается адаптировать ваш макрос под свои нужды,
мне нужно было что бы Параметры 1,2,3,5 если равны то параметр 4 суммировался, то есть
если есть совпадения по первой+второй+третей+пятой в разных строках, то суммировать четвертую.

Автор - baaur
Дата добавления - 04.06.2014 в 09:37
PowerBoy Дата: Четверг, 05.06.2014, 07:36 | Сообщение № 14
Группа: Проверенные
Ранг: Участник
Сообщений: 100
Репутация: 31 ±
Замечаний: 0% ±

2003
Запросами все это делается как то проще и понятнее:

[vba]
Код

SELECT  
[Параметр 1],
[Параметр 2],
SUM([Сумма 1]) AS [Сумма 1],
SUM([Сумма 2]) AS [Сумма 2]
FROM  
[Data$]
GROUP BY  
[Параметр 1],
[Параметр 2]
[/vba]


Excel + SQL = ActiveTables (http://vk.com/ExcelSQL)
 
Ответить
СообщениеЗапросами все это делается как то проще и понятнее:

[vba]
Код

SELECT  
[Параметр 1],
[Параметр 2],
SUM([Сумма 1]) AS [Сумма 1],
SUM([Сумма 2]) AS [Сумма 2]
FROM  
[Data$]
GROUP BY  
[Параметр 1],
[Параметр 2]
[/vba]

Автор - PowerBoy
Дата добавления - 05.06.2014 в 07:36
baaur Дата: Четверг, 05.06.2014, 18:38 | Сообщение № 15
Группа: Пользователи
Ранг: Участник
Сообщений: 70
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
"Мяу" замерьте секундомером.

Да вы правы, Мяу работает быстрее!
 
Ответить
Сообщение
"Мяу" замерьте секундомером.

Да вы правы, Мяу работает быстрее!

Автор - baaur
Дата добавления - 05.06.2014 в 18:38
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!