Toon posts:

[VB6, Excel] Snellere manier om eerste rij uit te lezen.

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik vraag me af of er niet een snellere manier is om de eerste rij uit een Excel-sheet te lezen met vb6.
Ik heb nl. in mijn sheet op de eerste rij de kolomnamen staan, deze namen gebruik ik weer in een combobox op mijn vb6 formulier.

Ik doe het nu zo:
Instantie van Excel aanmaken
xls-bestand openen
Alle cellen lezen van rij1 zolang er tekst in staat
bestand sluiten
excel sluiten

Nu zit de tijdsduur vooral in het starten van Excel en het openen van het bestand (bestandsgrootte is ca. 800 kb).

Kan ik ook het excel bestand 'gewoon' openen zonder excel, dus openen als tekstbestand? Ik heb dat al geprobeerd door het xls-bestand in notepad te openen maar daar wordt ik niet uit wijs.

Is dit uberhaupt mogelijk of is mijn huidige manier de enige juiste (en dus de langzaamste)?

  • thegve
  • Registratie: Februari 2004
  • Laatst online: 13-05 23:53
Kun je die niet via de jet engine aansturen? Volgens mij was excel daar ook compatible mee. Of een andere engine.

Verwijderd

Ja je kan inderdaad ook via de jet engine de excel sheet uitlezen .. je krijgt hierbij dus gewoon een recordset . werkt simpel en is ook vrij snel iig. gebruik het zelf ook en heb tot nu toe nog geen probleem gehad dat het langzaam ging

Verwijderd

Topicstarter
@thegve:

Of het met de jet engine kan weet ik zo niet. Moet ik dan niet eerst een ODBC-connectie maken enzo? Is de permance dan nog wel goed?
Ik zal proberen het uit te zoeken.

@freaky1983

Je was me net voor. Ik ga een testje maken en dan weten we het ;)

[ Voor 19% gewijzigd door Verwijderd op 02-09-2004 10:50 ]


  • thegve
  • Registratie: Februari 2004
  • Laatst online: 13-05 23:53
Ik denk dat de performance iig beter zal zijn dan als je eerst excel start. :)

Verwijderd

Verwijderd schreef op 02 september 2004 @ 10:49:
@thegve:

Of het met de jet engine kan weet ik zo niet. Moet ik dan niet eerst een ODBC-connectie maken enzo? Is de permance dan nog wel goed?
Ik zal proberen het uit te zoeken.

@freaky1983

Je was me net voor. Ik ga een testje maken en dan weten we het ;)
best geen odbc gebruiken, is achterhaald. beter is de jet engine aanspreken inderdaad via ADO of zijn voorganger DAO. het is wel eigenaardig dat je spreekt over een rij uitlezen, dat wil zeggen dat je maximaal 256 gegevens (1 record (rij) van 256 fields (kolommen)) kan hebben. bedoel je het niet andersom?

iig, hier de manier om een verbinding te maken met het excelblad dmv ADO:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub VerbindenMetExcel()    
  'niet getest
  dim ExcelVerbinding As ADODB.Connection
  dim RSExcel As ADODB.Recordset
  Set ExcelVerbinding = New ADODB.Connection    
  With ExcelVerbinding 
    .Provider = "Microsoft.Jet.OLEDB.4.0"        
    .ConnectionString = "Data Source=" & "d:\jouwmap\jouwexcelbestand.xls"  & ";" & _ 
     "Extended Properties=Excel 8.0;"
        .Open
  End With
  set RSExcel=excelverbinding.execute(""Select * FROM [Blad1$]")
  'code om velden (rijen?) af te lopen tot je een leeg vindt
end sub


je moet een verwijzing maken naar de ADO tlb (2.7 waarschijnlijk)
anders zoek je maar eens in google groups voorbeelden genoeg.

Verwijderd

Topicstarter
@_heretic_:
Ik had een soortgelijk voorbeeldje al gevonden op MSDN, maar ik krijg een error bij het openen van de connection, op de regel:
oConn.Properties("Extended Properties").Value = "Excel 8.0"

[Error]
Kan de voorziening niet vinden. Mogelijk is deze niet juist geïnstalleerd.
[/Error]

Nu gebruik ik MSExcel 2002 SP3 (10.6501). Ik heb het ook al geprobeerd met
oConn.Properties("Extended Properties").Value = "Excel 10.0"
maar dat geeft dezelfde foutmelding.

Ik heb al gezocht bij google, maar alle voorbeelden doen zoals ik heb geprobeerd. Ik snap er niets van.
In een andere applicatie connect ik op dezelfde manier naar een Access database (maar dan zonder de extended properties) en dat gaat prima.

Iemand een idee?
Ik denk dat het aan mijn versie van Excel/windows ligt. Ik draai overigens op win2000 SP4

Verwijderd

Topicstarter
Ik heb inmiddels de nieuwste versie van de jet engine geinstalleerd (jet4.0 sp8), pc gereboot maar nog steeds hetzelfde resultaat.

Ik ben weer wat verder. Ik heb nu de connectie gemaakt.
Als ik deze code gebruik
code:
1
2
oConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\test.xls;Extended Properties=Excel 8.0;"
oConn.open

gaat het goed.

Als ik de connectstring uitsplits in:
code:
1
2
3
4
5
6
  With oConn
    .Provider = "Provider=Microsoft.Jet.OLEDB.4.0"
    .Properties("Extended Properties").Value = "Excel 8.0"
    .ConnectionString = "Data Source=C:\Data\test.mdb"
    .Open
  End With


Krijg ik de eerder genoemde error.
Hier snap ik dus niets van, maar goed het werkt nu in ieder geval ;)

Vervolgens dacht ik via
code:
1
Set oRst = oConn.OpenSchema(adSchemaColumns, Array(Empty, Empty, "Blad1", Empty))

de kolomnamen te krijgen, want die staan in de eerste rij van de sheet, maar dat werkt zoniet. Ik krijg allemaal datatype benamingen terug.
Dit zoek ik nog even uit.

[ Voor 79% gewijzigd door Verwijderd op 02-09-2004 14:36 ]


Verwijderd

Topicstarter
Ik heb het eindelijk werkend. Ik zal de code hier posten.
Inderdaad is het enorm veel sneller. Dezelfde bewerking duurde door Excel openen en uitlezen 19 seconden en nu met ADO minder dan 1 seconden.
Hier is de code:
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
Public Function getColumnNamesFromRecordset(ByVal sFilename As String, _
  ByRef arrayColumnNames() As String) As Boolean
Dim bResult As Boolean
Dim oConn As New ADODB.Connection
Dim oRst As New ADODB.Recordset
Dim byFieldsCount As byte
Dim i As long

  'Maak connectie
  With oConn
    .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sFilename & ";Extended Properties=Excel 8.0;"
    .CursorLocation = adUseClient
    .Open
  End With

  'Open recordset
  With oRst
    .ActiveConnection = oConn
    .CursorLocation = adUseClient
    .CursorType = adOpenStatic
    .LockType = adLockOptimistic
    .MaxRecords = 1
  ' Ensure the worksheet name is enclosed in square brackets to allow for spaces in the worksheet name
    .Source = "SELECT * FROM [" & EXCELSHEETNAME & "$]"
    .Open
  End With
  
  byFieldsCount = oRst.fields.Count
  'Zet dimensies:
  ReDim arrayColumnNames(0 To byFieldsCount - 1)
  'lees fields uit
  For i = 0 To byFieldsCount - 1
    arrayColumnNames(i) = oRst.fields(i).Name
  Next i
  
  'sluit recordset
  oRst.Close
  Set oRst = Nothing 'Opruimen
  'sluit connectie
  oConn.Close
  Set oConn = Nothing 'Opruimen
    
  bResult = True
  getColumnNamesFromRecordset = bResult

End Function


Bedankt voor het meedenken.

[ Voor 5% gewijzigd door Verwijderd op 02-09-2004 15:12 ]

Pagina: 1