Einzelnen Beitrag anzeigen

Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#1

LUACom und Excel - International verwendbare Skripte

  Alt 21. Nov 2013, 11:05
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
Ist ein Nilpferd ein Pferd, das nicht vorhanden ist?
  Mit Zitat antworten Zitat