如何通过Delphi代码为Excel范围设置一系列不同的公式?

时间:2018-07-19 09:42:03

标签: excel vba excel-vba delphi automation

我尝试设置一系列不同的公式,但是通过Delphi无法使用。

VBA测试代码

为了说明这一点,我有一些可以直接在Excel中执行的VBA测试代码:

Public Sub Test()
    Range(Cells(1, 1), Cells(1, 1)).Formula = "=Complex(1, 1.2)"

    Dim vFormula(1 To 2) As Variant
    vFormula(1) = "=Complex(0, 0.1)"
    vFormula(2) = "=Complex(1, 1.2)"

    Range(Cells(2, 1), Cells(2, 2)).Formula = vFormula
End Sub

它可以按预期工作:

enter image description here

注意:

  • 单元格A1包含一个公式
  • 已使用一个变体字符串数组通过一次调用设置了
  • 单元格A2B2
  • 还请注意,Excel安装使用德语,并且屏幕快照中的英语公式Complex用德语KOMPLEXE显示-sweet

Delphi测试代码

现在,我尝试通过Delphi进行相同操作:

procedure TForm1.btnAddRangeFormulasClick(Sender: TObject);
var
  I: Integer;
  VarArr: Variant;
begin
  FWorksheet.Range['A1', 'A1'].Formula := '=Complex(1, 1.2)';

  VarArr := VarArrayCreate([0, 1], varOleStr);
  VarArrayPut(VarArr, '=Complex(0, 0.1)', [0]);
  VarArrayPut(VarArr, '=Complex(1, 1.2)', [1]);

  FWorksheet.Range['A2', 'B2'].Formula := VarArr;
end;

但这不能按预期工作:

enter image description here

注意:

  • A1中的单个公式可以正常工作
  • 但是我设置为A2B2的变量数组尚未转换

有什么主意我在做错什么以及如何解决这个问题?

我正在使用:

  • Windows 10 Pro 64位英语语言环境
  • Excel 2007德语
  • 德尔福10.2
    • Excel TLB:Microsoft Excel 15.0对象库

更新

另一种尝试是在Delphi中使用依赖于语言环境的公式:

procedure TForm1.btnAddRangeFormulasGerClick(Sender: TObject);
var
  VarArr: Variant;
begin
  FWorksheet.Range['A1', 'A1'].Formula := '=Komplexe(1, 1.2)';

  VarArr := VarArrayCreate([0, 1], varOleStr);
  VarArrayPut(VarArr, '=Komplexe(0, 0.1)', [0]);
  VarArrayPut(VarArr, '=Komplexe(1, 1.2)', [1]);

  FWorksheet.Range['A2', 'B2'].Formula := VarArr;
end;

这也不马上起作用:

enter image description here

注意:

  • 公式显示为未知#Name
  • 但是当我然后输入每个单元格并再次退出(不进行任何更改)时,数据会正确显示(重新计算无济于事)-这并不奇怪,就像直接在Excel中输入公式一样。
  • 请注意,当我使用FormulaLocal而不是Formula时,它也不起作用

2 个答案:

答案 0 :(得分:5)

我必须这样创建[Database Name] Users - Maria - Jane (而不是varVariant)的变体数组:

varOleStr

然后是我的所有用例,包括自动公式翻译工作!

感谢enter image description here

答案 1 :(得分:1)

在VBA中,.Formula使用原始的英语公式并将其传输到Excel。然后,基于本地Excel安装,将其“翻译”。因此,=Complex()在德语中成为=Komplexe()

显然在Delphi中,它的工作方式与此类似。 .Formula可以将您的英语公式正确翻译为德语,因此A1可以。 VarArrayPut可能需要Text而不是Formula,因此应该使用当地语言:

您可以尝试一下:

VarArrayPut(VarArr, '=Komplexe(0, 0.1)', [0]);

作为最后的选择,如果您可以找到英语的Excel安装,则您的Delphi代码应该可以正常工作。为了获得有关Excel本地公式转换的一些想法,这是如何转换标准=IF()公式的方式:

  • .Formula "=IF(B1=C1,""Equal"",""Not equal"")"
  • .FormulaR1C1 "=IF(RC[1]=RC[2],""Equal"",""Not equal"")"
  • .FormulaLocal "=WENN(B1=C1,""Equal"",""Not equal"")"
  • .FormulaR1C1Local "=WENN(ZS(1)=ZS(2),""Equal"",""Not equal"")"

Source (disclaimer - my site)