Early en late binding

Status
Niet open voor verdere reacties.

reneemettrie

Terugkerende gebruiker
Lid geworden
1 aug 2006
Berichten
1.233
Ik wil vanuit Access Excel aanspreken.
Met Early binding (referentie naar de Excel bib gemaakt) lukt me dat .

Dan werkt deze code:

Code:
Dim objExcel
  Set objExcel = New Excel.Application
of
Code:
Set objExcel = CreateObject("Excel.Application")

Absoluut geen ervaring met late binding (geen referentie naar de Excel bib) maar wil er toch iets over weten...
Als ik dat gebruik werkt blijkbaar alleen
Code:
CreateObject
en niet
Code:
New

Klopt dit?
Is er bij Early binding een verschil tussen
Code:
[COLOR="#FF0000"]CreateObject [/COLOR]
en
Code:
[COLOR="#FF0000"]New[/COLOR]
?
 
Je eerste voorbeeldje bevat een fout(je) en de tweede een denkfout. Het eerste is niet-optimale Early Binding, de tweede is geen Early Binding maar Late Binding. Die is niet compleet (wat je laat zien) dus ik weet niet of daar een 'fout' in zit. Hier de juiste versies:

Code:
Dim objExcel As Excel.Application
    Set objExcel = New Excel.Application
Een Early Binding
Code:
Dim objExcel As Object
    Set objExcel = CreateObject("Excel.Application")
Late Binding
 
Ik had tot dusver alleen maar (een beetje) met early binding gewerkt om de lijst met properties en methods te zien. Daar werkte ik altijd met New.
Code:
Dim objExcel As Excel.Application
    Set objExcel = New Excel.Application
(in zoverre idd en fout in mijn vraag, de Dim staat daar niet bij vermeld)
Maar toen zocht ik op Google en vond dit:
https://support.microsoft.com/en-us/help/245115/using-early-binding-and-late-binding-in-automation
Hier gebruiken ze, als ik het goed begrijp, in de twee gevallen (early en late) CreateObject en niet New bij de early binding. Dus ofwel klopt die uitleg niet ofwel heb ik het slecht begrepen?
 
Laatst bewerkt:
Is deze code dan correct met Late Binding (rode lijnen)?
Is het een goede praktijk (voor wie niet alles van buiten kent) eerst met early binding te werken, dan referentie naar Excel verwijderen, en dan de dims en de set ObjExcel aan te passen?


Code:
Private Sub cmd_OK_Click()
Dim MyFile As String, pw As String, pwAccess As String
'----!!!!!
[COLOR="#FF0000"]Dim objExcel As Object, ObjWB As Object, ws As Object, r As Object
Set objExcel = CreateObject("Excel.Application")
[/COLOR]'----!!!!!

MyFile = CurrentProject.Path & "\Passwords.xlsx"
pw = "test"

Set ObjWB = objExcel.Workbooks.Open(FileName:=MyFile, Password:=pw, writerespassword:=pw)
'!!! no intellisense

Set ws = ObjWB.ActiveSheet
Set r = ws.Range("A1").CurrentRegion.Columns(1)
pwAccess = r.Find(cbo_UserName.Value).Offset(0, 1)

ObjWB.Close savechanges:=False

objExcel.Quit
Set objExcel = Nothing
Set ObjWB = Nothing

'MsgBox pwAccess
If txt_Password = pwAccess Then
    cmd_ChangePassword.Enabled = True
    txt_NewPassword.Enabled = True
    txt_NewPassword.SetFocus
Else
    MsgBox "Wrong Password"
End If

End Sub



Private Sub cmd_ChangePassword_Click()

Dim MyFile As String, pw As String, pwAccess As String
Dim objExcel As Object, ObjWB As Object, ws As Object, r As Object

MyFile = CurrentProject.Path & "\Passwords.xlsx"
pw = "test"
Set objExcel = CreateObject("Excel.Application")

Set ObjWB = objExcel.Workbooks.Open(FileName:=MyFile, Password:=pw, writerespassword:=pw)

Set ws = ObjWB.ActiveSheet

Set r = ws.Range("A1").CurrentRegion.Columns(1)
r.Find(cbo_UserName.Value).Offset(0, 1).Value = txt_NewPassword
 
    
ObjWB.Close savechanges:=True

objExcel.Quit
Set objExcel = Nothing
Set ObjWB = Nothing

MsgBox "done"
DoCmd.Close
End Sub
 
Dus ofwel klopt die uitleg niet ofwel heb ik het slecht begrepen?
Het mag allebei. Overigens wordt er door Microsoft in de voorbeelden af en toe bar en boos slecht geprogrammeerd; ik kan hun voorbeelden eigenlijk nooit meer klakkeloos overnemen zonder ze eerst goed (en beter) op te poetsen. Gelukkig was de zout vorig jaar in de aanbieding, en met die grote pot kan ik bij de voorbeelden nog heel wat korreltjes nemen :).

Is het een goede praktijk (voor wie niet alles van buiten kent) eerst met early binding te werken, dan referentie naar Excel verwijderen, en dan de dims en de set ObjExcel aan te passen?
Als de code nog vaak aangepast moet worden, of maar op één computer draait, kun je beter met Early Binding werken; dat is makkelijker en werkt uiteindelijk ook ietsje sneller. Late Binding heeft alleen zin als je voor meerdere platformen programmeert en dus niet weet met welke bibliotheken er gewerkt moet worden. Ik heb overigens bij DataPig een module opgehaald waarin ze alle Excel enumeraties hebben vertaald, zodat je dus ook met LB de gewone verwijzingen naar objecten kan gebruiken. En als je er een klassemodule van maakt, werkt dat ook met IntelliSense. Mij teveel werk :). Je code zou inderdaad moeten werken.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan