Referenties naar Bibliotheken

Status
Niet open voor verdere reacties.

reneemettrie

Terugkerende gebruiker
Lid geworden
1 aug 2006
Berichten
1.233
Ik heb dacht ik deze vraag al eens geplaatst, maar toen is ze aan de aandacht ontsnapt.
Ik heb een Access bestand waarin een koppeling zit naar de bibliotheek van Excel 2016.
Als ik dat open in Access 2010 krijg ik een foutmelding die je kunt oplossen door manueel een verwijzing naar Excel 2010 te maken.
Maar nu wou ik dat automatiseren:

Code:
Sub test()

Dim ExcelPath As String, arr
    arr = Split(Environ("path"), ";")
    
'If References("Excel").IsBroken Then
    References.Remove References("Excel")
    ExcelPath = arr(LBound(arr)) & "Excel.exe"
    References.AddFromFile ExcelPath
'End If

End Sub

Als ik dat test in 2016 (waar de bibliotheek niet moet gewijzigd worden) krijg ik geen fout.
Maar op een2010 toestel krijg ik de melding dat hij de functie Environ niet kent. Raar, want bv Environ.Username geeft geen fout.
Hoe los ik dit op?
 
Environ("Username") en Environ("path") zijn goed, daar zal je geen foutmelding op krijgen.
Waarom schrijf je Environ.Username?
 
Foutje in dit bericht. In de code staat het juist.
Maar probleem is dus dat de functie niet herkend wordt in de bovenstaande code in Access 2010 met een referentie naar Excel 2016, zelfde fenomeen als wanneer er een verwijzing staat naar de bib van 2016 en de simpele date() functie niet herkend wordt.
 
Ik begrijp er niets van. Op de afbeelding zie je het foutbericht als je de code uitvoert in een 2010 bestand met een verwijzing naar de bib van Excel 2016. Blokkeert op "environ"
In het direct venster krijg ik dezelfde fout,met environ en met date, hoewel de functies environ en date worden voorgesteld als je CTRL spatie typt.
Als ik in de code alle regels desactiveer, behalve diegene waar de slechte referentie wordt verwijderd, krijg ik de melding: Fout 48 - fout in het laden van de DLL.
Knipsel.JPG
 
Als er een fout in de db zit (en ontbrekende/foutieve bibliotheken vallen daar onder) dan krijg je foutmeldingen op de gekste plekken, die meestal niets te maken hebben met het eigenlijke probleem. De functie DATE bijvoorbeeld in een query is daar ook een voorbeeld van. Als je de db compileert, kom je al die 'foute' plekken wel tegen. Handmatig herstellen van de fouten, dus ook de bibliotheken, is dan de enige oplossing. Daarna loopt de code wél door.
Maar als je met verschillende versies werkt (moet werken), dan snap ik niet dat je zo blijft doormodderen met bibliotheken, want dat is toch nergens voor nodig? Je kunt toch ook met Late Binding werken? Heb je nergens last van.
 
Reden is simpel. Ik ontwikkel niet, maar geef opleidingen. Meestal aan mensen die nog nooit met VBA hebben gewerkt en/of nog nooit geprogrammeerd, dus een groot deel van de cursus gaat al over variabelen, lussen,condities,....
Voor linken met Excel is er weinig tijd over, en al zeker niet om verschil tussen early en late binding uit te leggen (laatste is trouwens veel moeilijker)

Ik moet dus voorbeelden uitvinden. En de code leek met nuttig om gebruik van arrays, environ functie en aanspreken van Excel te illustreren (niet alleen acties, maar ook functies)

Dus ik ga aanraden die referenties manueel te wijzigen, in de praktijk gaat het om mensen op dezelfde werkplek.

Maar destijds heb ik op Google code gevonden om via programmatie die referenties aan te passen. Waar weet ik niet meer. En de oplossing met Environ ook geïnspireerd op Google. Dus het maakt me gewoon nieuwsgierig.

Maar nu die DLL fout? Vanwaar komt die? Die komt al bij de opdracht de bestaande referentie te verwijderen.
Moest dat niet zijn dan zou je dit kunnen doen (als je zeker bent van de locatie):

Code:
Sub test2()
'If References("Excel").IsBroken Then
    References.Remove References("Excel")
    References.AddFromFile "C:\Program Files (x86)\Microsoft Office\Root\Office16\Excel.exe"
'End If
End Sub

Nu had ik een ander voorbeeld van een array en de split functie met het inlezen van tekstfiles (combobox vullen met gebruikersnamen,paswoord ophalen als gebruikersnaam wordt ingevuld, mogelijkheid paswoord te wijzigen).
Zie andere draad. Oud door een nieuw paswoord vervangen lukt, maar aan het eind van die tekstfile wordt dan elke keer een extra lege alinea geplaatst en dat veroorzaakt dan weer een fout bij het opvullen van de combobox met de mogelijke gebruikersnamen. Hoe speel ik in die tekstfile op de beste manier die lege alinea's kwijt? Ik kan on error resume next gebruiken maar dat vind ik niet echt elegant

Zie replace opdracht op de vette rode lijn

Code:
Option Compare Database
Option Explicit

Dim myFile As String, Userdata As String, textline As String, pw As String
Dim arr
Private Sub Form_Load()
'MsgBox "load"
myFile = CurrentProject.Path & "\some info.txt"
'MsgBox myFile
On Error Resume Next
Open myFile For Input As #1

    Do Until EOF(1)
        Line Input #1, textline
        Userdata = textline
        arr = Split(Userdata, ",")
        'MsgBox Left(Userdata, Left(Userdata, InStr(1, Userdata, ",") - 1))
        MsgBox arr(LBound(arr))
       cbo_UserName.AddItem Left(Userdata, InStr(1, Userdata, ",") - 1)
       'cbo_UserName.AddItem arr(0)
       

    Loop
Close #1
End Sub

Private Sub cmd_OK_Click()
myFile = CurrentProject.Path & "\some info.txt"
Open myFile For Input As #1
    Do Until EOF(1)
        Line Input #1, textline
        Userdata = textline
        arr = Split(Userdata, ",")
       
        'If Left(Userdata, InStr(1, Userdata, ",") - 1) = cbo_UserName.Value Then
        If arr(LBound(arr)) = cbo_UserName.Value Then
    
    pw = Right(Userdata, Len(Userdata) - InStr(1, Userdata, ","))
    MsgBox "pw :" & pw
    pw = arr((UBound(arr)))
 
    MsgBox "pw :" & pw

  
    Exit Do
    End If
    Loop
    
    
    
    
Close #1

If txt_Password = pw 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 textfile As Integer, FileContent As String
textfile = FreeFile
myFile = CurrentProject.Path & "\some info.txt"
Open myFile For Input As textfile
FileContent = Input(LOF(textfile), textfile)
Close textfile

[COLOR="#FF0000"][B]FileContent = Replace(FileContent, txt_Password, txt_NewPassword, 1, 1)
[/B]
[/COLOR]textfile = FreeFile

Open myFile For Output As textfile

Print #textfile, FileContent

Close textfile
MsgBox "done"
End Sub
 
Wat bedoel je met alinea's in een text bestand? Die zijn er niet.
Als je bedoelt dat de Print opdracht de Line Terminator moet weglaten dan kan je dit doen:
Print #textfile, FileContent;

Een puntkomma er achter dus.

N.B.:
Die tweede textfile = FreeFile in de Sub cmd_ChangePassword_Click() mag je weg laten.
 
Laatst bewerkt:
Bedankt, dit werkt!
Vind het wel allemaal niet echt logisch maar dat gebeurt wel meer hé :shocked:
Ik open dat tekstbestand in Word ter controle en zonder die ";" komt er telkens een alinea-teken bij:
Knipsel.JPG
En de volgende keer dat de lus om de combobox te vullen doorlopen wordt krijg je natuurlijk een fout:
Code:
Do Until EOF(1)
        Line Input #1, textline
        Userdata = textline
        arr = Split(Userdata, ",")
        'MsgBox Left(Userdata, Left(Userdata, InStr(1, Userdata, ",") - 1))
        MsgBox arr(LBound(arr))
       [B][COLOR="#FF0000"]cbo_UserName.AddItem Left(Userdata, InStr(1, Userdata, ",") - 1)
       'cbo_UserName.AddItem arr(0)[/COLOR][/B]
    Loop
 
Ok, je opent dat tekstbestand in Word.
Ja, dan veroorzaakt die line terminator inderdaad een alinea.
Door die ; wordt de line terminator onderdrukt.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan