Foutcode 2147352567 U kunt geen waarde aan dit object toekennen

Status
Niet open voor verdere reacties.

KPTPTT

Gebruiker
Lid geworden
2 mrt 2018
Berichten
321
Hallo OctaFish. Ik gebruik een database met mogelijkheid voor opslag van bijlagen. Je hebt mij geholpen met een vraag in de periode 30 juli - 6 augustus (zoek op KPTPTT Bijlagen opslaan op een andere locatie). Het betreft een formulier Bijlagen waarin bijlagen worden opgeslagen op een centrale schijf dmv drive mapping S:/ waaronder een UNC pad en de bestandnaam in de database in een veld(en) van de tabel Bijlagen is opgeslagen.

Het opslaan van de bijlagen (bestandsnamen) gaat soms goed maar ook verkeerd. Vanwege de errorafhandeling wordt dan de melding: "Het bestand ontbreekt in de dossiermap" gegeven, hetgeen logisch is. Bij nader onderzoek (error afhandeling buiten werking) blijkt een foutmelding te worden gegeven Fout 2147352567 "U kunt geen waarde aan dit object toekennen". Dit gebeurt bij de regel: "Me.Bijlage1=funBijlageToevoegen(Me.BijlagePad1). Bijlage1 is het veld in de tabel waarin de bestandsnaam wordt opgeslagen en BijlagePad1 is het veld waarin het pad van de map wordt opgeslagen.
De voorafgaande regel FileCopy sFile etc., waarbij gekopieerd wordt met de toegewezen schijfen U: en S: netwerkverbinding/onderliggende UNC pad werkt volgens mij goed omdat de foutmelding een regel later plaatsvind.

Code:
Option Compare Database
Const defPad As String = "D:\test database\"  'PAD WAAR DE BIJLAGEN WORDEN OPGESLAGEN  (TIJDELIJK EEN ANDERE NAAM GEGEVEN EN IS s:/ SCHIJF)

Private Sub Bijlage1_DblClick(Cancel As Integer)
    On Error GoTo Hell
    If Me.Bijlage1 & "" = "" Then
        If Me.BijlagePad1 & "" = "" Then Me.BijlagePad1 = defPad   
        Me.Bijlage1 = funBijlageToevoegen(Me.BijlagePad1)           'Bestandsnaam toevoegen aan tabel Bijlagen   Doc2    HIER WORDT DE FOUTMELDING 2147352567 GEGEVEN.
    Else
        DoCmd.SetWarnings False
        Application.FollowHyperlink Me.BijlagePad1 & Me.Bijlage1
        DoCmd.SetWarnings True
    End If
    Exit Sub

Hell:
    If MsgBox("Het bestand '" & LCase(Me.Bijlage1) & "' ontbreekt in de dossiermap; wil je het verwijderen uit de lijst?", vbYesNo) = vbYes Then
        Me.Bijlage1 = Null
    End If
End Sub

Private Function funBijlageToevoegen(BijlagePad1 As String) As String       'Kopieeren van het geslecteerd bestand naar de S-schijf.
Dim sFile As String
        sFile = BestandOpzoeken(Application.CurrentProject.Path & "\")                                      '2    C:\Users\mail\Documents\Doc2.pdf
    If sFile = "Annuleren" Then Exit Function
    If Not Dir(sFile) = "" Then
        If InStr(1, sFile, "\") = 0 Or Dir(sFile) = "" Then Exit Function
        funBijlageToevoegen = Split(sFile, "\")(UBound(Split(sFile, "\")))                                  '3    S:\Doc2.pdf
        On Error Resume Next
        FileCopy sFile, BijlagePad1 & funBijlageToevoegen                  'Geselecteerde bestand kopiëren naar de S-schijf.        S:\Doc2.pdf      VOLGENS MIJ GAAT DIT GOED (ONDERLIGGEND UNC PAD)
    End If
End Function

Code:
Option Compare Database

Public Function fPadMaken(sFolder As String) As String
On Error GoTo ErrorHandler
Dim sF As String
    sF = GetPathOnly(sFolder)
    If Dir(sF, vbDirectory) = "" Then
      sF = fPadMaken(sF)
      MkDir sF
    End If
    fPadMaken = sFolder
    Exit Function
    
ErrorHandler:
    Exit Function
End Function

Public Function GetPathOnly(sPath As String) As String
    GetPathOnly = Left(sPath, InStrRev(sPath, "\", Len(sPath)) - 1)
End Function

Function BestandOpzoeken(Optional Pad As String) As String
Dim dlgPicker As Object
Dim sType() As String, sFile As String
Dim tmp As String, sPad As String
Dim bCheck As Boolean
Dim vrtSelectedItem As Variant

    On Error GoTo Hell
    If Pad = "" Then sPad = CreateObject("WScript.Shell").SpecialFolders("Mijn documenten") Else: sPad = Pad
    If Right(sPad, 1) <> "\" Then sPad = sPad & "\"
    Set dlgPicker = Application.FileDialog(3)
    With dlgPicker
        .Title = "Selecteer een bestand."                           'De titel voor het venster
        '.InitialFilename = sPad                                     'Waar moet het venster beginnen? (Dit was van een voorbeeldprogramma)
        .InitialFilename = "D:\"                                     'INSTELLING VAN HET PAD WAAR DE BIJLAGEN ZIJN OPGESLAGEN OP DE S SCHIJF (IS EEN NETWERKVERBINDING)
        With .Filters
            .Clear
            .Add "Alles", "*.*", 1                                  'Geen Beperkingen op bestandstype"
            .Add "Microsoft Word", "*.doc; *.docx; *.docm", 2       'Beperk de bestandstypes tot .doc
            .Add "Microsoft Excel", "*.xls; *.xlsx; *.xlsm", 3      'Beperk de bestandstypes tot .xls
            .Add "Adobe Reader", "*.pdf", 4                         'Beperk de bestandstypes tot .pdf"
            .Add "Afbeeldingen", "*.jpg; *.jpeg; *.png", 5          'Beperk de bestandstypes tot afbeeldingen
        End With
        .FilterIndex = 1
        .AllowMultiSelect = False                   'Slechts ??n bestand kiezen toegestaan
        .InitialView = 1                            'Bepaal weergave
        If .show = -1 Then                          'Bepaal of gebruiker op OK-knop heeft geklikt.
            sFile = .SelectedItems(1)               'Source file wordt gevuld met geselecteerde bestand
        Else
            MsgBox "De bijlage is niet opgeslagen!"
            BestandOpzoeken = "Annuleren"
            GoTo Hell                               'Reset keuzemenu
        End If
    End With
    BestandOpzoeken = sFile                                         '1    C:\Users\mail\Documents\Doc2.pdf
    
Hell:
    Set dlgPicker = Nothing                         'Reset keuzemenu

End Function

Waarom gaat het fout? Er wordt in de tabel alleen maar een bestandsnaam opgeslagen. Moet Bijlage1 nog worden gedeclareerd? Zou een Error Resume Next helpen boven de foutregel, wat doet dan On Error GoTo Hell??
 
Je kopieert een bestand; dat kost enige tijd. Wellicht dat daar het probleem zit, als de copy actie nog niet klaar is. Misschien kun je eens een time-out inbouwen, zodat de code altijd een bestand aantreft.
 
Dank, wat goed van je. Ik had ook al een vermoeden, een tijdkwestie. Hoe zou ik dat als code kunnen uitvoeren. Ik heb wel iets gedaan met een timer om een knoptekst te laten knipperen maar dat is denk ik niet geschikt.
 
Ik heb een delay timer gevonden en deze inmiddels op vertraging getest. Deze code plaats ik direct achter instructie FileCopy.
Code:
Dim T1 As Variant
Dim T2 As Variant

T1 = Now()
T2 = DateAdd("s", 2, T1)
Do Until T2 <= T1
T1 = Now()
Loop
Ik moet het resultaat in de praktijk in de database nog testen of het probleem is opgelost.
 
Dat is inderdaad wat ik in gedachte had. En dan een beetje stoeien met de duur. Wil je hem fancy maken, lees dan de filegrootte uit, en varieer de tijd op basis daarvan. Een groot bestand duurt doorgaans langer dan een klein bestand.
 
Dank. Ik ben benieuwd. Je idee met bestandsgrootte lijkt mij wel wat. Ik kan alleen over twee dagen gaan testen.
 
Alternatief voor vertraging
Code:
[LEFT][COLOR=#333333][FONT=monospace]Application.Wait (Now + TimeValue("00:00:01"))[/FONT][/COLOR][/LEFT]
 
Hallo, het heeft even geduurd met het testen van het probleem. Ik heb een tijdvertraging van inmiddels 3 seconden aangebracht na de instructie < FileCopy sFile, BijlagePad1 & funBijlageToevoegen>. Dit heeft het probleem niet verholpen. Het is de vraag of de instructie < FileCopy> hoewel te verwachten, wel het probleem is en hebt deze voor proef buiten werking gesteld. Ook nu is het probleem niet verholpen. Ik kopieer eerst zelf het beoogde bestand op de S: schijf waarna het programma dmv. Filecopy het bestand nogmaals kopieert van de S: naar de S: schijf. Ook dat helpt niet.

Bij het debuggen wordt de foutmelding gegeven bij de eerst volgende instructie daarna <"Me.Bijlage1=funBijlageToevoegen(Me.BijlagePad1)>. Bij het invoeren van de bijlagen en als het niet goed gaat, moeten we regelmatig het formulier een "paar records" terugbladeren en dan opnieuw bij de juiste record de bijlage met succes toevoegen.

Vanwege de vele bijlagen die moeten worden toegevoegd, wordt de Db niet werkbaar. Ik zou het zeer op prijs stellen met een goede tip het probleem op te kunnen lossen.
 
Hallo experts. Het testen/oplossen van het probleem heeft even geduurd. Na de goede suggestie van OctaFish over een tijdissue tijdens het kopiëren van het bijlagebestand (FileCopy), is er in tussentijd geen reactie meer op mijn vraag gegeven. Het probleem doet zich nog steeds voor en steeds verschijnt de foutcode bij het toevoegen van de bijlagen. Het gebeurt zo lang en vaak, dat er, vanwege de extra handeling van het extra moeten bladeren door de records, door de gebruikers geen bijlagen meer worden toegevoegd.

Het volgende is getest:
De functie FileCopy verwijderd en het bestand handmatig gekopieerd - geen oplossing
Extra tijdvertraging van 3 sec. na de functie FileCopy ingelast - geen oplossing. Direct hierna wordt de coderegel On Error GoTo "Hell" uitgevoerd, waarbij de foutcode optreedt.

Help svp. Wat zou het nog kunnen zijn?
Ik vind de code met Errorafhandeling voor het detecteren van de afwezigheid van de bijlage bestand in de map, twijfelachtig. Hoe zou ik dit beter kunnen oplossen?
 
Ik denk dat het fout gaat omdat je recursie gebruikt in de code. De functie is in eerste instantie bedoeld om bestanden op te zoeken en in te lezen, en dat doet-ie prima. Jij wilt hem voor een dubbele functie gebruiken (bestand invullen en bestand kopiëren) en dat mag op zich best, maar jij doet dat door de functie binnen de functie nóg een keer aan te roepen. De functie begint dan min of meer weer opnieuw, terwijl de eerst aanroep niet is afgerond. Als je een extra variabele invoegt, los je het recursieprobleem op.
Code:
Private Function funBijlageToevoegen(BijlagePad As String) As String
Dim sFile As String, [B][COLOR="#FF0000"]sFileName As String[/COLOR][/B]
Dim T1 As Variant, T2 As Variant
    sFile = BestandOpzoeken(Application.CurrentProject.Path & "\")
    If sFile = "Annuleren" Then Exit Function
    If Not Dir(sFile) = "" Then
        If InStr(1, sFile, "\") = 0 Or Dir(sFile) = "" Then Exit Function
        [B][COLOR="#FF0000"]sFileName = Split(sFile, "\")(UBound(Split(sFile, "\")))[/COLOR][/B]
        On Error Resume Next
        FileCopy sFile, BijlagePad & [COLOR="#FF0000"][B]sFileName[/B][/COLOR]
''        T1 = Now(): T2 = DateAdd("s", 2, T1)
''        Do Until T2 <= T1
''            T1 = Now()
''        Loop
        funBijlageToevoegen = sFileName
    End If
End Function

Ik heb met rood de verschillen gemarkeerd. Bij mij loopt deze versie op het netwerk als een zonnetje. Dus zelfs zonder de tijdloop (die je ook zou moeten vermijden als dat kan).
 
Wauw, bedankt. Op de meest uiteenlopende vragen heb je inzicht en geef je antwoord, hoe doe je dat? Ik heb de wijzigingen doorgevoerd en ga deze nu nog in de praktijk testen. Vanwege vakantie 3 weken personeel, kan het kan even duren en laat het je weten, bedankt.
 
Laatst bewerkt:
Hallo, het heeft even geduurd om de wijzigingen te testen. Alhoewel de software is verbeterd, is het hier voorgaande probleem blijven bestaan. Het volgende is aan de hand en kenmerkt zich door een heel vreemde situatie.

We hebben als bijlagen in de database twee soorten documenten, allebei als pdf bestand, Facturen en Opdrachten. Beide zijn afkomstig van een email bijlage en worden in de database met de hiervoor beschreven functie Bijlagen aan de database toegevoegd.
Als we een pdf Factuur als Bijlage toevoegen aan de database, dan gaat dit goed. Als we een pdf Opdracht toevoegen aan de database, dan wordt de foutmelding gegeven dat de bijlage niet in de database is te vinden, zoals in de voorgaande discussie beschreven. Vreemd en ik zie "water branden".
Voor een test hebben we beide, het Factuur bestand en het Opdracht bestand, zelf eerst in de map Bijlagen op onze (netwerkschijf) S:schijf geplaatst. Daarna hebben via de knop Bijlagen in het formulier beide bestanden vanaf de S:schijf naar dezelfde map op de S:schijf door de hiervoor aangegeven VBA code laten kopiëren. De factuur gaat goed en de opdracht niet. Je zou toch zeggen twee dezelfde pdf bestanden vanaf dezelfde schijf kopiëren naar dezelfde schijf moet goed gaan, maar nee. Als wij na de foutmelding via het formulier door de records bladeren (bv 2 records terug)en weer terugkomen op het bestemde formulier waar dmv. de knop Bijlagen de bijlagen moet worden toegevoegd, dan gaat het toevoegen van het bestand Opdracht nu wel goed.

Wie heeft een goed idee wat de oorzaak zou kunnen zijn.
 
Het problem wordt natuurlijk niet veroorzaakt doordat het ene bestand ‘Factuur’ heet en de ander ‘Opdracht’. Dat kun je ook simpel testen door de volgorde van toevoegen om te draaien, dus eerst Opdracht en dan Factuur. Dan zou het andersom moeten zijn. Het feit dat je na wat bladeren de tweede keer Opdracht wél kan toevoegen, duidt hier uiteraard ook al op.

Het lijkt er dus eerder op, gezien de noodzaak van het bladeren, dat het record niet is opgeslagen op het moment dat je het tweede bestand toevoegt. Dat is namelijk de enige verklaring die ik kan bedenken. Of er staat nog iets anders open wat het toevoegen de tweede keer tegenhoudt.
 
Dank je wel OctaFish. Ik heb niet zo veel zicht op de volgorde van het toevoegen van Bijlagen door de gebruikers. Wat ik voor een proef zou kunnen doen is nadat de Bijlagen is toegevoegd, de record door een DoCmd.RunCommand acCmdSaveRecord of door Me.Dirty etc. commando geforceerd op te slaan. De code wordt dan:
Code:
Private Sub Bijlage1_DblClick(Cancel As Integer)
    On Error GoTo Hell
    If Me.Bijlage1 & "" = "" Then
        If Me.BijlagePad1 & "" = "" Then Me.BijlagePad1 = defPad  
            Me.Bijlage1 = funBijlageToevoegen(Me.BijlagePad1)       'Bestandsnaam toevoegen aan tabel   5   Doc2
            DoCmd.RunCommand acCmdSaveRecord                        'Forced Save bijlage in de record. DIT IS TOEGEVOEGD.
    Else
        DoCmd.SetWarnings False
        Application.FollowHyperlink Me.BijlagePad1 & Me.Bijlage1
        DoCmd.SetWarnings True
    End If
    Exit Sub

Hell:                                                               'Semi foutafhandeling als de bestandsnaam niet meer in de tabelstaat en dus is gebwist.
    If MsgBox("Het bestand '" & LCase(Me.Bijlage1) & "' ontbreekt in de dossiermap; wil je het verwijderen uit de lijst?", vbYesNo) = vbYes Then
        Me.Bijlage1 = Null
    End If
End Sub

Ik laat het eindresutaat weten.
 
Het probleem is niet opgelost. De link naar het bestand en het bestand wordt nu gedwongen opgeslagen met DoCmd.RunCommand acCmdSaveRecord maar dat helpt niet. Ik zie de link en het bestand duidelijk in de tabel staan, ook zonder extra gedwongen opslag. Ten einde raad voegen we de facturen niet meer als bijlage toe. Toen we alle bijlagen in de database opsloegen werkte alles naar wens maar nu met een separate opslag gaat het mis.
 
Ik ben ook door de ideeën heen; ik heb er nooit problemen mee gehad. Ook niet op het netwerk.
Maar als je de link in het bestand ziet staan, wat is dan het probleem nog?
 
Begrijpelijk. De suggestie was, omdat er heen en weer gebladerd moet worden, dat de link niet wordt opgeslagen. Maar als de bijlagen goed worden afgehandeld zie ik in de tabel dat de link is opgeslagen, dus dat werkt. Maar soms gaat het niet goed. Uitputtend is, als ik de bijlagen opslaat, dan gaat het goed maar als iemand anders het doet, dan gaat het mis. We laten het zo hoewel tegen mijn principes, er is administratief een workarround gevonden. Bedankt voor het meedenken en tot een volgende keer.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan