[VBA] Excel formulier verbergen

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

  • Phoolie
  • Registratie: Juni 2002
  • Laatst online: 16:58
Ik zit met het volgende probleem, ik roep vanuit een DDE commando een excel document (met daarin een aantal macro's) op om in een ander excel document een aantal dingen uit te voeren. Alleen nu blijven beide excel documenten open staan, nu wil ik dat na het uitvoeren van de macro's (via DDE) het bestand met daarin de macro's afgesloten wordt. Ik heb hier de volgende macro voor gemaakt:
Visual Basic:
1
2
3
4
Sub Sluiten()
'Sluit window/document met opgegeven naam
    Workbooks("VBA.xls").Close
End Sub

Alleen nu is het probleem dat als ik deze macro vanuit de applicatie via DDE probeer te starten, dan wordt deze wel uitgevoerd, maar krijg ik een foutmelding vanuit de applicatie.

Nu heb ik geprobeerd om dit desbetreffende document te verbergen (sluiten hoeft niet eens perse), maar als ik dat doe dan worden alle openstaande documenten gesloten.

Ik heb al op google gezocht, maar ik kan er maar geen oplossing voor vinden.

Ik hoop dat iemand hier me kan helpen.

[ Voor 4% gewijzigd door Phoolie op 05-04-2007 15:18 ]


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

offtopic:
ipv een tabel, kan je code tussen [code][/code] tags plaatsen, zelfs met talen erbij; zie ook Overzicht van UBB-codes #tag_code.

In jouw geval wordt het dan [code=vb][/code] ;)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

En de foutmelding die je krijgt is?

Skill is when luck becomes a habit.


  • Phoolie
  • Registratie: Juni 2002
  • Laatst online: 16:58
eek schreef op donderdag 05 april 2007 @ 14:52:
En de foutmelding die je krijgt is?
Weet niet of je er iets mee kan, want het is een foutmelding uit de applicatie zelf, maar ik krijg de volgende foutmelding:
Fout tijden uitvoeren van macro '[run vba.xls!Sluiten()]

Fout terwijl Component Property/Method werd benaderd: Run.
Er is een uitzonering opgetreden.
Error code: 0x80020009 oleMacroExcel std2/word.p (5890)'.

Misschien is het ook wel handig om te weten dat het om een applicatie gaat die in Progress is gemaakt.

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Werkt de macro wel gewoon in Excel? Zet de cursor ergens in de Sub Sluiten en druk op de playknop (Run Sub/Userform F5).


Misschien heb je via een andere macro iets gewijzigd in VBA.xls en geeft dat problemen bij het sluiten.

Probeer eens:
Visual Basic:
3
    Workbooks("VBA.xls").Close SaveChanges:=False

  • Phoolie
  • Registratie: Juni 2002
  • Laatst online: 16:58
Daos schreef op donderdag 05 april 2007 @ 15:08:
Werkt de macro wel gewoon in Excel? Zet de cursor ergens in de Sub Sluiten en druk op de playknop (Run Sub/Userform F5).


Misschien heb je via een andere macro iets gewijzigd in VBA.xls en geeft dat problemen bij het sluiten.

Probeer eens:
Visual Basic:
3
    Workbooks("VBA.xls").Close SaveChanges:=False
Dat was ik er inderdaad nog vergeten bij te melden, de macro zelf werkt wel gewoon.

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Google zegt dat 0x80020009 staat voor: DISP_E_EXCEPTION. Je kan dan ergens een EXCEPINFO met extra informatie opvragen. Hoe dat moet, moet je zelf maar even zoeken.

  • Phoolie
  • Registratie: Juni 2002
  • Laatst online: 16:58
Daos schreef op donderdag 05 april 2007 @ 15:26:
Google zegt dat 0x80020009 staat voor: DISP_E_EXCEPTION. Je kan dan ergens een EXCEPINFO met extra informatie opvragen. Hoe dat moet, moet je zelf maar even zoeken.
Iemand die me hier misschien enige uitleg over kan geven, heb met google gezocht, maar wordt er niet veel wijzer van.

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Dat kwam ik ook al niet :)

Ik heb zoiets wat jij wilt even geprobeerd met OLE:

Visual Basic:
1
2
3
4
5
Set ExcelApp = CreateObject("Excel.Application")
ExcelApp.Visible = True

ExcelApp.Workbooks.Open "C:\VBA.xls"
ExcelApp.Run ("Sluiten")

Dit doet zijn werk goed, maar geeft na het sluiten een Automation error.

Wat wel helemaal goed werkt is sluiten via excel (dus zonder gebruik te maken van een macro):
Visual Basic:
5
ExcelApp.Workbooks("VBA.xls").Close



Kan je met DDE in Progress zoiets doen?

  • Phoolie
  • Registratie: Juni 2002
  • Laatst online: 16:58
Daos schreef op donderdag 05 april 2007 @ 16:50:
Dat kwam ik ook al niet :)

Ik heb zoiets wat jij wilt even geprobeerd met OLE:

Visual Basic:
1
2
3
4
5
Set ExcelApp = CreateObject("Excel.Application")
ExcelApp.Visible = True

ExcelApp.Workbooks.Open "C:\VBA.xls"
ExcelApp.Run ("Sluiten")

Dit doet zijn werk goed, maar geeft na het sluiten een Automation error.

Wat wel helemaal goed werkt is sluiten via excel (dus zonder gebruik te maken van een macro):
Visual Basic:
5
ExcelApp.Workbooks("VBA.xls").Close



Kan je met DDE in Progress zoiets doen?
Daar was ik ook al naar aan het zoeken, maar nog niks gevonden. Maar is er niet een mogelijkheid om die code vanuit een macro op te roepen?

Ook heb ik geprobeerd om in plaats van het document te sluiten gewoon een msgbox te tonen, dan werkt het allemaal wel. Het gaat dus echt fout op het sluiten, het document verbergen is ook prima, alleen lukt het me niet om 1 van de 2 documenten te verbergen.

Heb je misschien enig idee hoe ik dat kan realiseren?

[ Voor 3% gewijzigd door Phoolie op 05-04-2007 17:08 ]


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Kan je niet een dde-kanaal openen naar Excel|System en dan met [CLOSE("Vba.xls")] je bestand sluiten?

[edit]
Via VBA in Word werkt het zo:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dim file As String
file = "C:\Vba.xls"

Dim channelSystem As Long
Dim channelWorkbook As Long

channelSystem = DDEInitiate("Excel", "System")
DDEExecute channelSystem, "[OPEN(""" & file & """)]"
channelWorkbook = DDEInitiate("Excel", file)

DDEExecute channelWorkbook, "[RUN(""Test"")]" 'macro die niet sluit

DDETerminate channelWorkbook 'moet voor sluiten met [CLOSE("..")]
DDEExecute channelSystem, "[CLOSE(""" & file & """)]"

DDETerminate channelSystem


Conclusie:
- Sluiten gaat met [CLOSE("..")] via System
- Sluiten mag niet in een macro gebeuren
- Kanaal naar workbook moet dicht zijn voor het sluiten (Achteraf werk niet. Gaat misschien automatisch bij de CLOSE)

[ Voor 80% gewijzigd door Daos op 05-04-2007 18:42 ]


  • Phoolie
  • Registratie: Juni 2002
  • Laatst online: 16:58
Heb het op kunnen lossen door de macro in het andere document te plaatsen en het DDE commando te verwijzen naar de macro in het andere document.

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Phoolie schreef op vrijdag 06 april 2007 @ 14:32:
Heb het op kunnen lossen door de macro in het andere document te plaatsen en het DDE commando te verwijzen naar de macro in het andere document.
Werkte een [CLOSE(..)] in het System-topic dan niet bij jou?

  • Phoolie
  • Registratie: Juni 2002
  • Laatst online: 16:58
Daos schreef op vrijdag 06 april 2007 @ 14:39:
[...]

Werkte een [CLOSE(..)] in het System-topic dan niet bij jou?
Vanuit Word wel, maar vanuit de applicatie waar vandaan ik het aan roep niet, dus voor mij was het op deze manier het makkelijkst.

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Phoolie schreef op vrijdag 13 april 2007 @ 15:42:
[...]
Vanuit Word wel, maar vanuit de applicatie waar vandaan ik het aan roep niet
Vreemd... Met DDE zou het niet uit moeten maken van welke plek je het aanroept. Werkt het op 1 plek, dan werkt het normaal overal. OPEN werkt toch ook op dezelfde manier :?

In Progress zou het zoiets moeten zijn:
OpenEdge ABL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DEFINE VARIABLE file AS CHARACTER.
DEFINE VARIABLE channelSystem AS INTEGER.
DEFINE VARIABLE channelWorkbook AS INTEGER.

DEFINE VARIABLE DDEframe AS WIDGET-HANDLE.
CREATE FRAME DDEframe.

file = "C:\Vba.xls".

DDE INITIATE channelSystem FRAME DDEframe APPLICATION "Excel" TOPIC "System".
DDE EXECUTE channelSystem COMMAND "[OPEN(~"" + file + "~")]".
DDE INITIATE channelWorkbook FRAME DDEframe APPLICATION "Excel" TOPIC file.

/* Test is gewoon een macro die niet sluit */
DDE EXECUTE channelWorkbook COMMAND "[RUN(~"Test~")]".

DDE TERMINATE channelWorkbook.
DDE EXECUTE channelSystem COMMAND "[CLOSE(~"" + file + "~")]".

DDE TERMINATE channelSystem.

Verwijderd

eenmaal die stap genomen is het niet veel verder meer naar rechtstreekse automatisatie. ik heb geen ervaring met progress, maar met de code die ik op enkele sites gezien heb, moet het mogelijk zijn een soort cobol achtig gedrocht op te bouwen dat de excel toepassing instantieert en verder bestuurt.

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Verwijderd schreef op zaterdag 14 april 2007 @ 14:35:
eenmaal die stap genomen is het niet veel verder meer naar rechtstreekse automatisatie. ik heb geen ervaring met progress, maar met de code die ik op enkele sites gezien heb, moet het mogelijk zijn een soort cobol achtig gedrocht op te bouwen dat de excel toepassing instantieert en verder bestuurt.
Dat zou je normaal wel kunnen doen, maar in dit geval lijkt het mij niet verstandig. Het probleem is dat Microsoft van DDE af wil.

DDE werkt niet hetzelfde als COM/OLE. In COM zit bijvoorbeeld de Run in Application en de Open en Close in Application.Workbooks. De New is ongeveer Application.Workbooks.Add geworden.
Documentatie over DDE-commando's voor Excel is tegenwoordig moeilijk te vinden.
Pagina: 1