Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   EXCEL-Befehle anwenden (https://www.delphipraxis.net/210521-excel-befehle-anwenden.html)

Luca1 6. Mai 2022 09:50

EXCEL-Befehle anwenden
 
Hallo ich bin neu hier.
Habe auch gerade erst begonnen in der Schule zu programmieren.
Bisschen kann ich schon, aber net so viel.
Meine Frage:
Kann ich mit Delphi in ein EXCEL Arbeitsblatt gehen und dort EXCEL Befehle ausführen.
z.B wie viele Zeilen hat das EXCEL Arbeitsblatt

Ich kann auch in EXCEL kleine VBA Makros schreiben.
Kann ich da mit Delphi abfragen ob das Makro in der Arbeitsmappe ist.

Vielleicht kann mir ja jemand Antwort geben.

Danke
Luca

Delbor 6. Mai 2022 10:33

AW: EXCEL-Befehle anwenden
 
Hi Luca

Zuerst mal herzlich willkommen!

Zu deiner Frage:
Zitat:

Kann ich mit Delphi in ein EXCEL Arbeitsblatt gehen und dort EXCEL Befehle ausführen.
z.B wie viele Zeilen hat das EXCEL Arbeitsblatt
Nein, dass ist nicht möglich. Officeprogramme können 'nur' mit VBA bearbeitet werden.

Aber du kannst Office-Programme mit Delphi fernsteuern, wie hier zum Beispiel.
Gib doch mal im Suchfeld oben rechts unter den Worten Datenschutz und Impressum den Begriff 'Excel fernsteuern' ein. Du wirst da eine ganze Menge zum Thema finden.
Unter dem Menuepunkt <Komponente - Package installieren> wird dir ein grösserer Dialog angezeigt, der die installierten Komponenten mit gesetzten Häckchen anzeigt. Wenn diese Häckchen nicht gesetzt sind, ist/sind die Komponenten nicht installiert - setze das Häcken, und sie werden in der Palette angezeigt.

Es ist ausserdem hilfreich, wenn du eines oder mehrere Office-Programme installiert hast. Damit hast du auch zugang zur VBA-Umgebung und die zugehörige Hilfe.

Gruss
Delbor

Luca1 6. Mai 2022 10:49

AW: EXCEL-Befehle anwenden
 
Danke sehr.

Ich habe gerade was hier im Forum gefunden was mir weiterhilft.


Excel.Range['B:B'].Name := 'Test'; // Bereich Test einrichten
max_zeile:=excel.range['Test'].rows.count

Ich möchte ja herausfinden welches die letzte Zeilennummer ist in die geschrieben wurde.
Im VBA gibt es den Befehl .Cells(Rows.Count, 3).End(xlUp).Row um beispielsweise den letzten Wert der 3ten Spalte zu ermitteln.

Aber wie bringe ich .Cells(Rows.Count, 3).End(xlUp).Row in meinem Delphi unter.

Gruß
Luca

DeddyH 6. Mai 2022 11:15

AW: EXCEL-Befehle anwenden
 
Nicht mehr ganz taufrisch, aber das Meiste sollte noch funktionieren: https://www.delphi-treff.de/tutorial...von-ms-office/

Jumpy 6. Mai 2022 11:19

AW: EXCEL-Befehle anwenden
 
Wenn du dir die Links zu Excel-Fensteuern, wie oben vorgeschlagen anschaust, wirst du sehen, dass du über Delphi Zugriff zum Objektmodell von Excel bekommen kannst, so dass du Dinge, die du im VBA zuerst ausprobierst, um zu sehen wie es geht, dann relativ leicht nach Delphi übernehmen kannst. Du musst nur beachten, das in Delphi bei Arrays und Listen eckige Klammern benutzt werden und das gewisse Excel-Konstanten, wie hier z.B. xlUp in Delphi nicht bekannt sind. Daher musst du in Excel schauen, wofür xlUp steht (oft ein Interger-Wert) und das dann einbauen:

const xlUp=1;
//Wenn dann w eine variable ist, in der eine Referenz auf das Excel-Worksheet gespeichert ist, könnte es so gehen:
w.Cells[w.Rows.Count, 3].End(xlUp).Row in meinem Delphi unter.

peterbelow 6. Mai 2022 12:03

AW: EXCEL-Befehle anwenden
 
Excel ist ein OLE Automation Server und Delphi unterstützt OLE Automation seit Delphi 1. Die einfachste Methode ist late binding über Variants, die Support für IDispatch quasi eingebaut haben. Das sieht etwa so aus:
Delphi-Quellcode:
var
  Excel, WB: OLEVariant;
  LCount: Integer;
  LName: string;
  LPath: string;
begin
  Excel := CreateOleObject('Excel.Application');
  try
    LPath := TPath.Combine(TPath.GetDocumentsPath, 'sflib.xlsx');
    Excel.Workbooks.Open(LPath);
    WB := Excel.Workbooks.Item[1];
    WB.Activate;
    LName := WB.Name;
    LCount := WB.Sheets.Count;
    ShowMessage(Format('The workbook %s has %d sheets.',
      [LName, LCount]));
    WB.Close;
  finally
    Excel.Quit;
  end;
Die notwendigen Units in der Uses-Klausel sind System.Win.ComObj und (für TPath) System.IOUtils.
Diese Art von OLE Automation ist von der Syntax her der von VBA sehr ähnlich, aber es gibt einen massiven Nachteil:
Der Compiler "kennt" den verwendeten Automation Server nicht und kann daher den Kode nicht prüfen, etwaige Fehler werden erst zur Laufzeit angezeigt. Und Code completion geht auch nicht, man muss sich also quasi blind anhand der Excel-VBA Dokumentation durchschlagen.

Die Alternative ist early binding, die Verwendung von in der type library definierten interfaces des Servers. Dafür braucht man eine durch Import der type library erstellte Unit. Delphi liefert eine mit, drei Versionen sogar, die neueste ist Excel2010.pas.

Damit sieht der Kode in etwa so aus:

Delphi-Quellcode:
var
  Excel: ExcelApplication;
  WB: ExcelWorkbook;
  LCount: Integer;
  LName: string;
  LPath: string;
begin
  Excel := CreateOleObject('Excel.Application') as ExcelApplication;
  try
    LPath := TPath.Combine(TPath.GetDocumentsPath, 'sflib.xlsx');
    Excel.Workbooks.Open(LPath, false, false, Unassigned,Unassigned,
      Unassigned,Unassigned,Unassigned,Unassigned,Unassigned,Unassigned,
      Unassigned,Unassigned,Unassigned,Unassigned, 1031);
    WB := Excel.Workbooks.Item[1];
    WB.Activate(1031);
    LName := WB.Name;
    LCount := WB.Sheets.Count;
    ShowMessage(Format('The workbook %s has %d sheets.',
      [LName, LCount]));
    WB.Close(false, Unassigned, Unassigned, 1031);
  finally
    Excel.Quit;
  end;
Code completion funktioniert, aber leider hat auch das seinen Preis: man muss immer für alle Parameter einer Funktion einen Wert angeben, auch für die optionalen. "Unassigned" ist ein "leerer" OleVariant, den die Unit System.Variants zur Verfügung stellt.

Man kann beide Methoden auch mischen...

Luca1 6. Mai 2022 12:10

AW: EXCEL-Befehle anwenden
 
Herzlichen Dank an alle.
Da habe ich jetzt eine Menge zu tun. :wink:
Sobald ich meine Lösung habe stelle ich sie hier ein.
Bis hoffentlich bald
Luca

Monday 6. Mai 2022 16:48

AW: EXCEL-Befehle anwenden
 
Welches Problem willst du den konkret lösen?

Das meiste lässt sich innerhalb von Excel lösen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:46 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