Использование констант массива в формулах массива. Массивы констант в MS EXCEL

"Array of const" это массив переменных, декларированных как константы. Непосредственно они представлены структурой TVarRec. Скобки просто ограничивают массив. Массив констант дает вам возможность передавать процедуре переменное количество параметров type-safe (безопасным) способом. Вот пример:

type

TVarRec = record

Data: record case Integer of

0 : (L: LongInt ) ;

1 : (B: Boolean ) ;

2 : (C: Char ) ;

3 : (E: ^Extended) ;

4 : (S: ^string) ;

5 : (P: Pointer ) ;

6 : (X: PChar ) ;

7 : (O: TObject ) ;

end ;

Tag: Byte ;

Stuff: array [ 0 ..2 ] of Byte ;

end ;

function PtrToStr(P: Pointer ) : string ;

const

HexChar: array [ 0 ..15 ] of Char = "0123456789ABCDEF" ;

function HexByte(B: Byte ) : string ;

begin

Result:= HexChar[ B shr 4 ] + HexChar[ B and 15 ] ;

end ;

function HexWord(W: Word ) : string ;

begin

Result:= HexByte(Hi (W) ) + HexByte(Lo (W) ) ;

end ;

begin

Result:= HexWord(HiWord(LongInt (P) ) ) + ":" + HexWord(LoWord(LongInt (P) ) ) ;

end ;

procedure Display(X: array of const ) ;

I: Integer ;

begin

for I:= 0 to High (X) do

with TVarRec(X[ I] ) , Data do

begin

case Tag of

0 : ShowMessage("Integer: " + IntToStr (L) ) ;

1 : if B then

ShowMessage("Boolean: True" )

else

ShowMessage("Boolean: False" ) ;

2 : ShowMessage("Char: " + C) ;

3 : ShowMessage("Float: " + FloatToStr (E^) ) ;

4 : ShowMessage("String: " + S^) ;

5 : ShowMessage("Pointer: " + PtrToStr(P) ) ;

6 : ShowMessage("PChar: " + StrPas (X) ) ;

7 : ShowMessage("Object: " + O.ClassName ) ;

end ;

end ;

end ;

procedure TForm1.Button1Click (Sender: TObject ) ;

P: array [ 0 ..5 ] of Char ;

begin

P:= "Привет" #0 ;

Display([ -12345678 , True , "A" , 1.2345 , "ABC" , Ptr ($1234 , $5678 ) , P,

Form1] ) ;

end ;

Массив констант (array of const) фактически является открытым массивом TVarRec (описание предекларированных типов Delphi вы можете найти в электронной справке). Приведенный ниже "псевдокод" на языке Object Pascal может послужить скелетом для дальнейшего развития:

procedure AddStuff(const A: array of const ) ;

var i: Integer ;

begin

for i:= Low (A) to High (A) do

with A[ i] do

case VType of

begin

{ добавляем натуральное число, все real-форматы

Автоматически приводятся к extended }

end ;

begin

{ добавляем целое число, все integer-форматы

Автоматически приводятся к LongInt }

end ;

begin

if VObject is DArray then

with DArray(VObject) do

begin

{ добавляем массив double-типа }

else if VObject is IArray then

with IArray(VObject) do

begin

{ добавляем массив integer-типа }

end ;

end ;

end ; { Case }

end ; { AddStuff }

Для получения дополнительной информации загляните в главу "open arrays" электронной справки.
Взято из Советов по Delphi от Валентина Озерова
Сборник Kuliba

Массив констант во время выполнения приложения

Автор: Peter Below
...хорошо, непосредственно это синтаксис не поддерживает, поскольку массив констант Array of Const подобен открытым массивам, главным образом в части характеристик времени компиляции. Но вы можете обойти этот неприятный момент, обладая хотя бы начальными знаниями того, как реализован открытый массив. Что нам для этого необходимо: динамически размещенный массив array of TVarRec, который "принимает" ваши параметры, и "псевдоним" (alias) функции Format, позволяющий работать с таким массивом без "ругани" со стороны компилятора.

type

{ объявляем тип для динамического массива array of TVarRecs }

TVarArray = array [ 0 ..High (Word ) div Sizeof (TVarRec) - 1 ] of TVarRec;

PVarArray = ^TVarArray;

{ Объявляем alias-тип для функции Format. Передаваемые параметры будут иметь

В стеке тот же самый порядок вызова, что и при нормальном вызове Format }

FormatProxy = function (const aFormatStr: string ; var aVarRec: TVarRec;

HighIndex: Integer ) : string ;

{ AddVarRecs копирует параметры, передаваемые в массиве A в pRecs^, начиная

С pRecs^. highIndex - самый большой доступный индекс pRecs, число

Распределенных элементов - 1. }

procedure AddVarRecs(pRecs: PVarArray; atIndex, highIndex: Integer ; const A:

array of const ) ;

I: Integer ;

begin

if pRecs <> nil then

for i:= 0 to High (A) do

begin

if atIndex <= highIndex then

begin

PRecs^[ atIndex] := A[ i] ;

Inc (atIndex) ;

end { If }

else

Break ;

end ; { For }

end ; { AddVarRecs }

procedure TScratchMain.SpeedButton2Click (Sender: TObject ) ;

S: string ;

Proxy: FormatProxy;

begin

{ распределяем массив для четырех параметров, индексы - 0..3 }

GetMem (p, 4 * Sizeof (TVarRec) ) ;

{ добавляем параметры последующими вызовами AddVarRecs }

AddVarRecs(p, 0 , 3 , [ 12 , 0.5 , "Шаблон" ] ) ;

AddVarRecs(p, 3 , 3 , [ "Тест" ] ) ;

{ получаем полномочия Format }

@Proxy:= @SysUtils.Format ;

{ Вызов с динамически сгенерированным массивом параметров.

Естественно, строка формата может также быть сформирована

И во время выполнения программы. }

S:= Proxy("Целое: %d, Реальное: %4.2f, Строки: %s, %s" , p^[ 0 ] , 3 ) ;

{ выводим результат }

ShowMessage(S) ;

finally

FreeMem (p, 4 * Sizeof (TVarRec) ) ;

end ;

end ;


Я надеюсь вы поняли принцип. Естественно, имеются ограничения. Вы можете передавать в AddVarRecs числовые величины, строковые переменные и литералы, но не в коем случае не строковые выражения! В этом случае компилятор должен для хранения результата сформировать в стеке временную строку, передать ее в AddVarRecs (или лучше по адресу в TVarRec), и она может прекратить свое существование или может быть перезаписана в стеке другими данными, если в конечном счете вы передадите в Proxy целый массив!
Тестировалось только в Delphi 1.0!

Тема 4. Формулы с массивами

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

В формулах Excel можно использовать массивы констант. Массив констант строится как совокупность значений, заключенных в фигурные скобки и разделенных точкой с запятой. Массивы могут иметь различную размерность. Различают одномерные и двумерные массивы. Например, одномерный массив, размерностью 1×3, состоящий из одной строки и трех элементов в этой строке и содержащий элементы:

записывается как {5;7;9} , т.е. представляет собой совокупность значений массива, заключенных в фигурные скобки и разделенных точкой с запятой. Это горизонтальный одномерный массив (вектор-строка). Чтобы записать одномерный массив вертикально (вектор-столбец):

следует записать {5:7:9} , т.е. записать совокупность значений массива в фигурных скобках и разделить их двоеточием.

Двумерный массив состоит из нескольких строк и столбцов. Например, двумерный массив, размерностью 2×3, (состоящий из двух строк и трех столбцов), содержащий элементы:

записывается как {11;13;15:17;19;21} , т.е. представляет собой совокупность значений массива, заключенных в фигурные скобки, при этом значения, расположенные в одной строке отделяются друг от друга точкой с запятой, а строки двоеточием.

Массивы констант могут содержать числовые, текстовые или логические значения, причем текстовые константы должны быть заключены в кавычки. В один массив можно вводить значения разных типов, например, массив:

представляется как {«a»;«b»;«c»:1;2;3} .

Пусть имеются два двумерных массива:

Найти массив, каждый элемент которого представляет собой сумму соответствующих элементов исходных массивов:

Выполним следующие действия:

Выделим блок ячеек, в котором должны расположиться элементы результирующего массива: В2:С3.

Не сбрасывая выделения, в текущую ячейку (или в строку формул) введем выражение:

={1;2:3;4}+{10;20:30;40}.

Одновременно нажмем комбинацию клавиш Ctrl+Shift+Enter. Использование такой комбинации клавиш сообщает Excel, что вводится формула с массивами. Excel автоматически добавляет фигурные скобки при вводе табличной формулы. Эти скобки видны в строке формул, но если эти скобки ввести «вручную», формула будет воспринята как текст. Операндами этой формулы являются массивы констант.



В выделенном диапазоне получим элементы результирующего массива. Формулы с массивами выдали более одного результата: в режиме решения видим массив чисел изображенный на рисунке 224, в режиме показа формул – массив формул на рисунке 225.

Рисунок 224

Рисунок 225

Как видно из рисунка 225, в каждой ячейке выделенного диапазона записана формула, введенная в текущую ячейку. Эта «единичная» формула как бы существует одновременно в четырех ячейках в виде различных формул выделенного диапазона. Но внести изменения в них по отдельности нельзя. Это можно сделать, только выделив весь интервал В 2:С 3. Интервал В 2:С 3 представляет собой интервал массива, и табличная формула хранится в каждой ячейке.

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

Например, пусть одна из компонент – двумерный массив, состоящий из двух строк и трех столбцов. Для представления результатов вычисления по формуле ={1;2;3:4;5;6}*2 требуется выделить блок ячеек 2×3.

Одна из компонент исходного массива – массив 2×3, а другая – одиночное значение. При вычислении по этой формуле автоматически будет расширена вторая компонента до массива размерности 2×3 и произойдет вычисление по этой формулы как ={1;2;3:4;5;6}*{2;2;2:2;2;2}. Результат представлен на рисунке 226.

Если ввести формулу массива , вы чаще всего использовать диапазон ячеек на листе, но вам не нужно. Вы также можете использовать константы массива , просто введите в строке формул фигурные скобки значения: {}. Затем вы можете имя константы чтобы облегчить для повторного использования.

Константы можно использовать как в формулах массива, так и отдельно от них.

Использование константы для ввода значений в столбец

Чтобы ввести значения в один столбец, например в три ячейки столбца C, сделайте следующее.

Использование константы для ввода значений в строку

Чтобы быстро ввести значения в одну строку, например в ячейки F1, G1 и H1, сделайте следующее.

Использование константы для ввода значений в несколько столбцов и строк

Использование константы в формуле

Теперь, когда вы уже познакомились с константами массива, рассмотрим практический пример.

    Введите или скопируйте и вставьте в любую пустую ячейку следующую формулу, а затем нажмите клавиши CTRL+SHIFT+ВВОД:

    =СУММ(A1:E1*{1,2,3,4,5})

    В ячейке A3 появится значение 85 .

    Что произошло? Вы умножили значение в ячейке A1 на 1, значение в ячейке B2 на 2 и т. д, а затем с помощью функции СУММ выполнили сложение этих результатов. Эту же формулу вы могли ввести в виде =СУММ(A1*1,B1*2,C1*3,D1*4,E1*5) .

А при желании можно ввести оба набора значений в виде констант массива:

=СУММ({3,4,5,6,7}*{1,2,3,4,5})

Для этого скопируйте формулу, выделите пустую ячейку, вставьте формулу в строку формул, а затем нажмите клавиши CTRL+SHIFT+ВВОД. Вы получите такой же результат.

Примечания: Если константы не работают

Массив значений (или константа массива или массив констант) – это совокупность чисел или текстовых значений, которую можно использовать в . Константы массива необходимо вводить в определенном формате, например, для чисел {1:2:3:4:5} или для текстовых значений {"Север":"ЮГ":"Восток":"Запад"}.

В обычную формулу можно ввести ссылку на ячейку, содержащую значение, или на само значение, называемое также константой. Подобным образом в можно ввести или ссылку на массив, или массив значений , содержащихся в ячейках (в справке EXCEL его называют константой массива ). Константы массива необходимо вводить в определенном формате.

Создание одномерного массива констант

Перед созданием Массива констант посмотрим повнимательнее на диапазон ячеек, содержащий обычные значения (см. Файл примера )

  • в диапазон ячеек A 1: A 5 введите, например, 5 последовательных чисел от 1 до 5.
  • в ячейке B1 введите формулу =A1:A5 ;

  • в выделите A1:A5 и нажмите клавишу ;
  • получим некую запись {1:2:3:4:5}, представляющую собой набор значений из диапазона A1:A5

Этот набор значений, как и , обрамлен в фигурные скобки, сами значения разделены двоеточиями. Если бы значения были размещены в строке (в диапазоне A1:E1 ), а не в столбце, то значения были бы разделены точкой с запятой {1;2;3;4;5}.

Создадим константу массива в ячейке B2 . Для этого введем в ячейку выражение ={1:2:3:4:5} и нажмем ENTER . Массив значений не заключается в скобки автоматически, как формулы массива после нажатия CTRL+SHIFT+ENTER . Это необходимо делать вручную. В ячейке отразится только первое значение массива, т.е. 1.

Обычно массив значений не вводят в одну ячейку, т.к. в этом случае невозможно вытащить отдельные значения. Чтобы отобразить все значения нашего массива значений нужно выделить 5 ячеек в столбце (например, B1:B5 ), в ввести выражение ={1:2:3:4:5} и нажать CTRL+SHIFT+ENTER .

Теперь попробуем удалить один элемент массива, например из ячейки B 3 . Получим предупреждение «Нельзя изменить часть массива » - это определенного вида защита массива.

Чтобы избежать утомительного ввода для вертикального массива констант можно воспользоваться формулой =СТРОКА(1:5) . Записав ее любой пустой ячейке, выделите ее в строке формул и нажмите , а затем нажмите ENTER . Получите массив констант {1:2:3:4:5} . Скопируйте содержимое ячейки в буфер обмена (CTRL+C ), затем выделите вертикальный диапазон ячеек, соответствующий размерности массива, вставьте в активную ячейку содержимое Буфера обмена и нажмите CTRL+SHIFT+ENTER.

Чтобы избежать утомительного ввода последовательных чисел для горизонтального массива констант используйте формулу =ТРАНСП(СТРОКА(1:5)) или =СТОЛБЕЦ(A:E) . Получите массив констант ={1;2;3;4;5} . Значения массива будут разделены точкой с запятой.

Применение массива констант

А. Умножение векторов (столбец на столбец, строку на строку)
С помощью формулы массива умножим столбец значений (B 2: B 6 ) на массив констант {1:2:3:4:5} и просуммируем. Массив констант записан в «вертикальном» виде с использованием двоеточия, т.е. также представляет собой столбец. Размерности столбца и массива должны совпадать.

СУММ(B2:B6*{1:2:3:4:5})

После ввода формулы необходимо нажать CTRL+SHIFT+ ENTER .

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

СУММ(B2*1;B3*2; B4*3; B5*4; B6*5)

В последнюю очередь выполняется сложение значений при помощи функции СУММ() .

Б. Проверка значений
Проверим, равно ли значение в ячейке А1 одному из определенных значений: 4, 6 или 9.

ИЛИ(A1={4;6;9})

После ввода формулы нет необходимости нажимать CTRL+SHIFT+ENTER . Такая запись может существенно сократить время создания формулы по сравнению с использованием вложенных функций ЕСЛИ() .

Именование массива констант

Массиву констант можно присвоить . Обычно так поступают с константами, образующими группу однотипных значений, например последовательности с конечным количеством элементов ={1:2:3} .

Чтобы присвоить массиву констант имя необходимо сделать следующее:

  • на вкладке Формулы в группе Определенные имена выберите команду Присвоить имя .
  • В поле Имя введите Массив123 .
  • В поле Диапазон введите массив констант (не забудьте ввести скобки вручную), например {1:2:3} ;
  • Нажмите кнопку ОК.

Пример, найдем , записав формулу =СУММПРОИЗВ(НАИБОЛЬШИЙ(A1:A10;Массив123)) .

Предполагается, что в диапазоне A1:A10 имеется список числовых значений.

Создание двумерного массива констант

Чтобы создать двумерный массив констант необходимо сделать следующее:

  • выделите в книге диапазон ячеек из четырех столбцов и трех строк (A1:D3 ).
  • в активной ячейке (А1 ), в Cтроке формул введите выражение ={1;2;3;4: 5;6;7;8: 9;10;11;12}
  • нажмите сочетание клавиш CTRL+SHIFT+ ENTER


Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: