Access violation error bij het inlezen van een CVB-bestand aangemaakt door Excel VBA

Status
Niet open voor verdere reacties.

dendalle

Gebruiker
Lid geworden
21 mrt 2014
Berichten
25
Hallo iedereen,

Ik heb een VBA code geschreven zodat ik cijfers die in excel staan kan omvormen en opslaan als een csv-bestand. De bedoeling is dat ik dit csv-bestand nadien dan kan inlezen in een ander programma.
Echter wanneer ik in dit ander programma het CSV-bestand wil inlezen krijg ik de foutcode in bijlage

Ik vroeg me hoe ik dit kan oplossen en of dit dan in de VBA-code kan geïmplementeerd worden.

Dit is de code waarmee het VBA-bestand word aangemaakt

Code:
Set Huidig = ActiveWorkbook
Dim wks As Worksheet
 Dim newWb As Workbook
 
 Set wks = Worksheets("Uit te lezen data")
 wks.Copy 'to a new workbook
 Set newWb = ActiveWorkbook
 
 With Application
    .DisplayAlerts = False
        With newWb
          .SaveAs Filename:=Huidig.Sheets("Algemeen").Range("A2") & "Accon" & ".csv", FileFormat:=xlCSVMSDOS
          .Close SaveChanges:=True
        End With
    .DisplayAlerts = True
 End With

 Set wks = Nothing
 Set newWb = Nothing

Alvast bedankt!
 

Bijlagen

  • Access violation.JPG
    Access violation.JPG
    16,4 KB · Weergaven: 71
Ik dacht dat dit nodig was voor de vorm van het csv-bestand, maar ik zie precies dat dit niet echt uit maakt. Maar hoe dan ook, ook bij die extensie krijg ik dezelfde foutmelding wanneer ik het csv-bestand wil inlezen in het andere programma.
 
wat met:

Code:
sub M_snb()
  thisworkbook.sheets("Uit te lezen data").Copy 
 
  with activeworkbook
    .SaveAs "G:\OF\snb.csv", 23
    .Close 0
  End With
 End Sub
 
Als ik die foutcode zie zou ik "het andere programma" heel serieus bekijken en wantrouwen. Blijkbaar geen goede inputvalidatie, mogelijk een buffer probleempje. Zeker niet veilig geprogrammeerd anders zou je niet met een zero-pointer zitten.

Is het mogelijk om een enkele regel van het CSV-bestand te plaatsen? eventueel met gevoelige data veranderd in generieke data
 
wat met:

Code:
sub M_snb()
  thisworkbook.sheets("Uit te lezen data").Copy 
 
  with activeworkbook
    .SaveAs "G:\OF\snb.csv", 23
    .Close 0
  End With
 End Sub

Dit geeft nog steeds een access violation error

Als ik die foutcode zie zou ik "het andere programma" heel serieus bekijken en wantrouwen. Blijkbaar geen goede inputvalidatie, mogelijk een buffer probleempje. Zeker niet veilig geprogrammeerd anders zou je niet met een zero-pointer zitten.

Is het mogelijk om een enkele regel van het CSV-bestand te plaatsen? eventueel met gevoelige data veranderd in generieke data
Zie bijgevoegd bestand.Bekijk bijlage Accon.csv

Nu vermoed ik dat het ergens komt omdat VBA dit bestand aanmaakt en dit op een of andere manier beveiligd, omdat ik ook een error krijg wanneer ik bijvoorbeeld vanuit een webbrowser een ander csv-bestand download en het aangemaakte bestand wil overschrijven. Vandaar dat ik denk dat het in de VBA-code te zoeken is. (maar dat is maar een gedacht :) )
 
svp niet quoten/citeren !

Excel beveiligt niets.
Het ander programma is het probleem.
Fantaseer niet over VBA, maar zoek op wat je niet begrijpt.
 
