![]() |
[OLE-Fernsteue]Formeln in Exceltabellen eintragen - Problem
Hallo allerseits,
ich habe ein Problem, bei dem ich mir Hilfe erhoffe. Ich habe ein kleines Tool geschrieben, welches mir sehr lästige Routineaufgaben beim Arbeiten mit bestimmten Excel-Tabellen abnimmt. Unter anderem sollen Formeln innerhalb einer solchen Exceltabelle verändert oder überschrieben werden. Leider klappt genau das nicht so wie es soll. Hier mal der Code, den ich verwende, damit man sich ein Bild davon machen kann, wie ich die OLE Steuerung verwende.
Delphi-Quellcode:
Mein Problem ist nun, wie schreibe ich eine sogenannte Array-Formel in eine Excel-Zelle. Das sind diese Formeltypen, die durch Ctrl-Shift-Enter abgeschlossen werden müssen und dann durch geschweifte Klammern dargestellt werden.
procedure gesamtmiete;
//paßt die Formel für die Gesamtmiete so an, dass alle 8 Zellen addiert werden var Excel: Variant; kopie, kopie2: string; pfad: string; i: integer; begin Excel := CreateOleObject('Excel.Application'); pfad:= form1.Edit2.Text; Excel.Workbooks.Open (pfad); Excel.Visible := true; application.ProcessMessages; Excel.Sheets[2].select; Excel.Sheets[2].Range['e5'].select; Excel.ActiveCell.formula:= '=sum(c5:d8)'; Excel.ActiveCell.NumberFormat:='0,00'; Excel.ActiveWorkbook.Save; //(pfad); Excel.Quit; Excel := unassigned; end; Ich habe eine solche Formel mal aus einer meiner Tabellen in eine Variable rauskopiert und in einem Edit-Feld anzeigen lassen, aber da fehlen die geschweiften Klammern. Ich habe es sogar schon versucht, diese geschweiften Klammern einfach mit in die Zielzelle reinzukopieren, aber das funktioniert genausowenig. Hat da jemand eine Idee dazu? Mein zweites Problem sind Tabellenverknüpfungen, also Zellbezüge, welche auf eine andere Tabelle zeigen, die zum Zeitpunkt der Tabellenbearbeitung nicht existieren. Beim Ausführen des Programmes kommt die Abfrage von Excel nach dem Verzeichnis, in dem sich die Tabelle befindet, die in der Verknüpfung benannt wurde. Gibt es eine Möglichkeit, diese Art der Abfrage zu deaktivieren und wenn ja, wie? Für Hilfe wäre ich wirklich sehr dankbar. Bingo |
Re: [OLE-Fernsteue]Formeln in Exceltabellen eintragen - Prob
Hallo BingoBongo,
Delphi-Quellcode:
Versuche mal das Gleichzeitzeichen innerhalb der Formel wegzulassen:
Excel.ActiveCell.formula:= '=sum(c5:d8)';
Delphi-Quellcode:
Wenn Du die Suche in der DP benutzt, solltest Du unter den Begriffen: VarArrayCreate suchen um ein Array für Excel zu erstellen.
Excel.ActiveCell.formula:= 'sum(c5:d8)';
Als weiteres hilft es sich einen Macro in Excel aufzuzeichen und diesen unter Delphi nachzustellen (als erste Näherung). Alle Deine Anforderungen können mit Delphi umgesetzt werden. Das sind erst mal Informationen zum Weitermachen, morgen mehr. Bis bald Chemiker |
Re: [OLE-Fernsteue]Formeln in Exceltabellen eintragen - Prob
Erstmal danke für den ersten Tip. Ich habe aber an sich kein Problem mit dem Gleichheitszeichen. Das funktioniert schon so wie es soll. Dieses Codebeispiel sollte nur als Anschauung dienen, da es ja mehrere Möglichkeiten gibt, Excel anzusteuern.
Aber dein Rat, nach VarArrayCreate zu suchen, hat mich drauf gebracht. Die Ergänzung zu
Delphi-Quellcode:
heißt scheinbar für diese Art von Arrayfunktionen
Excel.ActiveCell.formula
Delphi-Quellcode:
Das werde ich aber aus Müdigkeitsgründen jetzt sofort nicht ausprobieren, sondern wohl erst heute Abend.
Excel.ActiveCell.formulaArray
Hast du vielleicht auch einen Tipp in Hinblick auf mein Zellbezugsproblem? Bingo |
Re: [OLE-Fernsteue]Formeln in Exceltabellen eintragen - Prob
Zitat:
Delphi-Quellcode:
DisplayAlerts[LCID] := False
|
Re: [OLE-Fernsteue]Formeln in Exceltabellen eintragen - Prob
@Chemiker: die FormulaArray - Variante funktioniert, also vielen Dank für den Tip.
@Reinhardtinho: Ich bin mir nicht sicher, aber ist die Zuweisung des Inhalts der LCID Variable nicht von dieser Excel-Typbibliothek abhängig? Soweit ich das bisher begriffen habe, wird bei mir diese Variable nicht deklariert, da ich die Ansteuerung ohne Verwendung der Typbibliothek durchführe. Wenn es nur mit dieser Zuweisung funktioniert, würde es denn dann reichen, diese Variable einfach zu deklarieren und zuzuweisen, oder klappt das dann nicht? Bingo |
Re: [OLE-Fernsteue]Formeln in Exceltabellen eintragen - Prob
Es müsste auch mit LCID = 0 gehen, kannst du ja mal testen.
|
Re: [OLE-Fernsteue]Formeln in Exceltabellen eintragen - Prob
Scheint leider nicht so zu gehen. Hier mal der dazugehörige Quelltext, mit dem ich das ausprobiert habe.
Delphi-Quellcode:
Das ist wie gesagt der QT, mit dem ich solche Sachen ausprobiere. Kannst du da erkennen, wie ich es verändern müßte, damit es funktioniert?
procedure TForm1.Button13Click(Sender: TObject);
//zum testen diverser Funktionen var Excel: Variant; row, column: Integer; kopie, kopie2: string; pfad: string; i: integer; LCID: integer; begin LCID:= 0; Excel := CreateOleObject('Excel.Application'); pfad:= form1.Edit4.Text; Excel.Workbooks.Open (pfad); Excel.DisplayAlerts[LCID] := False; Excel.Visible := true; Excel.Sheets[2].select; // Excel.Sheets[2].unprotect; Excel.Sheets[2].Password:= '13983816'; // Excel.Sheets[2].range['b3'].select; // Excel.ActiveCell.FormulaArray:= '=f1+f2'; end; Das komische an der Sache ist nun, beim normalen Laufenlassen der Anwendung kommt nach dem Wegklicken der Verknüpfungsaktualisierungsmeldung die Fehlermeldung "Unzulässige Parameteranzahl". Weißt du da weiter? Bingo |
Re: [OLE-Fernsteue]Formeln in Exceltabellen eintragen - Prob
Hallo BingoBongo,
Delphi-Quellcode:
Damit wir ohne nachfragen die Datei abgespeichert. Und die Excel-Instanz beendet.
Excel.DisplayAlerts := False;
Excel.ActiveWorkBook.SaveAs(PathDateiName); FExcel.DisplayAlerts := False; Excel.ActiveWorkBook.Close; if (not varIsEmpty(Excel)) then begin Excel.Quit; end; Excel:= Unassigned; Bis bald Chemiker |
Re: [OLE-Fernsteue]Formeln in Exceltabellen eintragen - Prob
Ohne das [LCID] als Parameter hat es auch nicht geklappt. Die Aktualisierungsfrage kommt noch immer, leider.
Bingo |
Re: [OLE-Fernsteue]Formeln in Exceltabellen eintragen - Prob
Hallo BingoBongo,
starte das Programm mal ohne Debugger, ob dann immer noch die Meldung kommt. Eigentlich sollte das abspeichern so Funktionieren. Bis bald Chemiker |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz