Я хорошо разбираюсь в MATLAB, но в эти дни я работаю в VBA, поскольку MATLAB менее доступен для меня, и я борюсь с попытками делать вещи в VBA (например, векторизацию), с которыми я мог бы легко справиться в MATLAB.
Допустим, у меня есть таблица данных в excel следующего вида:
record startDate endDate count
1 100 103 10
2 98 102 5
3 101 104 4
Я хотел бы выполнить всю свою обработку в памяти (избегая циклов), а затем вывести файл результатов, который выглядит следующим образом:
1 2 3 Sum
98 0 5 0 5
99 0 5 0 5
100 10 5 0 15
101 10 5 4 19
102 10 5 4 19
103 10 0 4 14
104 0 0 4 4
По сути, я начинаю с самой ранней даты и перебираю последнюю дату, а затем проверяю, включена ли каждая дата в окно даты для каждой записи, и если это так, я применяю количество записей к этому дню, а затем суммирую их.
Я создал включенный вывод, используя простую функцию рабочего листа, но я хотел бы иметь возможность воспроизвести процесс в VBA, специально избегая зацикливания, по крайней мере, уменьшая до 1 цикла вместо встроенных циклов.
Если бы я был в MATLAB, я бы нашел логический массив, удовлетворяющий условию, например:
numDays = 7;
numRecords = 3;
startDate = [100; 98; 101];
endDate = [103; 102; 104];
dateVector = [98; 99; 100; 101; 102; 103; 104];
count = [10; 5; 4];
dateLogic = logical(numDays,numRecords);
for d = 1:numDays
dateLogic(d,:) = dateVector(d) >= startDate(:,1) & dateVector(d) <= endDate(:,1)
end
countMatrix = dateLogix * count';
Sum = sum(countMatrix,2);
Это дало бы мне логическую матрицу нулей и единиц, которую я мог бы умножить на вектор счета, чтобы получить свои значения и, в конечном счете, мой вектор суммы. Я считаю, что мог бы даже использовать bsxfun, чтобы удалить цикл на днях.
Пожалуйста, извините за возможные синтаксические ошибки, так как сейчас у меня нет доступа к MATLAB.
Во всяком случае, как я могу сделать что-то подобное в VBA. Существует ли эквивалентная нотация двоеточия для ссылки на весь диапазон столбцов или строк в массиве. Я буду применять к большому набору данных, поэтому эффективность имеет существенное значение. Чем больше я могу сделать в памяти перед вставкой, тем лучше.
Заранее спасибо.
GetRow
или функциюGetColumn
. Здесь также есть масса полезных вспомогательных функций: www.cpearson.com/excel/array.htm - person David Zemens   schedule 24.07.2014