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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2011, 12:29   #1
uni
Пользователь
 
Регистрация: 05.06.2011
Сообщений: 19
По умолчанию Хитрая группировка средствами VBA

Доброго времени суток форумчане.
На работе подсунули разработку отчета (см. вложение), а я в VBA вообще ничего не знаю. Задача состоит в том, как сгруппировать полученные данные из БД, причем это нужно выполнять скриптом, так как полученное кол-во строк может варьироваться в зависимости от заданного периода.

Вручную получается ерунда, далекая от истины.
Вложения
Тип файла: rar Отчет.rar (22.1 Кб, 29 просмотров)
uni вне форума Ответить с цитированием
Старый 05.06.2011, 13:36   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цитата:
а я в VBA вообще ничего не знаю
а может это и ни к чему?
используйте сводную. сейчас виден отчет по работе точек. в окне настроек сводной, поле "названия строк" перетащите "агента" выше "точки" - тут же получите отчет по работе агентов. Может я чего-то не понимаю, но что еще надо поллучить с этих данных?
Вложения
Тип файла: rar Книга686.rar (21.4 Кб, 14 просмотров)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 05.06.2011, 13:54   #3
uni
Пользователь
 
Регистрация: 05.06.2011
Сообщений: 19
По умолчанию

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

Я пробовал записывать макрос, что бы хотя бы посчитать просто тупо итоги по товару. Но вот беда
Код:
Dim rng As Range
     Dim grp As Range
     Dim i, j, k
     Dim adr As String
     Dim rgColumn As Range
    
     rng = rgColumn.Parent.Cells(Rows.Count, rgColumn.Column).End(xlUp).Value

     Dim n As Long
     n = rng.Row + rng.Rows.Count
     Dim cel As Range
     Set cel = ActiveSheet.Cells(n - 1, 1)
     Dim tx
     tx = cel.Value
     If VarType(tx) = vbEmpty Then
          MsgBox "Выбрана лишняя строка" & vbCr & "Действие остановлено"
          Exit Sub
     End If
     
         rng.Select
    Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(1, 2, 3, 4, 5, _
        6), Replace:=True, PageBreaks:=False, SummaryBelowData:=False
и выпадает ошибка "Object variable or With block variable not set (Error 91) "

Последний раз редактировалось uni; 05.06.2011 в 13:58.
uni вне форума Ответить с цитированием
Старый 05.06.2011, 14:13   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

предположу что вылетает здесь
rng = rgColumn.Parent.Cells(Rows.Count, rgColumn.Column).End(xlUp).Value

потому, что не вижу чтобы rgColumn уже была как-то определена
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 05.06.2011, 14:34   #5
uni
Пользователь
 
Регистрация: 05.06.2011
Сообщений: 19
По умолчанию

Да, Вы правы, а как ее определить? Вроде же

Код:
Dim rgColumn As Range
Или это не то?
uni вне форума Ответить с цитированием
Старый 05.06.2011, 14:45   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

переменная обьявлена, но значение ей не присвоено...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 05.06.2011, 19:11   #7
uni
Пользователь
 
Регистрация: 05.06.2011
Сообщений: 19
По умолчанию

IgorGO

Первоначально это выглядело так

Код:
Function dhLastColUsedCell(rgColumn As Range) As Variant
   ' Вывод значения последней непустой ячейки столбца
   dhLastColUsedCell = rgColumn.Parent.Cells(Rows.Count, _
    rgColumn.Column).End(xlUp).Value
End Function
С функцией как то не получилось. Откуда брать значение для переменной rgColumn я не знаю. Насколько я понимаю, это значение всех строк в столбце, но могу ошибаться.
uni вне форума Ответить с цитированием
Старый 05.06.2011, 23:45   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

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

rgColumn - это должно быть что-то типа range("C:C") - в данном случае 3-я колонка.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 06.06.2011, 07:58   #9
uni
Пользователь
 
Регистрация: 05.06.2011
Сообщений: 19
По умолчанию

Ок, переписал вот так.
Код:
rng = Range("A2").Parent.Cells(Rows.Count, Range("A2").Column).End(xlUp).Value
Однако та же ошибка, суть в том, что мне нужно все не пустые строки выделить в столбце А с определенной строки и сделать "Данные"->"Итоги", но с помощью макроса.
uni вне форума Ответить с цитированием
Старый 06.06.2011, 11:47   #10
uni
Пользователь
 
Регистрация: 05.06.2011
Сообщений: 19
По умолчанию

Нашел вот такой способ.
Код:
rng = Range("A2").CurrentRegion.Rows.Count
Правда не стал определять тип переменной rng, потому что не понимаю какой именно.

Код:
'Dim rng As Range
     Dim grp As Range
     Dim i, j, k
     Dim adr As String
     
     
     rng = Range("A2").CurrentRegion.Rows.Count
     
    Range("A2:F2").Rows(rng).Select
    Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(1, 2, 3, 4, 5, _
        6), Replace:=True, PageBreaks:=False, SummaryBelowData:=False
Подскажите пожалуйста как мне значение rng передать в строку rng.Range.Select? И еще, мне нужно выделить не только столбец А до строки rng, но и столбцы B,C,D,E,F.

Пишет:"Run-time error '1004' Команда не может быть выполнена над указанным диапазоном. Выберите одну ячейку из диапазона и повторите попытку."
Как это обойти?
Вложения
Тип файла: rar покрытие (version 0.1.1).rar (20.7 Кб, 24 просмотров)

Последний раз редактировалось uni; 06.06.2011 в 12:04.
uni вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычисление экспоненты средствами VBA fs444 Microsoft Office Excel 10 30.12.2009 10:42
Заполнение таблицы средствами VBA parsn Microsoft Office Excel 2 28.12.2009 14:05
Неразрывный пробел средствами VBA tolikman Microsoft Office Word 5 23.03.2009 05:11
Сжатие рисунков средствами VBA EducatedFool Microsoft Office Excel 1 17.01.2009 19:12
Условное форматирование средствами VBA Acro Microsoft Office Excel 5 01.12.2008 16:40