Autor Beitrag
neffharb
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 27.02.12 18:18 
Hallo.

Ich möchte ein Programm erstellen, bei dem ich eine bestimmte Excel Datei öffnen kann und per ListBox die Artikelnamen (Spalte "B") und die dazugehörige Mengen per Editfeld (Spalte "H") aus der gleichen Zeile auslesen kann.

Da ich seit 6 Jahren nichts mehr gemacht habe, stehe ich merklich auf dem Schlauch.

Ich bitte daher um Eure mithilfe und bedanke mich im Voraus.
Singlepin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36
Erhaltene Danke: 4

WinXP
Delphi6 MySQL
BeitragVerfasst: Di 28.02.12 11:32 
Hallo Neffharb,

mein Vorschlag:
ComObj einbinden.
ausblenden Delphi-Quelltext
1:
uses ComObj					


Excel starten, Tabelle öffnen und Werte in die Listbox einlesen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.oeffnenClick(Sender: TObject);
var
 WBk:Variant;
 i:integer;
begin
if OpenDialog1.Execute then
 begin
 XLApp:=CreateOleObject('Excel.Application');
 XLApp.Visible := true;
 WBk:=XLApp.Workbooks.Open(OpenDialog1.Filename);
 i:=2;
 repeat
  ListBox1.Items.Add(XLApp.Sheets['Tabelle1'].Cells[i,1].Value);
  inc(i);
 until string(XLApp.Sheets['Tabelle1'].Cells[i,1].Value)='';
 end;
end;


z.B. beim Click in die Listbox die Werte in einem Editfeld anzeigen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.ListBox1Click(Sender: TObject);
begin
Edit1.Text:=XLApp.Sheets['Tabelle1'].Cells[ListBox1.ItemIndex+2,2].Value;
end;


Wenn fertig Excel schließen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.schliessenClick(Sender: TObject);
begin
XLApp.Quit;
XLApp:=Unassigned;
end;


XLApp global vereinbaren als

ausblenden Delphi-Quelltext
1:
var XLApp:OLEVariant;					


Viel Spaß beim basteln
neffharb Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mi 29.02.12 20:54 
Hallo Singlepin,

vielen Dank für deine Hilfe. Habe mal versucht etwas zu basteln. Leider startet weder Excel noch kann ich eine Datei zum öffnen auswählen. Vielleicht bin ich doch zu eingerostet. Bitte noch einmal um Hilfe.

Wie kann ich eigentlich einen Code gesondert ausgeben lassen hier im Forum?

Vielen, vielen Dank im Voraus.

mfg. Stefanie

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComObj, Excel2000, OleServer, StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    OpenDialog1: TOpenDialog;
    Edit1: TEdit;
    ExcelApplication1: TExcelApplication;
    ExcelWorksheet1: TExcelWorksheet;
    ExcelWorkbook1: TExcelWorkbook;
    ExcelOLEObject1: TExcelOLEObject;
    procedure oeffnenClick(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure schliessenClick(Sender: TObject);
  
  private
        { Private-Deklarationen }
  public

    { Public-Deklarationen }
   
  end;

var
  Form1: TForm1;
  XLApp:OLEVariant;

implementation

{$R *.dfm}

procedure TForm1.oeffnenClick(Sender: TObject);
var
 WBk:Variant;
 i:integer;

begin
if OpenDialog1.Execute then
 begin
 XLApp:=CreateOleObject('Excel.Application');
 XLApp.Visible := true;
 WBk:=XLApp.Workbooks.Open(OpenDialog1.Filename);
 i:=2;
 repeat
  ListBox1.Items.Add(XLApp.Sheets['Tabelle1'].Cells[i,1].Value);
  inc(i);
 until string(XLApp.Sheets['Tabelle1'].Cells[i,1].Value)='';
 end;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  Edit1.Text:=XLApp.Sheets['Tabelle1'].Cells[ListBox1.ItemIndex+2,2].Value;
end;

procedure TForm1.schliessenClick(Sender: TObject);
begin
XLApp.Quit;
XLApp:=Unassigned;
end;

end.


Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Singlepin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36
Erhaltene Danke: 4

WinXP
Delphi6 MySQL
BeitragVerfasst: Mi 29.02.12 22:51 
Hallo Neffharb,

um den Quelltext richtig darzustellen schließ du ihn mit
[ delphi ]
...
[ /delphi ] ein. ohne die Leerzeichen.
Geht auch über den Reiter Bereich.

Den Code habe ich unter Windows XP mit Delphi 6 und Excel 2007 getestet.
Auch mit Excel 2003 habe ich damit schon gearbeitet.

Auf deinem Formular fehlen zwei Button zum öffnen und schließen von Excel.
Über das OnClick-Ereignis rufst du dann die Proceduren oeffnenClick und schliessenClick auf.


Hier noch mal die komplette Unit1.pas

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComObj;

type
  TForm1 = class(TForm)
    oeffnen: TButton;
    ListBox1: TListBox;
    OpenDialog1: TOpenDialog;
    schliessen: TButton;
    Edit1: TEdit;
    beenden: TButton;
    procedure oeffnenClick(Sender: TObject);
    procedure schliessenClick(Sender: TObject);
    procedure beendenClick(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
  private
    { Private-Deklarationen }
 XLApp:OLEVariant;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.oeffnenClick(Sender: TObject);
var
 WBk: Variant;
 i:integer;
begin
if OpenDialog1.Execute then
 begin
 XLApp:=CreateOleObject('Excel.Application');
 XLApp.Visible := true;
 WBk:=XLApp.Workbooks.Open(OpenDialog1.Filename);
 i:=2;
 repeat
  ListBox1.Items.Add(XLApp.Sheets['Tabelle1'].Cells[i,1].Value); // Spalte A
  inc(i);
 until string(XLApp.Sheets['Tabelle1'].Cells[i,1].Value)='';
 end;
end;

procedure TForm1.schliessenClick(Sender: TObject);
begin
XLApp.Quit;
XLApp:=Unassigned;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
Edit1.Text:=XLApp.Sheets['Tabelle1'].Cells[ListBox1.ItemIndex+2,2].Value; // Spalte B
end;

procedure TForm1.beendenClick(Sender: TObject);
begin
Close;
end;

end.
neffharb Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Fr 02.03.12 11:05 
Hallo Singlepin,

habe gebastelt und bin auch schon zum Erfolg gekommen. Ich habe da nur 2 Dinge die noch nicht so recht laufen wollen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.ListBox1Click(Sender: TObject);
begin
Edit1.Text:=XLApp.Sheets['Tabelle1'].Cells[ListBox1.ItemIndex+2,2].Value; // Spalte B
end;


Sobald der Wert in der Listbox angezeigt wird ist der OpenDialog wieder aktiviert.
Ich möchte aber immer wieder in der Listbox einen anderen Artikel auswählen können um Ihn auszulesen.

Dann bekomme ich folgende Fehlermeldungen:

Fehlermeldung bei Initialisierung unter Delphi mit „F9“:

Feld Form1.beenden besitzt keine entsprechende Komponente!
Feld Form1.oeffnen besitzt keine entsprechende Komponente!
Feld Form1.schliessen besitzt keine entsprechende Komponente!

Sorry, aber ich bin ein wenig voll eingerostet, vielen Dank.

mfg. Stefanie
Singlepin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36
Erhaltene Danke: 4

WinXP
Delphi6 MySQL
BeitragVerfasst: Fr 02.03.12 13:22 
Hallo Neffharb,

wenn du die Procedure oeffnen mit dem Button aufrufst kannst du deine Tabelle auswählen, Excel wird gestartet und die Tabelle geöffnet.
Dann werden alle Werte in die Listbox eingelesen. in meinem Beispie Spalte A bei dir Spalte B allso auf 2 im Quelltext ändern.
Beim Klick in die Listbox wird die Procedure

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.ListBox1Click(Sender: TObject);
begin
Edit1.Text:=XLApp.Sheets['Tabelle1'].Cells[ListBox1.ItemIndex+2,2].Value;
end;


aufgerufen und der Wert im Editfeld angezeigt.
Die 2 oben mußt du abändern Stalte H ist 8.

Ansonsten müßte ich den Quelltext sehen, um den Fehler zu finden.
neffharb Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Fr 02.03.12 14:37 
Hallo Singlepin,

das mit der richtigen Spalte habe ich schon rausgefunden.

Das Problem ist, wenn ich in der Listbox einen Artikel aufrufe, dann zeigt er mir den richtigen Wert im Editfeld an, das ist alles so in Ordnung, aber gleichzeitig mit dem anklicken auf den Artikel in der Listbox startet der OpenDialog wieder und ich soll eine Excel-Datei auswählen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.oeffnenClick(Sender: TObject);
var
 WBk: Variant;
 i:integer;
begin
if OpenDialog1.Execute then
 begin
 XLApp:=CreateOleObject('Excel.Application');
 XLApp.Visible := true;
 WBk:=XLApp.Workbooks.Open(OpenDialog1.Filename);
 i:=2;
 repeat
  ListBox1.Items.Add(XLApp.Sheets['Tabelle1'].Cells[i,1].Value); // Spalte A
  inc(i);
 until string(XLApp.Sheets['Tabelle1'].Cells[i,1].Value)='';
 end;
end;


mfg. Stefanie
Singlepin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36
Erhaltene Danke: 4

WinXP
Delphi6 MySQL
BeitragVerfasst: Fr 02.03.12 15:51 
Das würde bedeuten, daß du beim anklicken der Listbox die oeffnen-Procedure aufrufst.
Das darf so nicht sein.
neffharb Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Fr 02.03.12 20:35 
Hallo,

richtig beim anklicken wird jedesmal die öffnen procedure aufgerufen.

Ich hab noch keine Lösung gefunden es zu verhindern.

Weiterhin bekomme ich die Fehlermeldungen:

Feld.Form1.beenden besitzt keine entsprechende Komponente.

Wie bekomme ich diese weg?

Besten Dank.

mfg. Stefanie
Singlepin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36
Erhaltene Danke: 4

WinXP
Delphi6 MySQL
BeitragVerfasst: Fr 02.03.12 23:05 
Ich glaube es ist am Besten wir fangen noch einmal bei Null an.

Um mein Beispiel nachzubauen hier die Schritt für Schritt Anleitung.

1. neues Projekt erstellen
2. auf das Formular folgende Komponenten legen

1 x TListBox
1 x TEdit
2 x TButton
1 x TOpenDialog

3. in Uses ComObj eintragen
4. die globale Variable XLApp:OLEVariant definieren
5. einen Button anklicken und im Objektinspektor bei Eigenschaften in Capion öffnen eintragen
6. beim zweiten Button schließen eintragen
6. auf den Button öffnen einen Doppenklick machen. Es öffnet sich der Quelltexteditor, in die leere Prozedure alles
aus meiner oeffnenClick-Procedure reinschreiben
7. auf den Button schließen einen Doppenklick machen. In die leere Prozedure alles aus meiner schließenClick-Procedure
reinschreiben
8. auf die ListBox einen Doppenklick machen. In die leere Prozedure alles aus meiner ListBox1Click-Procedure
reinschreiben
9. die Spaltenanpassung nicht vergessen
10. mit F9 das Programm starten
11. auf öffnen klicken und die Tabelle öffnen
12. auf einen Listboxeintrag klicken und im Editfeld das Ergebnis erhalten
11. auf Schließen klicken
12. freuen das alles super funktioniert

Wenn das wieder erwarten nicht klappen sollte müßtest du mir das komplette Projekt schicken, damit ich den Fehler suchen kann.
neffharb Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Sa 03.03.12 11:32 
Hallo Singlepin,

die Fehlermeldungen mit den TButton habe ich wegbekommen.
Leider öffnet sich beim anklicken in der Listbox immer noch gleichzeitig wieder die oeffnenClick procedure.

Bitte um Hilfe - Danke!

mfg. Stefanie

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComObj;


type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    Edit1: TEdit;
    oeffnen: TButton;
    beenden: TButton;
    schliessen: TButton;
    ListBox1: TListBox;
    procedure oeffnenClick(Sender: TObject);
    procedure schliessenClick(Sender: TObject);
    procedure beendenClick(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }  
    end;

var
  Form1: TForm1;
  XLApp:OLEVariant;

implementation

{$R *.dfm}

procedure TForm1.oeffnenClick(Sender: TObject);
var
 WBk: Variant;
 i:integer;
begin
if OpenDialog1.Execute then
 begin
 XLApp:=CreateOleObject('Excel.Application');
 XLApp.Visible := true;
 WBk:=XLApp.Workbooks.Open(OpenDialog1.Filename);
 i:=2;
 repeat
  ListBox1.Items.Add(XLApp.Sheets['Tabelle1'].Cells[i,1].Value); // Spalte A
  inc(i);
 until string(XLApp.Sheets['Tabelle1'].Cells[i,1].Value)='';
 end;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
Edit1.Text:=XLApp.Sheets['Tabelle1'].Cells[ListBox1.ItemIndex+2,2].Value;
end;

procedure TForm1.schliessenClick(Sender: TObject);
begin
XLApp.Quit;
XLApp:=Unassigned;
end;

procedure TForm1.beendenClick(Sender: TObject);
begin
Close;
end;

end.
Singlepin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36
Erhaltene Danke: 4

WinXP
Delphi6 MySQL
BeitragVerfasst: Sa 03.03.12 12:28 
Ich glaube so kommen wir nicht weiter.
Checke mal deine Nachrichten.
neffharb Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: So 04.03.12 20:50 
Hallo Singlepin,

vielen vielen Dank, habe den Fehler dank deiner Hilfe gefunden.
Das Programm läuft soweit. Ich muss aber noch ein wenig daran weiterarbeiten.

Muss mit dem ausgelesenen Wert im Edit-Feld arbeiten.

(2 Edit-Felder)
Es sollen auf diesen Wert Ab- und Zugänge gebucht werden

(1 Button "Buchen" / 1 Edit-Feld)
Dieser Wert soll in einem weiteren Edit-Feld erscheinen.
Der neue Wert soll dann in die Excelzelle exportiert werden.

1 Button "Neue Buchung"
Damit soll noch ein weiterer Artikel bearbeitet werden.

(SaveDiaolg)
Danach soll die Excel-Mappe mit dem SaveDialog abgespeichert werden.

Werde aber erst Mitte nächster Woche weitermachen können. Hättest Du Lust mich bei diesem Projekt weiter zu unterstützen?

Vielen Dank für deine bisherige Hilfe!

mfg. neffharb
Singlepin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36
Erhaltene Danke: 4

WinXP
Delphi6 MySQL
BeitragVerfasst: Mo 05.03.12 19:21 
Hallo Neffharb,

wenn ich helfen kann gern.

In die Excel-Tabelle schreiben geht wie lesen, nur die Seiten Vertauschen. siehe ListBoxClick

Wenn du in die Excel-Tabelle geschrieben hast fragt Excel beim schließen automatisch ob gespeichert werden soll.

Und Werte addieren sollte wohl klar sein!

Gruß
neffharb Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mi 07.03.12 19:52 
Hallo Singlepin,

habe das Programm erweitert. Die Berechnung steht zu 97%. Zwei Fragen hätte ich noch dazu:

1.) Wie kann ich verhindern, das sich Excel in den Vordergrund schiebt?
2.) Ich möchte 2 TEdit Feldern den Wert als Zahl "0" zuweisen, da ich immer eine Feklermeldung bekomme wenn ich in das Feld, Zugang oder Abgang, nichts eintrage. "Meldung: Kein gültiger Wert Integer".

Dann wenn ich die Daten nach Excel zurückgeschrieben habe, wie kann ich diesen Vorgang im nachhinein wieder rückgängig machen? Wollte das über einen TButton "Letzten Excel-Export rückgängig machen" realisieren.

Bitte um eine Rückantwort. Vielen Dank.

mfg. neffharb