Probleem bij bestandsgrootte 0

Status
Niet open voor verdere reacties.

anton44

Verenigingslid
Lid geworden
20 mei 2005
Berichten
1.597
Na het downloaden van een transactiebestand Transactie*.csv (*=variabele naam) wordt deze hernoemd mbv het batch bestand RB_unrar.bat naar een vaste naam.
Vervolgens wordt dat mbv visual basic geladen te worden in een Excel bestand.
Nu kan het voorkomen dat het Transactie*.csv bestand geen inhoud (bestandsgrootte 0 kB) heeft en een foutmelding geeft bij het inladen van het hernoemde bestand tr-info.txt dat ook een grootte heeft van 0 kB.
VB zegt "Fout 7 tijdens uitvoering - Onvoldoende geheugen" en foutopsporing toont de regel ".Refresh BackgroundQuery:=False"

Nu wil ik dat voorkomen maar weet daar de juiste instructie voor.

Optie 1:
In bijgaand .bat bestand RB_unrar.bat de bestandsgrootte onderzoeken en bij 0 kB een melding geven bv "Bestand zonder inhoud"
of
Optie 2
In Excel VB Sub RB102_Importeren() de bestandsgrootte van TR-info.txt onderzoeken en bij 0 kB een melding geven bv "Bestand zonder inhoud" met een call Sub_Einde (Uitgangspositie)

Code:
@echo off
rem RB_unrar.bat
set path="C:\Program Files\WinRAR\"
d:
cd\downloads\
if exist "d:\downloads\tr-info.txt" (
del "d:\downloads\tr-info*.*"
) else (
if exist "d:\downloads\Transactie*.csv" (
ren Transactie*.csv tr-info.txt
if ERRORLEVEL 0 goto einde
echo.
echo.
echo.     "Bestand niet gevonden"
pause >nul
:einde
del "d:\downloads\tr-info_*.*"
exit
))

Code:
Sub RB102_Importeren() 'Mutatiebestand Importen
     Application.ScreenUpdating = False
   
     With Sheets("Variabelen")
        Dim TempName1 As String
        TempName1 = .Range("E14") 'd:\downloads\TR-Info.txt
     End With
      
   ActiveWorkbook.Worksheets("ImportRB").Select
   With Sheets("ImportRB")
      With .QueryTables.Add(Connection:="TEXT;" & TempName1, Destination:=Range("$A$8"))
         .FieldNames = True
         .RowNumbers = False
         .FillAdjacentFormulas = False
         .PreserveFormatting = True
         .RefreshOnFileOpen = False
         .RefreshStyle = xlInsertDeleteCells
         .SavePassword = False
         .SaveData = True
         .AdjustColumnWidth = True
         .RefreshPeriod = 0
         .TextFilePromptOnRefresh = False
         .TextFilePlatform = 850
         .TextFileStartRow = 1
         .TextFileParseType = xlDelimited
         .TextFileTextQualifier = xlTextQualifierDoubleQuote
         .TextFileConsecutiveDelimiter = False
         .TextFileTabDelimiter = False
         .TextFileSemicolonDelimiter = False
         .TextFileCommaDelimiter = True
         .TextFileSpaceDelimiter = False
         .TextFileDecimalSeparator = "."
         .TextFileTrailingMinusNumbers = True
         .Refresh BackgroundQuery:=False
      End With

    End With
   
    ThisWorkbook.Connections(ThisWorkbook.Connections.Count).Delete   '->laatst aangemaakte query weer verwijderen
                
    'Importbestand wissen
        Kill TempName1
       
        Sheets("Variabelen").Select
        Range("A1:B2").Select
        Selection.ClearContents
     
    Call RB104_Filter
 
Je zou het van tevoren kunnen testen met iets als dit:
Code:
Function FileEmpty(CSV As String) As Long
    Dim bst As Long
    Dim rgl As String
    
    On Error Resume Next
    bst = FreeFile
    Open CSV For Input As #bst
    Line Input #bst, rgl
    Close #bst
    FileEmpty = Err.Number
    On Error GoTo 0
End Function

Sub RB102_Importeren()
    Dim rslt As Long
    rslt = FileEmpty(ThisWorkbook.Path & "\anton44.txt")
    If rslt <> 0 Then
        Err.Raise rslt
        Exit Sub
    End If
    [COLOR="#008000"]'Vanaf hier de import uitvoeren[/COLOR]
End Sub
 
@edmoor.
Heel veel dank voor je voorstel.
Ik ben wel geschrokken van de complexiteit.

Heb ook niet zitten afwachten en heb met Google iets gevonden voor aanpassingen in het .bat bestand om het Tr-info.txt met 0kB grootte te verwijderen.
scriptregel = for /F %%A in ("TR-info.txt") do If %%~zA equ 0 del TR-info.txt
Poging om dat te laden in Excel geeft als resultaat "Bestand niet gevonden"
Met testen kan ik concluderen dat het aan mijn verwachtingen voldoet.
Code:
@echo off
rem RB_unrar.bat
set path="C:\Program Files\WinRAR\"
d:
cd\downloads\
if exist "d:\downloads\tr-info.txt" (
del "d:\downloads\tr-info*.*"
) else (
if exist "d:\downloads\Transactie*.csv" (
ren Transactie*.csv tr-info.txt
if ERRORLEVEL 0 goto einde
echo.
echo.
echo.     "Bestand niet gevonden"
pause >nul
:einde
cd\downloads\
for /F %%A in ("TR-info.txt") do If %%~zA equ 0 del TR-info.txt
del "d:\downloads\tr-info_*.*"
exit
))
 
Welke complexiteit?
Het is een simpele VBA functie.
 
Misschien dat deze dan wat makkelijker voor je is:
Code:
Sub test()
    Set fs = CreateObject("Scripting.FileSystemObject")
    txt = "C:\Users\anton444\Desktop\Bestand.txt"
    Set f = fs.Getfile(txt)
    If f.Size = 0 Then Exit Sub
    [COLOR="#008000"]'Vanaf hier je import[/COLOR]
End Sub
 
@edmoor.
Deze variant ziet er beter uit. Sterker nog ... getest en werkt prima !
Met veel dank !
 
@edmoor.
Is er nog een aanpassing mogelijk om "bestand.txt" te killen?
 
Net zoals je zegt: Kill "Bestand.txt"
 
Dat had ik inderdaad al geprobeerd met onderstaand script
Regel 40 gewijzigd in r 40, 50 en 60.
Testen geeft aan dat dit niet werkt. Bij een goed "Bestand.txt" werkt het importeren niet meer
Code:
Sub test()
10    Set fs = CreateObject("Scripting.FileSystemObject")
20    txt = "C:\Users\anton444\Desktop\Bestand.txt"
30   Set f = fs.Getfile(txt)
40   If f.Size = 0 Then 
50   Kill "Bestand.txt"
60   Exit Sub
    'Vanaf hier je import
End Sub
 
Je moet daar wel het pad aan meegeven uiteraard.
Of je doet dit: Kill txt

Maar als 'ie weg is kan je die uiteraard niet meer importeren.
En je mist een End If

Dus:
Code:
Sub test()
   Set fs = CreateObject("Scripting.FileSystemObject")
   txt = "C:\Users\anton444\Desktop\Bestand.txt"
   Set f = fs.Getfile(txt)
   If f.Size = 0 Then 
       Kill txt
       Exit Sub
   End If
    [COLOR="#008000"]'Vanaf hier je import[/COLOR]
End Sub
 
Laatst bewerkt:
Het pad had ik wel aangegeven, maar hier verkort weergeven.
Foutmelding: Compileerfout Blok If zonder End If
 
Tjakaa Nu wel goed. Ik had een poging gedaan met de End If boven de exit sub - klonk mij logisch.
Alweer bedankt.
 
Een End If volgt altijd een If.
Daarom zijn inspringpunten zo belangrijk.
Dan kan je eenvoudig zien welke End If bij welke If hoort of dat iets mist.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan