【问题标题】:How to set a range of different formulas to an Excel range from Delphi code?如何从 Delphi 代码将一系列不同的公式设置为 Excel 范围?
【发布时间】:2018-12-27 09:28:24
【问题描述】:

我尝试设置一系列不同的公式,但它在 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

它按预期工作:

注意事项:

  • 单元格A1 包含一个公式
  • 单元格A2B2 已使用变体字符串数组通过一次调用设置
  • 另请注意,Excel 安装是德文的,而英文公式 Complex 在屏幕截图中显示为德文 KOMPLEXE - 很好

德尔福测试代码

现在我尝试通过 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;

但这并没有按预期工作:

注意事项:

  • A1 中的单个公式按预期工作
  • 但是我设置为A2B2的变量数组还没有转换

任何想法我做错了什么以及如何解决这个问题?

我正在使用:

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

更新

另一种尝试是在 Delphi 中使用 Locale 依赖公式:

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;

这也不能立即工作:

注意事项:

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

【问题讨论】:

  • 正确使用 Excel 2007 - 德语版会很有帮助,因为这真的很重要。

标签: vba excel delphi automation


【解决方案1】:

我必须像这样创建一个varVariant(而不是varOleStr)的变体数组:

VarArrayCreate([0, 1], varVariant);

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

谢谢@Vityata

【讨论】:

    【解决方案2】:

    在 VBA 中,.Formula 采用原始英文公式并将其传输到 Excel。然后,根据本地 Excel 安装,进行“翻译”。因此,=Complex() 在德语中变为 =Komplexe()

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

    你可以试一试:

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

    作为最后的手段,如果您能找到 Excel 的英文安装,那么您的 Delphi 代码应该可以工作。要了解有关 Excel 本地公式翻译的一些想法,这是标准 =IF() 公式的翻译方式:

    • .公式"=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)

    【讨论】:

    • 我还认为数据类型有些错误。但另一方面,A1 的公式也只是一个 Delph 字符串(不存在 Formula 类型之类的东西,AFAIK。
    • 当然,我希望在我的代码中避免使用特定于语言环境的公式——那将是维护的噩梦。
    • @MartinTrummer - 避免本地特定确实是一个好主意。关于新的屏幕截图 - 为什么会出现英语错误而不是德语错误?
    • Name 的德语和英语单词恰好相同:参见translation
    • @Martin Trummer - 是的,确实 ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 2013-03-09
    • 2016-03-25
    • 2018-03-03
    • 1970-01-01
    相关资源
    最近更新 更多