Autor |
Beitrag |
neffharb
Hält's aus hier
Beiträge: 8
|
Verfasst: 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
      
Beiträge: 36
Erhaltene Danke: 4
WinXP
Delphi6 MySQL
|
Verfasst: Di 28.02.12 11:32
Hallo Neffharb,
mein Vorschlag:
ComObj einbinden.
Delphi-Quelltext
Excel starten, Tabelle öffnen und Werte in die Listbox einlesen.
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.
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.
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TForm1.schliessenClick(Sender: TObject); begin XLApp.Quit; XLApp:=Unassigned; end; |
XLApp global vereinbaren als
Delphi-Quelltext
Viel Spaß beim basteln
|
|
neffharb 
Hält's aus hier
Beiträge: 8
|
Verfasst: 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
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 public
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 Narses: Delphi-Tags hinzugefügt
|
|
Singlepin
      
Beiträge: 36
Erhaltene Danke: 4
WinXP
Delphi6 MySQL
|
Verfasst: 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
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 XLApp:OLEVariant; public 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); 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; end;
procedure TForm1.beendenClick(Sender: TObject); begin Close; end;
end. |
|
|
neffharb 
Hält's aus hier
Beiträge: 8
|
Verfasst: 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.
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.ListBox1Click(Sender: TObject); begin Edit1.Text:=XLApp.Sheets['Tabelle1'].Cells[ListBox1.ItemIndex+2,2].Value; 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
      
Beiträge: 36
Erhaltene Danke: 4
WinXP
Delphi6 MySQL
|
Verfasst: 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
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 
Hält's aus hier
Beiträge: 8
|
Verfasst: 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.
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; |
mfg. Stefanie
|
|
Singlepin
      
Beiträge: 36
Erhaltene Danke: 4
WinXP
Delphi6 MySQL
|
Verfasst: 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 
Hält's aus hier
Beiträge: 8
|
Verfasst: 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
      
Beiträge: 36
Erhaltene Danke: 4
WinXP
Delphi6 MySQL
|
Verfasst: 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 
Hält's aus hier
Beiträge: 8
|
Verfasst: 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
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 public 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;
procedure TForm1.beendenClick(Sender: TObject); begin Close; end;
end. |
|
|
Singlepin
      
Beiträge: 36
Erhaltene Danke: 4
WinXP
Delphi6 MySQL
|
Verfasst: Sa 03.03.12 12:28
Ich glaube so kommen wir nicht weiter.
Checke mal deine Nachrichten.
|
|
neffharb 
Hält's aus hier
Beiträge: 8
|
Verfasst: 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
      
Beiträge: 36
Erhaltene Danke: 4
WinXP
Delphi6 MySQL
|
Verfasst: 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 
Hält's aus hier
Beiträge: 8
|
Verfasst: 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
|
|