• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Data uit bestanden tot een bepaalde datum importeren

Status
Niet open voor verdere reacties.

LJA

Gebruiker
Lid geworden
23 mrt 2017
Berichten
18
Hallo,

in een map staan excelbestanden met verschillende datum van opslag.
Alleen uit excelbestanden van VOOR een bepaalde datum wil ik de data importeren.
Het importeren van alle excelbestanden was gelukt dmv de "Filename" en een loop.
Nu heb ik geprobeerd om de datum-voorwaarde in de loop toe te voegen door o.a. "FileFSO" te gebruiken en "String" te wijzigen naar "Object", maar dat werkt nog niet.
Ik stoei met de definitie van "String" en "Object" en blijft daarom een foutmelding 91 krijgen.

Ik heb nu de volgende code:
Code:
Private Sub MT_CopyDataWorkbooksIntoMaster()

Dim FolderPath As String
Dim FileFSO As Object
Dim Filepath As Object
Dim Filename As Object

FolderPath = "C:\Mijn Documenten\Excel\PLANNINGEN - TEST\"

Set FileFSO = CreateObject("Scripting.FileSystemObject")
Set FileFolder = FileFSO.GetFolder(FolderPath)
Set Filepath = FolderPath & "*.xls*"
Set Filename = Dir(Filepath)

Dim lastrow As Long, lastcolumn As Long

Do While Filename <> "" And Format(Filename.DateLastModified, "DD-MM-YYYY") < Format(DateValue("01-12-2017"), "DD-MM-YYYY")
 
'Werkmap openen
Workbooks.Open (FolderPath & Filename), UpdateLinks:=3, Notify:=False
'Alle Kolommen zichtbaar maken
 ActiveSheet.Cells.EntireColumn.Hidden = False
'Laatste Rij vinden
 lastrow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
'Kolommen met ProjectNummer en ProjectNaam
 Columns("A:A").Select
 Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
 Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
 Range("A1").FormulaR1C1 = "=R1C4"
 Range("B1").FormulaR1C1 = "=R2C4"
 Range("A1:B1").AutoFill Destination:=Range(Cells(1, 1), Cells(lastrow, 2)), Type:=xlFillDefault
'Laatste Kolom vinden
 lastcolumn = ActiveSheet.Cells(4, Columns.Count).End(xlToLeft).Column
'Range(“A6:**”) kopieren en werkmap sluiten
 Range(Cells(6, 1), Cells(lastrow, lastcolumn)).Copy
 ActiveWorkbook.Close

erow = Blad1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
lastcolumn = ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Column

ActiveSheet.Paste Destination:=Worksheets("Blad1").Range(Cells(erow, 1), Cells(erow, lastcolumn))

Filename = Dir

Loop

Hopelijk kan iemand me verder helpen.
 
Gebruik FileDateTime(Filename) om de datum laatste wijziging van een bestand te krijgen, dan is dat FSO deel overbodig. Overigens is dit allemaal een stuk makkelijker met Ophalen&transformeren (als je Excel 2016 hebt op het lint bij Gegevens, heb je een oudere versie, download dan PowerQuery)
 
Met de volgende code krijg ik nog een foutmelding (53).

Code:
Private Sub MT_CopyDataFromWorkbooksIntoMaster()

Dim FolderPath As String, Filepath As String, Filename As String

FolderPath = "H:\Mijn Documenten\Excel\PLANNINGEN - TEST\"

Filepath = FolderPath & "*.xls*"

Filename = Dir(Filepath)

Dim lastrow As Long, lastcolumn As Long

Do While Filename <> "" And Format(FileDateTime(Filename), "DD-MM-YYYY") < Format(DateValue("01-11-2017"), "DD-MM-YYYY")

Ontstaat dit door de "And" of de "<" vergelijking?
Hopelijk wil iemand mij nog wat verder helpen.
 
Ik geloof dat Dir niet het pad meegeeft als resultaat, dus:
Code:
Do While Filename <> "" And FileDateTime(FolderPath & Filename) < (DateValue("2017-11-01")
 
Errorcodes kan je vrij eenvoudig vinden op internet. (Run time error 53.. File Not Found)

Dus eerst maar eens opzoek naar de fout

Wat voor bericht krijg je als je deze code gebruikt?
Code:
Sub VenA()
c00 = "H:\Mijn Documenten\Excel\PLANNINGEN - TEST\"
  For Each it In Split(CreateObject("Wscript.Shell").Exec("cmd /c dir """ & c00 & "*.xls*"" /b").StdOut.ReadAll, vbCrLf)
    If it <> "" Then c01 = c01 & it & " " & FileDateTime(c00 & it) & " " & (FileDateTime(c00 & it) < Date - 60) & vbLf
  Next it
  MsgBox c01
End Sub
 
Errorcodes kan je vrij eenvoudig vinden op internet. (Run time error 53.. File Not Found)

Je kan ook dit in het Direct venster van de VBE intikken:
Code:
err.raise 53
Dan zie je de foutmelding ook.
Dat kan met iedere foutcode.
 
@edmoor, de melding krijg je toch al bij het uitvoeren van de code? Waarom dan deze in het indirect venster opvragen? Even google gebruiken en je komt dan vaak op mrexcel.com of excelforum.com terecht en kan je dan ook gelijk oplossing(en) vinden. bv err.raise 91 geeft een melding waar velen weinig mee kunnen.

Een beetje off topic maar hoe kan je de lijst met foutcodes middels VBA opvragen? Dit werkt iig niet en kan er eigenlijk weinig over vinden.
Code:
Sub test()
  For Each it In ErrObject
    MsgBox it.Number
  Next
End Sub
 
Of gewoon in de Help van Vba (Onderschepbare fouten).

Ik lees dat Err een ingebouwde object is.
Code:
Option Explicit
Option Base 1
Sub test()
Dim i As Long, sv(746), n As Long
 For i = 1 To 746
   If error(i) <> "Door de toepassing of door object gedefinieerde fout" Then
    n = n + 1
    sv(n) = "foutnummer " & i & vbCrLf & error(i)
  End If
Next i
Cells(1).Resize(n) = Application.Transpose(sv)
End Sub
 
bestanden vóór 01-01-2016, gesorteerd op datum:

Code:
Sub M_snb()
    sn = Split(CreateObject("wscript.shell").exec("cmd /c dir ""G:\OF\*.csv"" /b/od").stdout.readall, vbCrLf)
    
    ReDim sp(UBound(sn), 1)
    For j = 0 To UBound(sn) - 1
       
      sp(j, 0) = "G:\OF\" & sn(j)
      sp(j, 1) = FileDateTime(sp(j, 0))
      If sp(j, 1) > DateSerial(2016, 1, 1) Then Exit For
    Next
    
    Cells(1, 5).Resize(j, 2) = sp
End Sub
 
Laatst bewerkt:
@edmoor, die had ik inderdaad ook openstaan en geeft net iets meer uitleg dan de door @HSV:thumb: geplaatste code.
 
Bedankt voor alle reacties! Met name de PDF-lijst met foutcodes is handig.

Ik denk dat ik de oplossing in de richting van jkpieterse moet zoeken.
Bij de toepassing van een "wscript.shell" krijg ik namelijk de volgende foutmelding:
"Fout-2147024891 (80070005) tijdens uitvoering: Toegang geweigerd."
(Dit zou op te lossen zijn door het beveiligingsniveau te wijzigen, maar daar ben ik op ons netwerk niet toe gemachtigd.)

Wanneer ik de regel van jkpieterse in mijn code voeg, krijg ik geen foutmelding. (Dat lijkt goed nieuws. ; )
Maar vervolgens wordt er helemaal geen planning meer geopend. Terwijl er toch echt planningen van VOOR 01-11-2017 aanwezig zijn in de beschreven test-map.

Ik heb de regel van jkpieterse nog aangepast naar de volgende code, maar dat werkt ook niet. De loop wordt meteen beëindigd, alsof er geen planning in de test-map aanwezig is, die aan de gestelde voorwaarden voldoet.
Code:
Do While Filename <> "" And Format(FileDateTime(FolderPath & Filename), "DD-MM-YYYY") < Format(DateValue("01-11-2017"), "DD-MM-YYYY")

Hopelijk kan iemand mij hiermee verder helpen.
 
Dat regeltje zegt niets omdat het niet toont hoe de variabele Filename wordt gevuld en die is kennelijk leeg of voldoet niet aan de andere voorwaarden.
 
Test met:

Code:
Sub M_snb()
    msgbox CreateObject("wscript.shell").exec("cmd /c dir ""C:\Mijn Documenten\Excel\PLANNINGEN - TEST\*.csv"" /b/od").stdout.readall
end sub

PS. vermijd foldernamen met spaties en verbindingsstreepjes.
 
Laatst bewerkt:
Je code is niet juist.
Als Filename leeg is geeft deze regel:
Code:
Do While Filename <> "" And Format(FileDateTime(FolderPath & Filename), "DD-MM-YYYY") < Format(DateValue("01-11-2017"), "DD-MM-YYYY")
sowieso een foutmelding (gegenereerd door de filedatetime functie, die een fout geeft bij niet bestaande bestanden). Verder is de gebruik maken van de format functie hier overbodig en zelfs fout omdat deze een datum omzet in tekst. Je wilt twee datum waarden vergelijken, niet twee in tekst omgezette datum waarden.

Waarom is dit belangrijk?

30-3-2017 is groter dan 31-1-2017
maar
"30-3-2017" is KLEINER dan "31-1-2017"
 
@VenA:
Ik had de codes bij #5 en #14 geprobeerd en de vragen beantwoord:
Bij de toepassing van een "wscript.shell" krijg ik namelijk de volgende foutmelding:
"Fout-2147024891 (80070005) tijdens uitvoering: Toegang geweigerd."
(Dit zou op te lossen zijn door het beveiligingsniveau te wijzigen, maar daar ben ik op ons netwerk niet toe gemachtigd.)

Had ik deze vragen beter op een andere wijze geantwoord?

@jkpieterse:
Dat mijn code tot op heden niet juist is, heb ik helaas zelf al ervaren. Ik ben op zoek naar een code, die wel werkt. ; )

@:
Mijn kennis en ervaring in VBA-codering blijkt helaas nog niet groot genoeg om de code zelf werkend te krijgen.
Daarom vraag ik leden op dit forum met meer kennis en ervaring om mij verder te helpen met een wel werkende code.
Ik verneem graag wat wel werkt (en niet zo zeer, wat niet werkt. Want dat heb ik meestal zelf al ervaren. ; )

PS: Als wat ik wil bereiken met de code niet mogelijk is, bijvoorbeeld door het binnen mijn werkomgeving ingestelde (en afgeschermde) beveiligingsniveau, verneem ik dat ook graag. Dan zie ik mij namelijk genoodzaakt mijn zoektocht te staken...

Bij deze wens ik alle forumleden alvast fijne kerstdagen en een mooi 2018 met een goede gezondheid en veel plezier!
 
Ik zit nog steeds op een reaktie op mijn suggestie te wachten.
 
@snb:
Ook uw codes bij #10 en #14 had ik geprobeerd, waarbij ik de streepjes en spaties uit de foldernaam heb verwijderd. ; )
Ook hierbij krijg ik helaas (door de toepassing van een "wscript.shell"?) de volgende foutmelding:
"Fout-2147024891 (80070005) tijdens uitvoering: Toegang geweigerd."
(Dit zou op te lossen zijn door het beveiligingsniveau te wijzigen, maar daar ben ik op ons netwerk niet toe gemachtigd.)
Heb ik hiermee uw vraag correct beantwoord en de situatie verduidelijkt?

Ik hoop echt dat iemand de door mij aangedragen uitdaging kan realiseren met een binnen mijn werkomgeving wel werkende code...
 
Ik vraag me af of je dan wel überhaupt handmatig een bestand uit deze directory kunt openen.

Alvorens systeembeheer lastig te vallen:
Maak een eigen directory aan.
Zet daar een aantal van de csv bestanden waar het om gaat.
Pas het pad in de door mij gesuggereerde code aan.
Voer de code uit.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan