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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2013, 13:32   #1
FoxRiver
Пользователь
 
Регистрация: 28.07.2008
Сообщений: 35
По умолчанию формулу массивов через vba или по другому...

Друзья, необходима помощь в реализации формулы массива через vba. Пример во вложении. Дело в том, что формула массива очень долго считается (пересчитывается). Поэтому хотелось бы рассчитывать таблицу в примере через макрос.

В первом столбце даты платежей которые должны были быть погашены но не были погашены. Во втором столбце суммы платежей которые должны были быть погашены но не погашены. В третьем столбце номера квартир по которым идут соответствующие платежи. Необходимо узнать сумму просроченных платежей по месяцам на сегодня.
Вложения
Тип файла: rar Книга111.rar (42.0 Кб, 13 просмотров)
FoxRiver вне форума Ответить с цитированием
Старый 10.11.2013, 14:37   #2
kalbasiatka
Форумчанин
 
Регистрация: 21.10.2012
Сообщений: 208
По умолчанию

Судя по первым столбцам, вы заранее знаете до какого года кто должен)
kalbasiatka вне форума Ответить с цитированием
Старый 10.11.2013, 14:41   #3
FoxRiver
Пользователь
 
Регистрация: 28.07.2008
Сообщений: 35
По умолчанию

Да именно так.
FoxRiver вне форума Ответить с цитированием
Старый 10.11.2013, 15:37   #4
maksim_serg
Форумчанин
 
Аватар для maksim_serg
 
Регистрация: 25.03.2010
Сообщений: 417
По умолчанию

макросом получиться еще дольше. Проверил
maksim_serg вне форума Ответить с цитированием
Старый 10.11.2013, 15:43   #5
FoxRiver
Пользователь
 
Регистрация: 28.07.2008
Сообщений: 35
По умолчанию

скиньте пож макрос может там можно нижеследующее использовать чтобы ускорить.

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
'ActiveSheet.DisplayPageBreaks = False
Application.DisplayStatusBar = False
'Application.DisplayAlerts = False
FoxRiver вне форума Ответить с цитированием
Старый 10.11.2013, 15:48   #6
maksim_serg
Форумчанин
 
Аватар для maksim_serg
 
Регистрация: 25.03.2010
Сообщений: 417
По умолчанию

Сделано необдуманно, на скорую руку. Эксперементируйте
Вложения
Тип файла: rar Книга111.rar (33.3 Кб, 15 просмотров)
maksim_serg вне форума Ответить с цитированием
Старый 10.11.2013, 16:08   #7
FoxRiver
Пользователь
 
Регистрация: 28.07.2008
Сообщений: 35
По умолчанию

Спасибо большое!
FoxRiver вне форума Ответить с цитированием
Старый 10.11.2013, 16:31   #8
FoxRiver
Пользователь
 
Регистрация: 28.07.2008
Сообщений: 35
По умолчанию

maksim_serg подскажите а можно ли ускорить ваш макрос используя информацию по ссылке: http://habrahabr.ru/post/158725/
FoxRiver вне форума Ответить с цитированием
Старый 10.11.2013, 16:53   #9
maksim_serg
Форумчанин
 
Аватар для maksim_serg
 
Регистрация: 25.03.2010
Сообщений: 417
По умолчанию

Его можно ускорить если уменьшить диапозон в формуле
maksim_serg вне форума Ответить с цитированием
Старый 10.11.2013, 17:17   #10
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Вот такой вариант UDF maksim_serg будет побыстрее раза в 3-4:

Код:
Function Задолжность(Список_дата, _
                     Список_сумма, _
                     Список_квартир, _
                     Квартира As String, _
                     Месяц) As Double
    Dim cell
    Dim D1 As Date
    Dim S1 As Double
    Dim dt As Date
    dt = DateTime.Now
    Список_дата = Список_дата.Value
    Список_квартир = Список_квартир.Value
    Месяц = Месяц.Value
    For Each cell In Список_квартир
        i = i + 1
        If cell = Квартира Then
            D1 = Список_дата(i, 1) - Список_дата(2, 1)
            If D1 < dt Then
                If D1 <> 0 Then
                    If DateTime.Month(D1) = DateTime.Month(Месяц) Then
                        If DateTime.Year(D1) = DateTime.Year(Месяц) Then
                            S1 = S1 + Список_сумма(i, 1) - Список_сумма(2, 1)
                        End If
                    End If
                End If
            End If
        End If
    Next

    Задолжность = S1
End Function

Правда в алгоритм не вникал - просто ускорил:

1,0625
0,84375
0,953125
vs прежний вариант
3,9375
3,53125
3,15625

P.S. Заглянул на habrahabr - ну да, примерно вот так и сделал
webmoney: E265281470651 Z422237915069 R418926282008

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PostMessage или как по другому Laimer64 C# (си шарп) 1 06.01.2013 19:59
как запустить формулу посредством vba johny_03 Microsoft Office Excel 7 24.12.2011 19:36
Не получается написать формулу на VBA Andrey3055 Microsoft Office Excel 0 03.10.2011 10:36
как вставить формулу в vba Ilya_L Microsoft Office Excel 6 18.06.2010 09:10
Делфи. Функция, возвращающая букву системного диска(раздела). Или как ее можно получить по-другому? быдлокодер Помощь студентам 2 08.06.2010 23:26