[vb6] Office references, hoe af te vangen?

Pagina: 1
Acties:

  • storeman
  • Registratie: April 2004
  • Laatst online: 12-02 13:53
Ik ben een tooltje aan het schrijven die een macro in Excel aanroept, door met tabjes en pijltjes door de menubalk heen te lopen. (ik weet het, omslachtig, maar op de macro zelf zit een password. Dit is een plugin van de leverancier). Via de menubalk start ik dan een database export tooltje, waarmee data uit een database wordt getrokken en op het excel sheet wordt geexporteerd. Vervolgens sla ik dit bestand op en sluit het werkboek. En gaat in een nieuw werkboek verder met de volgende export

Tot zover de functionaliteit.

Ik heb het tooltje dus geschreven in VB6 (geen VBA) en maakt gebruik van een config.txt bestand om eenvoudig alle handelingen aan te kunnen sturen. Op mijn dev systeem werkt het tooltje goed, echter, de exe die ik op een ander systeem wil draaien gaat heel ver goed, maar bij het opslaan gaat het fout.

Eerst even de systemen:

Mijn systeem:
Dell laptop
Win XP Prof
Office 2003

Ander systeem:
Dell Dimension
Win 2000 Server (standaard) op virtuele machine
Office 2000

VB op het andere systeem geinstalleerd en aan het debuggen. Eerst wilde hij LCase zelfs niet herkennen, na wat zoekwerk kwam ik erachter dat de API van Ms Office 11.0 dwars lag. Deze eruit gegooit en api van MS office 9.0 en Excel 9.0 geladen. Toen kon ie ineens weer opslaan! Hulde!

Maar.... hoe zorg ik nu dat het tooltje op beide systemen werkt, zonder dat ik twee exe's uit moet poepen.

Moet ik dan gaan stoeien met declare? en #if , #else enzo, hier ben ik totaal niet mee bekend.

Iemand die mijn neus in de goede richting kan zetten? Google en msnd leveren ook niet echt veel relevants op, evanals GoT.

Mijn dank is groot _/-\o_

"Chaos kan niet uit de hand lopen"


  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 20:55

sopsop

[v] [;,,;] [v]

m.b.v. latebinding kun je zonder gebruik te maken van 'fixed' referenties een object binnenslepen.

Dat doe je dus door het volgende:

Visual Basic:
1
2
Dim oWord as object
Set  oWord = CreateObject("Word.Application")


Je kunt ook d.m.v. late binding nog variaties maken in welke officeversie je ondersteunt door het aangeven van de versie in de aanroep, als volgt:
Visual Basic:
1
2
Dim oWord as object
Set  oWord = CreateObject("Word.Application.11")


In jouw geval zou je dus CreateObject("Word.Application.9") kunnen gebruiken om af te dwingen dat jouw programma van de Office 2000 API's en niet die van 2003 gebruik maakt.

[ Voor 15% gewijzigd door sopsop op 17-10-2006 16:55 ]


  • storeman
  • Registratie: April 2004
  • Laatst online: 12-02 13:53
Komt me bekend voor, dit gebruik ik ook al. Het enige probleem dat ik dan ondervond was dat bij het compileren ik geen private var met type Application of Workbook kon gebruiken. Ik ben het tooltje nu aan het runnen. Als dit echt alles was |:(

"Chaos kan niet uit de hand lopen"


  • BertS
  • Registratie: September 2004
  • Laatst online: 27-10-2025
Als je tegen de 9.0 DLL's aanprogrammeert, werkt dit ook op systemen met nieuwere versies (10 en 11).
Dus je kunt gewoon de reference naar 9.0 maken, en die ook op de 2003-machines gebruiken.

  • storeman
  • Registratie: April 2004
  • Laatst online: 12-02 13:53
Dit alles heb ik mooi werkend gekregen met de methode die sopsop noemde, echter wil ik nu de focus op de Excel applicatie zetten. Dit lukt opzich aardig, via google heb ik gevonden hoe ik bringwindowtotop functie kan declaren.

Hiervoor wordt er gebruik gemaakt van het unieke ID van ieder window. Op mijn XP machine werkt dit lekker! Echter voor Win2000 loop ik weer tegen problemen aan. Hierbij kan ik de hWnd property niet opvragen van mijn applicatie:

code:
1
2
3
currApp = CreateObject("Excel.Application")
currApp.visible = true
hExcelWnd = currApp.hWnd


Waarbij hExcelWnd een modale variabele is.

"Chaos kan niet uit de hand lopen"


  • BertS
  • Registratie: September 2004
  • Laatst online: 27-10-2025
hWnd is idd niet beschikbaar in de office 2000 api. Zul je dus moeten doen met een FindWindow-call

  • storeman
  • Registratie: April 2004
  • Laatst online: 12-02 13:53
Hoi BertS,

Ik heb dit nu inderdaad zo gedaan, na nog wat speurwerk, ik zal mijn functie even posten voor mensen die tegen dit probleem aan gaan lopen:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Function GethWndFromNewExcel() As Long
  Dim lngReturn As Long
  
On Error GoTo Alternative_Method
  lngReturn = currApp.hWnd
  
  GethWndFromNewExcel = lngReturn
  On Error GoTo 0
Exit Function

Alternative_Method:
  Dim strName As String
  Dim strClass As String
  
  strName = "Microsoft Excel"
  strClass = "XLMAIN"
  
  GethWndFromNewExcel = lngReturn
  
  On Error GoTo 0
End Function


Echter wel volledig gericht op Excel

"Chaos kan niet uit de hand lopen"


  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 20:55

sopsop

[v] [;,,;] [v]

storeman schreef op donderdag 19 oktober 2006 @ 14:22:
Hoi BertS,

Ik heb dit nu inderdaad zo gedaan, na nog wat speurwerk, ik zal mijn functie even posten voor mensen die tegen dit probleem aan gaan lopen:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Function GethWndFromNewExcel() As Long
  Dim lngReturn As Long
  
On Error GoTo Alternative_Method
  lngReturn = currApp.hWnd
  
  GethWndFromNewExcel = lngReturn
  On Error GoTo 0
Exit Function

Alternative_Method:
  Dim strName As String
  Dim strClass As String
  
  strName = "Microsoft Excel"
  strClass = "XLMAIN"
  
  GethWndFromNewExcel = lngReturn
  
  On Error GoTo 0
End Function


Echter wel volledig gericht op Excel
Ik zie niet in hoe de Alternative Method iets zinvols kan opleveren. Ik neem aan dat je hier de FindWindow API-functie (die je ook nog apart moet declareren) vergeten bent aan te roepen.

[ Voor 6% gewijzigd door sopsop op 19-10-2006 17:55 ]


  • storeman
  • Registratie: April 2004
  • Laatst online: 12-02 13:53
Inderdaad, pff, als je zelfs niet kunt copy-pasten

*storeman slaat zichzelf en doet een nieuwe poging:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Function GethWndFromNewExcel() As Long
  Dim lngReturn As Long
  
On Error GoTo Alternative_Method
  lngReturn = currApp.hWnd
  
  GethWndFromNewExcel = lngReturn
  On Error GoTo 0
Exit Function

Alternative_Method:
  Dim strName As String
  Dim strClass As String
  
  strName = "Microsoft Excel"
  strClass = "XLMAIN"
  
  lngReturn = FindWindow(strClass, strName)
  
  GethWndFromNewExcel = lngReturn
  
  On Error GoTo 0
End Function

"Chaos kan niet uit de hand lopen"

Pagina: 1