Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Bootstrap Ускорение алгоритма, Ускорить алгоритм обработки больших случаных выборок
 
Здравствуйте.
Тестирую метод бутстрапа на примере продаж товаров.
В общем что хочу получить на выходе:
У меня есть массив продаж за определенный период (Сейчас около 1500 товаров). Есть еще массив остатков на складе.
Я хочу взять каждый товар, вычленить массив продаж, но только с условием что товар был на складе (там еще есть  пара условий, но не суть), далее сгенерировать 10000 недель случайных продаж товара на основе существующей истории.
Во всей этой ситуации есть проблема: скорость обработки и генерации 10000 (хотя бы) строк по 1500 товарам занимает почему то огромное количество времени (10 сек на 1 товар).

Если кто то сталкивался с задачей, может есть методы ускорить код. Привожу код ниже с комментариями.
Код
    Dim mBootS() As Variant 'Результирующий массив с распределением (перезаписывается для каждого товара)
    Dim mViborkaProd() As Variant 'массив продаж по товару(перезаписывается для каждого товара)
    Dim mBootSViv() 'Этот массив содержит результаты нужных мне процентилей
    ReDim mBootSViv(1 To lRowBase - 1, 1 To 8)

    
    For i = 1 To lRowBase - 1 '(от 1 до 1500 товаров)
        If mBaseFull(i, 8) <> 0 And mBaseFull(i, 8) <> "" Then 'Это ограничение на некоторые виды товаров, которые не имеет смысла обрабатывать (снятые с продаж и т.д.)

            l = 0
            ReDim mViborkaProd(1 To 1)
            For j = 1 To KolDay 'от первого дня периода продаж до последнего
                If mOstDay(i, j) <> "Missing" And mOstDay(i, j) <> 0 And mOstDayPometki(i, j) <> "Days off" Then 'Еще одно ограничение на товары (Не было в продаже, не работал магазин и т.д.)
                    l = l + 1
                    ReDim Preserve mViborkaProd(1 To l)
                    mViborkaProd(l) = Abs(mProdDay(i, j)) 'Где ProdDay(i, j) - это массив продаж
                End If
            Next j

            ReDim mBootS(1 To 10001)
            Randomize 'Не уверен что правильно использую данную функцию
            For k = 1 To 10001
                For j = 1 To 7
                    mBootS(k) = mBootS(k) + mViborkaProd(Int((l * Rnd) + 1)) 'сумма сгенерированных продаж за неделю (сами дни не нужно хранить, интересует только сумм)
                Next j
            Next k
           
            SortArray mBootS, True 'Сортирую массив
          'Извлекаю только интересующие меня процентили во всем распределении, остальное потом будет перезаписано
            mBootSViv(i, 1) = mBase(i, 1) '
            mBootSViv(i, 2) = mBootS(1000) 'Мин
            mBootSViv(i, 3) = mBootS(750) '25%
            mBootSViv(i, 4) = mBootS(500) '50%
            mBootSViv(i, 5) = mBootS(200) '80%
            mBootSViv(i, 6) = mBootS(100) '90%
            mBootSViv(i, 7) = mBootS(50) '95%
            mBootSViv(i, 8) = mBootS(1) '100%

        End If
    Next i
 
Поиск решения линейных задач симплекс-методом, Аналоги
 
Здравствуйте.

Интересует задача оптимизации с помощью надстройки "Поиск решения линейных задач симплекс-методом".
В ней есть одна большая проблема - ограничения условий 200 штук. Мне необходимо на 3000 условий (Оптимизация товаров).
Если кто сталкивался, можно ли преодолеть его с помощью VBA или другой (аналогичной) надстройки?
Растянуть формулу массива через VBA, Варианты растягивая формулы массива средствами VBA
 
Здравствуйте. Возникла, казалось бы простая задача, растянуть формулу массива до конца последней строки, но по какой то причине это не выходит. Делал так.
В Range("P2: Последняя строка / столбец") у меня имеются формулы ({массивы}).
Я прочитал на форумах, что за вставку массивов отвечает не formula / formular1c1, а FormulaArray.
Растягивать нужно в "P3: последняя строка/столбец"
Код
'Нахожу последний столбец / строку:
lColumnsCnt = wSh_Base_Sales.Cells(1, wSh_Base_Sales.Columns.Count).End(xlToLeft).Column
lLastRow_Prod_Un_C = wSh_Base_Sales.Cells(Rows.Count, 13).End(xlUp).Row


With wSh_Base_Sales
'Копирую формулы в весь диапозон
.Range(.Cells(3, 16), .Cells(lLastRow_Prod_Un_C, lColumnsCnt)).Formula = .Range(.Cells(2, 16), .Cells(2, lColumnsCnt)).Formula
For i = 16 To lColumnsCnt
'Преобразую формулы в массивы
.Range(.Cells(3, i), .Cells(lLastRow_Prod_Un_C, i)).FormulaArray = .Range(.Cells(3, i), .Cells(lLastRow_Prod_Un_C, i)).Formula
Next i
.Calculate
End With
Вся это конструкция не работает. Я не понимаю почему, особенно если учитывать что
Код
wSh_Base_Sales.Range("P3:Q" & lLastRow_Prod_Un_C).Formula = wSh_Base_Sales.Range("P2:Q2").Formula
wSh_Base_Sales.Range("P3:P" & lLastRow_Prod_Un_C).FormulaArray = wSh_Base_Sales.Range("P3:P" & lLastRow_Prod_Un_C).FormulaR1C1
wSh_Base_Sales.Range("Q3:Q" & lLastRow_Prod_Un_C).FormulaArray = wSh_Base_Sales.Range("Q3:Q" & lLastRow_Prod_Un_C).FormulaR1C1
работает без проблем
Ситуация с Range("A1:A2") и Range(Cells (1,1), Cells(1,2)) должна быть одинаковой (так везде в примерах приведено), но у меня это не работает и всегда выдает ошибку.
Изменено: Mirai - 24.10.2016 02:02:42
Добавление нолей перед числом и сохранение его как текста VBA, Преобразовать массив чисел в текст, добавив нужное количество нолей
 
Здравствуйте. Не нашел нигде решение задачи.
Дело в том, что при копировании текста (selection.value=selection.value) у меня  пропадают нули перед кодами (было 00154 стало 154). И тут два варианта  копировать как текст правильно, но я не знаю как или добавить нули опять. Хорошего  решения я не нашел.
Как преобразовать формат текста в нужный (0000000) и сохранить его как текст? Как правильно копировать подобные значения?
Может кто при помощи VBA выставлял такие форматы текста?
Интересует только VBA вариант.
Range().NumberFormat = "000000" - выдает число с нулем перед ним, но это  не одно и тоже. Как сделать сохранение как текст, не пойму.
Приостановка выполнения макроса до пересчета формул
 
Здравствуйте. Столкнулся со следующей проблемой. В Exel с помощью макроса выгружаю массив данных - продажи за период (Около 5000 строк). Далее макрос растягивает формулы рядом с этим массивом. Получается довольно тяжеловесный массив. Авто пересчет я отключать не хочу,  поэтому хочу просто по выполнению расчета копировать массив с формулами и вставлять значения (Они мне в дальнейшем не нужны все равно).
Все было бы хорошо, но массив не успевает рассчитать значения, а макрос уже его копирует и получается на выходе ничего хорошего.
Если кто то сталкивался с подобным, как все таки начать копирование после выполнения пересчета страницы?
Еще одно замечание - некоторые формулы массива также являются функциями (макросами).
Изменено: Mirai - 14.10.2016 04:21:54
Страницы: 1
Наверх