Bedankt voor de uitleg, maar ik vind het dan toch raar dat bijvoorbeeld 'Google Chrome' er ook niet in slaagt om het aangemaakte csv-bestand te overschrijven met een ander csv-bestand en de melding geeft "Mislukt - Onvoldoende rechten".
Dus ergens moeten er toch rechter worden toegekend aan het aangemaakte csv-bestand die anders zijn dan andere bestanden? Of begrijp ik dit verkeerd?
 
Als je een csv (of welk ander format dan ook) exporteert vanuit Excel blijft het bestand wel open staan, onder de nieuwe naam. Weet je zeker dat het is afgesloten voordat je het probeert te overschrijven? Want dat lukt inderdaad niet als je het open hebt staan in Excel.
 
Het bestand is wel degelijk gesloten wanneer ik het wil overschrijven.
 
Je schreef toch dat je het csv-bestand in accon wilde inlezen ?
Dat heeft toch niets met overschrijven te maken ?
 
Als ik zo moet gokken:

De CSV is in principe juist geformateerd en zou valide moeten zijn. Mogelijk is er ergens een probleem met conversie met decimalen oid. De output lijkt echter compliant dus het is echt een probleem met de parser
 
Laatst bewerkt:
Misschien dat accon al die lege regels vanaf regel 21 niet accepteert.
Of dat er een ; gebruikt moet worden in plaats van een , als scheidingsteken.

Zet dus eens dit achter het SaveAs commando:
, Local:=True
 
Laatst bewerkt:
Maar dan mag het geen CSV meer heten. Comma Seperated Values, MOETEN per definitie gescheiden worden met komma. Als het wel werkt met ";" is het dus geen CSV.
 
@wampier.

Dat is onjuist.
CSV staat voor een field separated file.
De fieldseparator kan variëren, dat doet niets af aan het karakter van het bestand: platte ASCII-tekens met lijstscheidingstekens en rijscheidingstekens.

Kijk voor de lol in Excel ook nog eens naar het argument 'local=true'.

Een oorsponkelijk bedachte naam hoeft niet altijd letterlijk overeen te komen met een bepaalde inhoud.(de Tweede Kamer is toch echt meer een zaal dan een kamer).
 
Laatst bewerkt:
Beste,

Is het mogelijk om dit ook als dialoogvenster weer te geven? Nu wordt dit naar een bepaalde locatie opgeslagen, maar ik zou de gebruiker eigenlijk willen laten kiezen waar ze dit opslaan.

De code die er nu staat is:

Code:
Set wks = Worksheets("Uit te lezen data")
        wks.Copy 'to a new workbook
        Set newWb = ActiveWorkbook
        With Application
            With newWb
                .SaveAs Huidig.Sheets("Algemeen").Range("A2") & "Accon.csv", 23, Local:=True
                .Close SaveChanges:=True
            End With
        End With
 
CSV staat voor een field separated file.

Comma Separated Values
Daarbij mag het scheidingsteken inderdaad anders zijn dan een komma ;)
 
Laatst bewerkt:
Probeer het eens zo:
Code:
Sub tst()
    pad = GetFolder
    If pad = "" Then Exit Sub

    Set wks = Worksheets("Uit te lezen data")
    wks.Copy 'to a new workbook
    Set newWb = ActiveWorkbook
    With Application
        With newWb
            .SaveAs pad & "\" & Huidig.Sheets("Algemeen").Range("A2") & "Accon.csv", 23, Local:=True
            .Close SaveChanges:=True
        End With
    End With
End Sub

Function GetFolder() As String
    Dim fldr As FileDialog
    Dim sItem As String
    Set fldr = Application.FileDialog(msoFileDialogFolderPicker)
    With fldr
        .Title = "Select a Folder"
        .AllowMultiSelect = False
        .InitialFileName = Application.DefaultFilePath
        If .Show = -1 Then sItem = .SelectedItems(1)
    End With
    GetFolder = sItem
    Set fldr = Nothing
End Function
 
@DenDalle

Je vraagt nu een goede code te verslechteren.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan