Refentie naar Excel Bibliotheek verwijderen en opnieuw toevoegen

Status
Niet open voor verdere reacties.

reneemettrie

Terugkerende gebruiker
Lid geworden
1 aug 2006
Berichten
1.232
Ik heb een access DB, gebruikt in Office 2016, met een referentie naar de Excel bibliotheek omdat ik de round functie van Excel wil aanspreken. (Probleem geldt natuurlijk ook voor ref naar andere Office programma's)

Open ik dat in Office 2010, dan mankeert natuurlijk de library van Office 2010.

Nu zou ik met VBA de foutieve bib willen verwijderen en de juiste toevoegen (ik ga niet werken met late binding)

Voor ik dit ga uitwerken zou ik willen weten of volgende een goede benadering is?

Ik zou een dergelijke code gebruiken om een foute bib op te sporen en te verwijderen:

Code:
If References("Excel").IsBroken Then
References.Remove References("Excel")
End If



Voor het toevoegen zou ik iets dergelijks willen gebruiken (gevonden op Internet, ga ervan uit dat Excel op de C drive staat:
Code:
If Dir("C:\Program Files (x86)\Microsoft Office\Office12\EXCEL.exe") <> "" And Not refExists("excel") Then
    Access.References.AddFromFile ("C:\Program Files (x86)\Microsoft Office\Office12\EXCEL.exe")
End If
If Dir("C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.exe") <> "" And Not refExists("excel") Then
    Access.References.AddFromFile ("C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.exe")
End If
If Dir("C:\Program Files (x86)\Microsoft Office\Office12\EXCEL.exe") = "" And Dir("C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.exe") = "" Then
    MsgBox ("ERROR: Excel not found")
End If
And the refExists references the following function:
Private Function refExists(naam As String)
Dim ref As Reference
refExists = False
For Each ref In References
    If ref.Name = naam Then
        refExists = True
    End If
Next
End Function
 
Ik mis hier even waarom je niet de Round functie van Access gebruikt.
 
Edmoor,

Het is idd niet belangrijk voor de vraag.
Het is maar een voorbeeld hoe je een functie van Excel vanuit Access kunt aanspreken. Ook functies die Access niet heeft en die je moeilijk zelf kan maken (zoals pi :) )
Maar heb toch wel een reden: de round functie in Access (query of VBA) rondt getallen met .5 af op het dichtsbij zijnde EVEN getal. Excel doet het zoals in de wiskunde, vanaf .5 naar boven.

?round(6.5)
6
?round(6.25,1)
6,2

?round(7.5)
8
?round(6.2)
6

En het blijft niet bij de round functie:
?cbyte(2.5)
2
?Cbyte(3.5)
4
 
Je kunt natuurlijk makkelijk je eigen Round functies maken, daarvoor hoef je niet naar Excel. Maar terug naar de vraag, zou ik zeggen. Bijzaken zijn niet voor niets bijzaken :). Had je hier al gekeken?
 
Je link gaat voor mij wat te ver, ga eerst wat ik gevonden heb eens testen.
Het is weer voor een opleiding waarin zeker het probleem van die referenties vermeld wordt.

En wat de bijzaak betreft: ik stel in zo een cursus 2 alternatieven voor: zelf functie maken of die van Excel aanspreken.

Code:
Afronden = Int(Getal + 0.5)

'Bij positieve en negatieve getallen kan je werken met de sgn functie:

'sgn= -1 bij negatief getal, 1 bij positief en 0 bij 0
'bij positieve getallen moet je 0.5 optellen, bij negatieve 0.5 aftrekken

Maar bovenstaande gaat alleen over 1 cijfer na de komma.
 
Ik wil het zoals hieronder oplossen maar kan het momenteel alleen op mijn eigen PC testen.
Mijn vraag: Environ("path") geeft een lang resultaat. Is het op elke PC correct als ik verwijs naar het deel links van de eerste ";"?

'C:\Program Files (x86)\Microsoft Office\Root\Office16\;C:\Program Files (x86)\Lenovo\FusionEngine;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Common Files\lenovo\easyplussdk\bin;C:\Program Files (x86)\Windows Live\Shared;C:\Program Files (x86)\Skype\Phone\;C:\Users\Renée\AppData\Local\Microsoft\WindowsApps;;C:\Program Files (x86)\Microsoft Office\root\Client

Code:
Sub test()
Dim OfficeVersion As String, ExcelPath As String

If References("Excel").IsBroken Then
    References.Remove References("Excel")
    ExcelPath = Left(Environ("path"), InStr(1, Environ("path"), ";") - 1) & "Excel.exe"
    References.AddFromFile ExcelPath
End If

Debug.Print Environ("path")
'Dit geeft:
[B]'C:\Program Files (x86)\Microsoft Office\Root\Office16\;C:\Program Files (x86)\Lenovo\FusionEngine;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Common Files\lenovo\easyplussdk\bin;C:\Program Files (x86)\Windows Live\Shared;C:\Program Files (x86)\Skype\Phone\;C:\Users\Renée\AppData\Local\Microsoft\WindowsApps;;C:\Program Files (x86)\Microsoft Office\root\Client

[/B]End Sub
 
Ik heb net deze gevonden:
Code:
Function wRound(pValue As Double, digit) As Double
Dim ExpandedValue
Dim IntPart As Long
Dim FractionPart As Double
Dim negNumber As Boolean
Dim result As Variant

    If pValue < 0 Then
        pValue = 0 - pValue
        negNumber = True
    End If
    
    ExpandedValue = pValue * (10 ^ digit) 'Retrieve integer part of the number
    IntPart = Int(ExpandedValue)
    FractionPart = ExpandedValue - IntPart 'Retrieve the fraction part of the number
    If FractionPart < 0.5 Then
        result = IntPart / 10 ^ digit
    ElseIf FractionPart >= 0.5 Then
        result = (IntPart + 1) / 10 ^ digit
    End If
    
    If negNumber = True Then
        wRound = 0 - result
    Else
        wRound = result
    End If
End Function

Om maar even aan te geven dat je best een hoop in Access zelf kan verhelpen :).
 
Ik zou de eerste waarde er zo uittrekken:
Code:
    arr = Split(Environ("path"), ";")
    t = arr(LBound(arr))
Bij mij staat de Office ook vooraan, maar als je daar over twijfelt, kun je met een lus de matrix doorlopen en op de tekst "Microsoft Office" doorzoeken. Dat is dan het pad dat je uit de matrix moet trekken.
 
Zal die round functie ook eens testen, maar, zoals gezegd, hier bijzaak :)

En is jouw methode met een array hier niet wat "overkill" :) ? Maar wel een interessant vb, en als je idd op "Microsoft Office" moet zoeken de beste oplossing.
Ga eerst mijn methode eens testen op andere PC's, heb daar voorlopig geen kans toe.
 
Laatst bewerkt:
En is jouw methode met een array hier niet wat "overkill" :)
Wat vind je makkelijker om te lezen:
Code:
    Left(Environ("path"), InStr(1, Environ("path"), ";") - 1)
of
Code:
    arr = Split(Environ("path"), ";")
    t = arr(LBound(arr))
Ik gebruik nooit meer Instr als het niet hoeft; even in een matrix pleuren en de gewenste waarde er uit halen. Eerste en laatste zijn dan sowieso geen probleem (LBound en UBound), en de rest dus met een lus. Veilig, geen kans op typfouten etc. Daar zit geen letter overkill in wat mij betreft :).
 
Tja, ik zie het weer als trainer en jij als programmeur.
Meeste mensen kennen de left functie en functie vergelijkbaar met Instr vanuit Excel.
maar met matrixen hebben de meeste cursisten nog niet gewerkt.
Is wel een goed vb om het begrip "Matrix" te illustreren, weeral inspiratie :)
 
Tja, ik zie het weer als trainer en jij als programmeur.
Valt wel mee: ben zelf ook trainer (geweest). Ik leer mensen bij voorkeur technieken die a) simpel zijn en b) universeel inzetbaar. Al geef ik toe dat een matrix in het begin best lastig kan zijn. Maar het is een mooie opmaat om een recordset uit Excel te halen en in een matrix in Access verder te verwerken.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan