Toon posts:

[VB6 + Excel ] Excel draait op de achtergrond

Pagina: 1
Acties:
  • 126 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb een programma gemaakt, waarmee ik waarden uit Excel 97 inlees. Dit gaat allemaal goed, maar als ik dan de computer afsluit, nadat ik ook het programma zonder foutmeldingen heb afgesloten, dan krijg ik een foutmelding. Die foutmelding komt er op neer dat Excel nog niet is afgesloten. Excel loopt op de achtergrond. Dit kun je zien als je Contr-Alt-del doet.
Ik heb geprobeerd om met set myExcelApp=nothing het te doen en dan natuurlijk hetzelfde met het werkblad, maar dat werkte niet. Ik heb het ook nog met werkblad.close en met myExcelApp.quit gedaan. Deze dingen stonden allemaal in de MSDN library. Het voorbeeld GeoFacts sluit net als mijn programma Excel ook niet af.

Nu is mijn vraag: hoe zorg ik ervoor dat Excel echt wordt afgesloten?

Verwijderd

set werkblad = nothing
set myExcelApp = nothing
?

Verwijderd

Excel.Quit;
of
Excel.Disconnect;
of
Excel := Unassigned;

het ligt eraan wat je gebruikt om te connecten met excel

Verwijderd

ik heb zoiets dergelijks ook al eens gemaakt en dat had ik zo gemaakt (dat werkte perfect):

code:
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
uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, Menus, ComCtrls,
  ShellAPI, ComObj, OleServer, Excel97, inifiles, Grids, jpeg,
  ActiveX;

var
  MainForm: TMainForm;
  dir: PChar;
  currentdir,filepath:string;
  ini: TIniFile;
  Excel: _Application;
  AppWasRunning,chk1,chk2,chk3,chk4,chk5,chk6: boolean;
  lcid: integer;
  Unknown: IUnknown;
  Result: HResult;
  WBk: _Workbook;
  WS: _Worksheet;
  nieuw: Tnieuw;


procedure TMainForm.FormDestroy(Sender: TObject);
begin
  if AppWasRunning=True then
  Excel.Quit;
end;

procedure Tnieuw.BcreateClick(Sender: TObject);
begin
  chk1:=false;chk2:=false;chk3:=false;chk4:=false;chk5:=false;chk6:=false;
  lcid := LOCALE_USER_DEFAULT;
  AppWasRunning := False;
  if Checkbox1.checked=True then chk1:=true;
  if Checkbox2.checked=True then chk2:=true;
  if Checkbox3.checked=True then chk3:=true;
  if Checkbox4.checked=True then chk4:=true;
  if Checkbox5.checked=True then chk5:=true;
  if Checkbox6.checked=True then chk6:=true;

  Result := GetActiveObject(CLASS_ExcelApplication, nil, Unknown);
  if (chk1=true) or (chk2=true) or (chk3=true) or (chk4=true) or (chk5=true) or (chk6=true) then
  begin
  MainForm.Hoofdpanel.visible:=true;
  nieuw.visible:=false;
  if chk1=true then MainForm.Panelbad.Visible:=True;
  if (Result = MK_E_UNAVAILABLE) then
    Excel := CoExcelApplication.Create
  else begin
    OleCheck(Result);
    OleCheck(Unknown.QueryInterface(_Application, Excel));
    AppWasRunning := True;
  end;
  Excel.Visible[lcid] := True;
  {WBk := Excel.Workbooks.Add(filepath, LCID);}
  end
  else showmessage('Selecteer een of meerdere gewenste offertes.');
end;


hopelijk heb je er iets aan.
Ik connect trouwens met excel dmv de typebibliotheek (excel8.olb)
Het werkt bij mij met excel 97, 2000 en Xp :Y)

Verwijderd

Topicstarter
Om te connecten zeg ik simpelweg. getObject of CreateObject en dan geef ik het pad en klaar. En om te disconnecten, gebruik ik .quit, maar dat werkt dus niet. En dit lijkt wel een beetje op Pascal.

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 22-08 16:45
Als je excel via VB aanspreekt, gaat excel ervanuit dat er een user achter het scherm zit te interacten. Dat dat niet zo is, kan je op de volgende manier kenbaar maken.
code:
1
2
3
Excel.Visible = False
Excel.DisplayAlerts = False
Excel.ScreenUpdating = False


Excel schijnt namelijk bij .quit (en nog meer functies) een "Do you want to save this [yes] [no] [cancel]" boxje weer te willen geven. Maar omdat jij die niet kan zien, reageer je hier ook niet op. 8)7

Verwijderd

Topicstarter
Dus met die drie commandos zou het moeten werken? Ik had de eerste al gebruikt. En die deed inderdaad wat hij deed vermoeden. Je zag Excel niet. :o

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 22-08 16:45
Ja, vanuit ASP heb ik het een keer zo gedaan. Dat is ook met OLE en CreateObject, dus dat werkt wel hetzelfde.
Onder ASP zie je Excel sowieso niet, omdat het draait onder IIS (en die heeft geen desktop, of zo) Visible = False was dus misschien niet nodig in mijn geval.
DisplayAlerts is de boosdoener, die wacht op invoer van de gebruiker.
En ScreenUpdating is een optimalisatie.

Maar werkt het nu inmiddels?

Verwijderd

Topicstarter
Het werkt niet. Ik heb een testprogramma gemaakt, waarin ik alleen de objecten aanmaakte met set en dan er wat uitlas, en dan met set object=nothing, waarbij object de twee Excel objecten zijn. En dan die drie andere commando's. Kan het zijn dat je een speciaal bestand aan je project vast moet plakken of zo?

/me heeft trouwens wel zijn communicatie via de i/o poort aan de gang gekregen. Woei! :)
Maandag aan de RS232(serieel) beginnen.

[ Voor 0% gewijzigd door Verwijderd op 02-08-2002 20:41 . Reden: typo ]


Verwijderd

Topicstarter
Schop! (Het werkte dus nog niet).

Verwijderd

Topicstarter
Dan schoppen we hem nog een keer...

  • brokenp
  • Registratie: December 2001
  • Laatst online: 08:42
je moet meteen na het creeeren van je objecten de code
code:
1
2
3
Excel.Visible = False
Excel.DisplayAlerts = False
Excel.ScreenUpdating = False

toevoegen
Dus meteen na de regel Createobject ("Excel.application")

  • KoW
  • Registratie: Juli 2001
  • Laatst online: 17-08-2022

KoW

Parse parsed te veel

Je moet ook je werkboek afsluiten

Met

oExcel.ActiveWorkbook.Close(.F.)
oExcel.Quit()

sluit je de boel netjes af.
Die .F. is een notatie voor False, dus in jouw programmeertaal kan dat anders heten.
Die zorgt ervoor dat het document niet word opgeslagen.
Als je meerdere workbooks open hebt zul je die ook apart moeten closen

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 22-08 16:45
Als het nu nog niet werkt, kan je natuurlijk
alleen Excel.DisplayAlerts = false neerzetten (dus de rest op true laten staan). En dan meekijken met excel waar het fout gaat.
Pagina: 1