Запись формул из Variant-ного массива
Запись в свойство Formula, FormulaLocal, Value, Value2 из Variant-ного массива идентична в русском Excel'е и при работе из Delphi. Но, если мы хотим вставлять формулы прямо из массива, все они должны быть только русскими! Вот здесь то и всплывает необходимость определения наличия русской версии Excel'я (впрочем, это уже касалось задания цвета в свойстве NumberFormat).
Код на VBA: Sub TestVariant() Dim MyVar(2, 2) As Variant ' 3 строки, 3 колонки Dim R As Long, C As Byte ' первая строка MyVar(0, 0) = 10.72 MyVar(0, 1) = 3.05 ' MyVar(0, 2) = "=round(RC[-1]*RC[-2], 2)" ' ошибка #ИМЯ? MyVar(0, 2) = "=округл(RC[-1]*RC[-2]; 2)" 'работает для стандартных настроек ' вторая строка MyVar(1, 0) = 4.57 MyVar(1, 1) = 7.23 ' MyVar(1, 2) = "=round(A2*B2, 2)" ' ошибка #ИМЯ? MyVar(1, 2) = "=округл(A2*B2; 2)" '
работает для стандартных настроек ' итог ' MyVar(2, 2) = "=sum(C1:C2)" ' ошибка #ИМЯ? ' MyVar(2, 2) = "=сумм(C1:C2)" ' работает MyVar(2, 2) = "=сумм(R[-2]C:R[-1]C)" ' работает With Range("A1:C3") .Clear ' чистим область ячеек
от формул и форматов .Value = MyVar ' работает ' .Value2 = MyVar ' работает ' .Formula = MyVar ' работает ' .FormulaLocal = MyVar ' работает End With
Код на Delphi (тут мы применим знание написания русских формул, описанный выше, а именно ListSeparator):
var MyVar: Variant; IsRusXL: Boolean; begin ... MyVar := VarArrayCreate([0, 2, 0, 2], varVariant); //3 строки, 3 колонки // определим, русский ли у нас Excel IsRusXL := XL.LanguageSettings.LanguageID[msoLanguageIDUI]
= $0419; // первая строка массива MyVar[0, 0] := 10.72; MyVar[0, 1] := 3.05; if IsRusXL // стиль R1C1
then MyVar[0, 2] := Format('=округл(RC[-1]*RC[-2]%s 2)',
[ListSeparator]) else MyVar[0, 2] := '=round(RC[-1]*RC[-2], 2)'; // вторая строка массива MyVar[1, 0] := 4.57; MyVar[1, 1] := 7.23; if IsRusXL then MyVar[1, 2] := Format('=округл(A2*B2%s 2)',
[ListSeparator]) // стиль A1 else MyVar[1, 2] := '=round(A2*B2, 2)'; // итог if IsRusXL then MyVar[2, 2] := '=сумм(C1:C2)' // '=сумм(R[-2]C:R[-1]C)' else MyVar[2, 2] := '=sum(C1:C2)'; with ASheet.Range['A1:C3', EmptyParam] do begin Clear; // Formula := MyVar; // работает // FormulaLocal := MyVar; // работает // FormulaR1C1 := MyVar; //
не работает, если есть ссылки в стиле A1 // FormulaR1C1Local := MyVar; //
не работает, если есть ссылки в стиле A1 // Value := MyVar; // работает Value2 := MyVar; // работает end; ...
Примечание:
из примера видно, что при записи из Variant-ного массива в Formula, FormulaLocal, Value, Value2 не имеет значения, какой стиль ссылок используется: A1 и R1C1 работают идентично. Но это не относится к свойствам FormulaR1C1 и FormulaR1C1Local, которые принимают формулы ТОЛЬКО в стиле R1C1.