Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   LUACom und Excel - International verwendbare Skripte (https://www.delphipraxis.net/177688-luacom-und-excel-international-verwendbare-skripte.html)

Getox 21. Nov 2013 11:05

LUACom und Excel - International verwendbare Skripte
 
Guten Morgen,

mein aktuelles Problem hat nichts mit Delphi zu tun, aber ich hoffe, mir kann dennoch jemand helfen.

Ich habe ein Skript geschrieben, welches mir eine Excel-Tabelle erstellt, formatiert und mit Daten füllt, welche zuvor an das Skript übergeben wurden. Ich werdehier für meine Beispiele aber sehr einfachen Beispielcode verwenden ;)

Das Skript tut was es soll und auch das Ergebnis im Excel sieht genau so aus, wie ich das möchte, aber eine Sache ist noch sehr unschön gelöst.

Ein deutsches Excel nimmt nur deutsche befehle an (Beispiel: SUMME(A1:A3)). Wenn man diese Formel aber in ein englisches Excel packen würde, würde es nicht klappen, weil die FUnktion dort SUM(A1:A3) heißen würde. SUM funktioniert aber wiederum nicht im deutschen Excel, weil dieses ja SUMME erwartet. Und was ist, wenn mal ein Franzose oder so das Skript testen wollen würde?

Ich suche also eine Möglichkeit, das Skript so zu schreiben, dass die Formeln in jedem Excel unabhängig von der Sprache angenommen werden.

Wenn ich mir im Excel ein Makro erstelle, enthält der folgenden VBA Code:

Code:
Range("C4").Activate
ActiveCell.FormulaR1C1 = "=SUM(R[-3]C:R[-1]C)"
Um mir etwas schreibarbeit zu sparen habe ich mir 2 Funktionen geschrieben. Eine, welche mir eine zelle als Range-Objekt gibt und eine Funktion, welche diese Zelle dann mit Inhalt füllt:

Code:
require('luacom')
excel = luacom.CreateObject("Excel.Application")
excel.Visible = true
wb = excel.Workbooks:Add()
ws = wb.Worksheets(1)

--format functions
function selectCell (aCell)
  local range = nil;
  range = aCell .. ":" .. aCell;
  result = ws:Range (range);
  return result;
end;


function writeInCell (aCell, aContent)
  cell = selectCell (aCell)
  cell.Value2 = aContent;
end;
Auf den vorhergehenden Code bauen dann die restlichen Codeschnipsel auf :) In allen weiteren beispielen fülle ich jeweils 3 Zellen untereinander mit einer 1 und in die 4. Zelle darunter kommt die Summe daraus (also 3).

Folgende 2 Beispiele funktionieren:

Code:
writeInCell("A1", 1);
writeInCell("A2", 1);
writeInCell("A3", 1);
writeInCell("A4", "=Summe(A1:A3)");

writeInCell("B1", 1);
writeInCell("B2", 1);
writeInCell("B3", 1);
cell = selectCell ("B4");
cell.Formula = "=Summe(A1:A3)";
Was nicht funktioniert ist:

Code:
writeInCell("C1", 1);
writeInCell("C2", 1);
writeInCell("C3", 1);
cell = selectCell ("B4");
cell.FormulaR1C1 = "=Summe(R[-3]C:R[-1]C)";
Nach dem Code bricht das Skript mit folgender Fehlermeldung ab

Zitat:

LUA: COM exception:(.\src\library\tLuaCOM.cpp,398):
stack traceback:
[C]: ?
excelTest1.lua:36: in main chunk
[C]: ?
Zeile 36, welche den Fehler verursacht, ist die wo ich versuche FormulaR1C1 einen Wert zuzuweisen.

Jetzt will ich aber erstmal irgendeine Variante haben, welche international lauffähig ist. Dafür habe ich es mit den englischen begriffen probiert. Die Beispiele habich dafür so gelassen wie Vorher, nur dass ich "Summe" durch "Sum" ersetzt habe.

In den ersten beiden beispielen (normal in die Zelle schreiben und Formula) steht dann in den Feldern, wo eigentlich die Summe erscheinen sollte nur noch "#NAME?" und das Beispiel mit FormulaR1C1 spuckt noch den selben Fehler aus wie vorher.

Gibt es überhaupt eine Möglichkeit, ein Skript zu schreiben, was in verschiedensprachigen Excelversionen läuft?

In diesem beispiel habe ich zwar nur die Summe verwendet, aber es sollte ja Klar sein, was ich möchte. Ich hoffe mir kann jemand helfen.

Liebe Grüße
Getox

baumina 21. Nov 2013 12:50

AW: LUACom und Excel - International verwendbare Skripte
 
Ohne es jetzt komplett nachvollziehen zu können was genau nicht klappt, aber müsste nicht FormulaR1C1 immer englische Anweisungen beinhalten (siehe VBA-Code)? Denn der ganze VBA-Code ist immer nur in englisch.

Auch ein ActiveCell.Formula = "=SUM(A1:A3)" muss funktionieren, egal in welcher Sprache das Excel läuft.

Jumpy 21. Nov 2013 13:45

AW: LUACom und Excel - International verwendbare Skripte
 
Analog zu deiner writeInCell würde ich eine writeFormularInCell Funktion erstellen, die das von baumina genannte umsetzt:

Code:
function writeFormulaInCell (aCell, aFormula)
  cell = selectCell (aCell)
  cell.Formula = aFormula;
end;
Die Alternative zu Formula, die dann sprachabhängig ist, wäre nämlich FormulaLocal, weswegen ich auch vermuten würde, das Formula funzt.

Getox 21. Nov 2013 15:02

AW: LUACom und Excel - International verwendbare Skripte
 
Zitat:

Zitat von baumina (Beitrag 1236913)
Ohne es jetzt komplett nachvollziehen zu können was genau nicht klappt, aber müsste nicht FormulaR1C1 immer englische Anweisungen beinhalten (siehe VBA-Code)? Denn der ganze VBA-Code ist immer nur in englisch.

Auch ein ActiveCell.Formula = "=SUM(A1:A3)" muss funktionieren, egal in welcher Sprache das Excel läuft.

Wenn ich bei Formula "=SUM(A1:A3)" zuweise, steht nachher im Excelfeld "#NAME?" und wenn man draufklickt ist da auch die englische Fassung der Formel drin. Wenn ich jedoch "=SUMME(A1:A3)" bei Formula zuweise klappt es.

FormulaR1C1 konnte ich weder in deutsch noch in englisch zum laufen bringen.

In allen fällen scheint es bei Formula so, als wenn stumpf der String, den man zuweist in das Feld geschrieben wird, so wie bei Value2.

baumina 21. Nov 2013 15:06

AW: LUACom und Excel - International verwendbare Skripte
 
Wenn du dir innerhalb von Excel ein VBA-Script machst und dort ActiveCell.Formula = "=SUM(A1:A3)" ausführst, klappt das denn oder auch nicht?


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz