Late Binding in functie parameter

Status
Niet open voor verdere reacties.

obiku

Gebruiker
Lid geworden
25 jul 2004
Berichten
60
All,

Vanwege de diversiteit aan office pakketten bij de gebruikers van mijn database heb ik diverse procedures omgezet naar "late binding" zodat deze blijven werken, ongeacht welke versie van office gebruikt word.

Nu loop ik bij een 2 tal functies tegen het probleem dat dit niet werkt vanwege parameter's van die functies functie :
Code:
Public Function VerifyHeaders(ByRef xls As Worksheet, _
                              ByVal intSSID As Integer) As Integer

Ik blijf hier uiteraard een foutmelding krijgen omdat ik geen reference heb naar Excel.

Hoe kan ik mijn functie weer laten werken, met in gedachte houden dat mijn database moet werken in Access 2003, 2007, 2010 en waarschijnlijk straks ook in 2013.
 
Late verbinding met Excel:

Code:
with createobejct("excel.Application")

Maar er bestaat ook zoiets als
Code:
application.AppActivate
 
De createobject was me bekend. Die heb ik ook, samen met getobject gebruikt in mijn overige functies
Code:
[COLOR=#800000]    Dim olApp As Object
    Dim olNs As Object

    On Error Resume Next
    Set olApp = GetObject(, "Excel.Application")

    If Err.Number = 429 Then
        Set olApp = CreateObject("Excel.application")
    End If[/COLOR]

maar ik dit niet gebruiken in mijn functie parameter.
Code:
VerifyHeaders(ByRef xls [B]As Worksheet[/B], _
                              ByVal intSSID As Integer)
Ik kan de dimentionering "As Worksheet" niet vervangen door createobject.

Maar bedankt voor je reply ;)
 
En dit?
Code:
VerifyHeaders(ByRef xls As Object, ByVal intSSID As Integer)
Overigens ga je wel heel snel over op regelafbreking... Programmeer je op je telefoon? :)
 
OK, ik ga dat proberen. Ik ga er vanuit dat ik dan binnen de functie het object xls verder ga binden aan excel!?

De functie heb ik van iemand gekregen. Ik heb de opmaak gelaten zoals het is. Daar kan ik later altijd nog naar kijken :).
 
Door "trail by error" heb ik het late binding gedeelte van excel voor elkaar gekregen. Helaas loop ik nu weer tegen een ander probleem.... Wat waarschijnlijk hier wel mee te maken heeft.

Ik krijg nu helaas continu een error dat er onvoldoende bronnen beschikbaar zijn :confused:.

Komt dit nu doordat ik al mijn referenties keer op keer late bind zodra ik de functie aanroep?
 
Na verder uitzoeken kan ik dit nog als extra info geven.
De functie op zich werkt nu goed. Dit heb ik nog wel getest met een referentie naar Excel in de object library getest.
De functie wordt vanuit een formulier aangeroepen, nadat er op een button geklikt is om een excel bestand te selecteren:
Code:
Private Sub cmdExportPD_Click()
On Error Resume Next

Dim objExcel As Object
Dim xlb As Object 'Excel Workbook
Dim xls As Object 'Éxcel Worksheet

Set objExcel = GetObject(, "Excel.Application")

    If Err.Number = 429 Then
        Set objExcel = CreateObject("Excel.Application")
    End If

On Error GoTo Err_Handler

Dim dlg As Object
'Dim xlb As Excel.Workbook
'Dim xls As Excel.Worksheet
Dim strFileName As String
Dim Validated As Integer
Dim Imported As Boolean

' Create OpenFile Dialogbox
Set dlg = Application.FileDialog(msoFileDialogFilePicker)

    With dlg
        .Title = "Select the Excel file to import"
        .AllowMultiSelect = False
        .Filters.Clear
        .Filters.Add "Excel Files", "*.xls", 1
        .Filters.Add "All Files", "*.*", 2
        
        ' Pick Excel file
        If .Show = -1 Then
'            Set xlb = Excel.Application.Workbooks.Open(.SelectedItems(1))
            Set xlb = objExcel.Workbooks.Open(.SelectedItems(1))
'            Set xls = xlb.Sheets(1)
            Set xls = xlb.Worksheets(1)
            
            Validated = VerifyHeaders(xls, 1)
            
            If Validated <> 3 Then
                MsgBox "Validation Error!"
            Else
                DoCmd.SetWarnings False
                DoCmd.RunSQL "DELETE * FROM [tblExportAWB]"
                DoCmd.SetWarnings True
                ' Import Excel file in table
                Imported = ImportSpreadsheet(xls, 1)
                If Imported Then
                    Me.frmoPDImport.Requery
                    sDisplay True
                    MsgBox "Import Successful"
                Else
                    MsgBox "Import NOT Successful"
                End If
            End If
        Else
            Exit Sub
        End If
    End With

Exit_Handler:
On Error Resume Next

    ' Clear Excel workbook and worksheet
    If Not objExcel Is Nothing Then objExcel.Close: Set objExcel = Nothing
    If Not xls Is Nothing Then Set xls = Nothing
    If Not xlb Is Nothing Then xlb.Close: Set xlb = Nothing
    If Not dlg Is Nothing Then Set dlg = Nothing
    Exit Sub
Err_Handler:
    Call fLogSystem(g_varUserID, "Form_frmIndex", "cmdExportPD_Click()", "Error:", FRMINDEX, True, Err.Number, Err.Description)
    Resume Exit_Handler
    
End Sub
Ook in deze procedure heb ik late binding gebruikt voor excel. Maar nu krijg ik de "onvoldoende bronnen" error na het uitvoeren van de volgende regel:
Code:
            Set xlb = objExcel.Workbooks.Open(.SelectedItems(1))
B.t.w. de comment regels waren van de originele code regels welke ik van het internet geplukt heb..
 
als de eigenschap allowmultiselect 'False' is, is er er ook geen .selecteditem(1).

Kun je vertellen wat je met deze exercitie beoogt ?

Is het niet verstandig een bestand Excel bestadne te hebben waarin via een querytabel de verbinding met je database al gelegd is ?
Je hoeft dan alleen maar het bestand te openen, eventueel de zoekstring te wijzigen en de koppeling te verversen.
 
als de eigenschap allowmultiselect 'False' is, is er er ook geen .selecteditem(1)
Als allowmultiselected word gebruikt zou er ltijd maar 1 selected Item kunnen zijn. En zou .selecteditem(1) er dus altijd moeten zijn toch?


Ik lees hiermee een excel tabel in. Dit excel tabel heeft 43 kolommen. Alle kolommen zijn belangrijk, maar de eerste kolom heb ik nodig in een query om gegevens in mijn database in een rapport te laten tonen. Als deze eerste kolom alleen uit tekst of alleen uit nummers zou bestaan, dan was het niet echt nodig om deze tabel te importeren en had ik d.m.v. linken naar het excel bestand kunnen werken.

Dit excel bestand wordt gegenereerd door een ander systeem, waar ik helaas niet direct de benodigde info uit mag halen (is een database van mijn werkgever. Ik mag wel de data exporteren en dan gebruiken, maar niet direct uit die database de gegevens halen :( ).

Het overgrote meerendeel aan data in de eerste kolom bestaat uit nummerieke (10 positie grote) getallen, een enkele bestaat uit in de eerste 9 posities nummerieke getallen en als 10de een letter T.
Deze ene niet nummerieke waarde verstoort mijn query als ik deze direct vanuit het excel bestand laat lopen. Zeker als deze als 2 of later in de tabel naar voren komt. En het is helaas niet mogeljik en wenselijk om de volgorde te veranderen, omdat de volgorde zoals het in het excel bestand staat belangrijk is voor het verdere verloop van het proces.

Vandaar dat ik er ooit voor heb gekozen om de gegevens middels bovenstaande procedure te importeren.
 
Laatst bewerkt:
Met een querytabel die je ververst en vervolgens de T uit de eerste kolom haalt met ctr-H (of coluumns(1).replace "T","" ) ben je klaar.
 
Maar die T is wel belangrijk. Kolom 1 bestaat uit allemaal shipment nummers van 10 posities (Luchtvracht gerelateerd HouseWayBill). Het laatste is een controle getal (of letter). Wanneer de eerste 9 cijfers door 11 gedeelt worden komt er een controle getal uit die 0 t/m 10 (T) ;) kan zijn.
 
omdat het cijfer 10 uit 2 posities bestaat, en het gehele nummer maar uit max 10 posities mag bestaan. Bijvoorbeeld:
512345678 controle getal 9, dat maakt 5123456789, totaal 10 posities.
512345679 controle getal 10, totaal 11 posities. Dit kan het systeem niet aan, en wordt 10 vervangen door een T en het 512345679T wordt.
 
dan is T toch gelijk aan 0 (1 positie) ?
 
Nee, de 0 is gelijk aan 0.
Wanneer de eerste 9 cijfers door 11 gedeelt worden komt er een controle getal uit die 0 t/m 10 (T)
De eerste 9 cijfers worden gedeeld door 11, en dan blijft er een rest over. Die rest kan 0 t/m 10 zijn. Dit is wereldwijd binnen ons bedrijf zo afgesproken en daar kan/mag ik helaas niets aan veranderen.

Oeps, ik zie dat ik steeds meer off-topic ga. Ik zou graag meer uit willen leggen, maar eerst zou ik graag een oplossing voor mijn probleem hebben. Waarom krijg ik een Onvoldoende bronnen error bij het uitvoeren van de regel:
Code:
            Set xlb = objExcel.Workbooks.Open(.SelectedItems(1))
 
Laatst bewerkt:
Wat gaat er mis als je van alle getallen het controlegetal afhaalt ?
 
Dan maak ik het me alleen maar moeilijker. In mijn database worden namelijk dezelfde HWB's gebruikt als in de excel sheet incl. controle "getal".
Dan moet ik om juiste informatie te krijgen, ook van mijn gegevens in mijn database het controle getal er afhalen.

Het is toch erg omslachtig om eerst gegevens in beide (database en excel sheet) te moeten aanpassen, om uiteindelijk een resultaat te weer te geven, die daarna weer terug verandert moet worden naar de originele gegevens. Dan ben ik mijn gegevens 3 keer aan het wijzigen, om 1 resultaat te krijgen.

Maar bedankt voor je reactie.
 
Mij lijkt een controlegetal maar 1 maal noodzakelijk; Daarna kan met het gecontroleerde getal gewoon verder gewerkt worden.
Wat er later met een controlegetal zou moeten gebeuren is mij een raadsel. Ook die hebben in je database geen funktie meer.
Deze exercities zijn echter louter het gevolg van het feit dat een controlegetal in de vorm van een letter bij jou een probleem oplevert.
Je ziet dat het probleem hier bij de bron wordt gecreëerd: een controlegetal dat geen getal is. Dus daar zou je het ook aan moeten pakken.
 
Vanwege de diversiteit aan office pakketten bij de gebruikers van mijn database heb ik diverse procedures omgezet naar "late binding" zodat deze blijven werken, ongeacht welke versie van office gebruikt word.
Welke objecten geven bij jou problemen bij welke office versie waardoor je besloot om over te gaan op late binding?
 
Ik kreeg problemen met Excel en outlook. Binnen ons bedrijf wordt office 2003, 2007, 2010 en straks 2013 gebruikt.

Wanneer men binnen ons bedrijf een "nieuwe" PC krijgt, wordt daar de laatste versie van Office op gezet. Een maand geleden had ik nog een PC met office 2003 en was het af en toe voor mij nodig, wanneer ik thuis met mijn database bezig was geweest, de referenties terug te zetten naar office 2003 op mijn werk.

Zodra iemand een nieuwere versie van office heeft is er nog geen probleem, maar sinds kort heb ik een schone installatie geregen met office 2010. Dus nu hebben de mensen met office 2003 een probleem
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan