Страницы: 1
RSS
Организация программы на VBA, Как лучше?
 
Доброй ночи всем.
Столкнулся с проблемой следующего характера.
Предположим у нас есть функция, которая из большей базы данных (10000 строк и тд) выбирает значения из одной строки и разных столбцов. Далее в той же функции, в которой производится выбор данных, был произведен расчет. Но, мне необходимо данный расчет разделить на несколько функций.
Предположим:
1 функция - Находит количество проданных яблок.
2 функция - Выручка
и т.д.
Но, проблема в том, что каждая функция должна использовать выбранные данные из таблицы. Можно организовать выбор данных из таблицы в каждой функции, но это двойная работа, что заметно тормозит процесс.
Была идея организовать все дело в 1 функцию и с помощью CASE сделать отдельный расчет в каждом, но тогда проблема в том, что найденные переменные в CASE 1 не могут быть использованы в CASE 2? (Как пример для определения выручки нам надо знать сорт яблока из 1 функции, CASE 1).

Пример не предоставляю т.к. тогда надо что-то писать отдельно для этого. Надеюсь суть проблемы понятна из вышесказанного.
Спасибо
 
переменные уровня модуля вам помогут  ;)
а вообще можно всё это дело и в модуль класса обернуть.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
ikki, спасибо за быстрый ответ.
А можно ссылки по теме или где можно найти примеры?
Я конечно погуглю.
 
по переменным уровня модуля и гуглить не надо.
объявляете то, что вам нужно, в начале модуля, допервой процедуры/функции - и всё.
если хотите, чтобы доступ был из разных модуле - объявляете как Public

по классам... ну, не очень богато они реализованы в VBA...
но для данной задачи должно хватить.
гуглить: vba class module
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Ок,спасибо, гугл что-то выдает, буду изучать матчасть =)

П.С. А оно будет работать если все в цикле ?
Предположим если на выдаче у меня был массив данных Arr(i,j) (соответственно для каждого цикла свои переменные, выбор данных и т.д. и т.п.)
Ну, интуитивно вроде должно все работать.
 
Прочитал первый пост дважды.
Ничего не понял)

Впечатление такое, что вполне хватит и двух формул в доп.столбцах


Если нужен макрос - опишите подробнее, что нужно
(без всех этих общих фраз, а конкретно, на примере файла Excel, что считаете, куда выводить результат, и т.д.)

PS: Если данные считать в массив, а потом из функции обращаться к массиву (глобальная переменная), - то для 10 тыс. строк это будет моментально выполняться, независимо, 1 или 100 обращений производится.
 
Про объявление переменных можно почитать здесь: Что такое переменная и как правильно её объявить?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Добрый день,
Составил пример который отражает основную структуру программы на примере яблок =)
(Все функции расчета в примере от "балды" если можно так сказать).

Прошу посмотреть пример.
Имеется база данных с которой берем данные и производим расчет.
Вопрос был в том, чтобы расчет переменной Variable_3 сделать в отдельной функции, но как видно она использует данные из базы данных и других переменных.

Спасибо за помощь.

Код
Function Test(Data As Variant)
'Define Variables
Dim aa()
Dim incells, i&, j&, Nrpk&
Dim Weight_1#, Size_1#, Weight_2#, Size_2#, Weight_3#, Size_3#, Weight_4#, Size_4#, Apple$
Dim Var#, Var_2#, Variable_1#, Variable_2#, Variable_3#
incells = Data.Value

Nrpk = UBound(incells)
ReDim resultArr(1 To Nrpk, 1 To 3)

'CALC
For j = 1 To Nrpk
    Apple = incells(j, 1)
    Var = incells(j, 2)
    Var_2 = incells(j, 3)
   
   'Take data from database
    aa = Worksheets("Database").Range("A2:I51").Value 'database
    For i = 1 To UBound(aa)
        If aa(i, 1) = Apple Then
            Weight_1 = aa(i, 2)
            Size_1 = aa(i, 3)
            Weight_2 = aa(i, 4)
            Size_2 = aa(i, 5)
            Weight_3 = aa(i, 6)
            Size_3 = aa(i, 7)
            Weight_4 = aa(i, 8)
            Size_4 = aa(i, 9)
        End If
    Next
    
    'Variable calculation
    Variable_1 = Weight_1 * Weight_2 + Var
    Variable_2 = Size_1 * Size_2 + Var_2
    
    
    Variable_3 = Variable_1 + Variable_2 + Size_3 * Weight_3
    
    'Define output array
    resultArr(j, 1) = Variable_1
    resultArr(j, 2) = Variable_2
    resultArr(j, 3) = Variable_3
Next
Test = resultArr
End Function
 
Как-то всё сложно...
Вот это

'Variable calculation
Variable_1 = Weight_1 * Weight_2 + Var
Variable_2 = Size_1 * Size_2 + Var_2
Variable_3 = Variable_1 + Variable_2 + Size_3 * Weight_3

можно высчитать один раз сразу и запомнить в словаре каждому яблоку (хотя можно просто наполнить словарь всеми исходными данными (вернее их координатами в массиве) и считать далее по месту). Только без значений Var и Var2 - их добавить потом, при проходе по анализируемым данным - достаём уже посчитанное из словаря, добавляем эти переменные, кладём всё в resultArr.

И судя по примеру тут никакая "публичность" не нужна - массивная формула, код выполняется один раз, в начале из базы (кстати её тоже как параметр нужно бы добавить) набираем словарь, затем по анализу заполняем массив результатов, выгружаем всё на лист. И без циклов в цикле.
Изменено: Hugo - 31.03.2013 14:21:56
 
Я вроде понял т.е. Ваша идея загнать все данные из базы данных в массив и потом уже к нему обращаться из других функций ? (Тогда да, можно убрать конечно цикл в цикле)
Не понял вот это:
Код
кстати её тоже как параметр нужно бы добавить
 
Идею поняли - но не в массив, а в словарь.
Или так -  в словаре запоминаем номер строки каждого яблока (в массиве из базы, это один проход по базе), затем при одном проходе по данным из словаря берём номер -> из базы данные.
То, что не поняли - сейчас база жёстко прописана в коде. Я думаю правильнее и её тоже указывать как параметр - чтоб если база поменяется не лезть в код.
 
Ок, разобрался. Буду пытаться реализовать.
Спасибо
Страницы: 1
Наверх