Excel e gli applicativi Microsoft Office import csv con nome variabile

Login Registrati
Stai vedendo 4 articoli - dal 1 a 4 (di 4 totali)
  • Autore
    Articoli
  • #682 Score: 0 | Risposta

    Franci76
      Ciao a tutti, è la prima volta che scrivo su questo forum anche se spesso ho utilizzato le vostre soluzioni per superare una serie di ostacoli nella creazione di macro in vba. Scusatemi in anticipo se mi è sfuggito ma non trovo nulla che possa aiutarmi a risolvere il mio problema.
      In particolare ho la necessità di importare in un foglio di lavoro ("appoggio") un file .csv che il nostro IT deposita quotidianamente su una cartella di rete. Il file è denominato in questo modo "EXPORT_201801011800" dove EXPORT_ è un nome fisso, 20180101 rappresenta la data di estrazione, 1800 rappresenta l'orario di estrazione.
      Molte molte capita che l'orario di estrazione sia leggermente diverso (ad es. 1801 oppure 1805 ecc) ed in questi caso la mia query "giustamente" non trova il file.
      Ho provato a sostituire il 1800 presente nel Filename con i caratteri jolly ma la risposta è sempre la stessa ossia Errore di run-time '1004'. Ho provato anche con il Like ma forse ho sbagliato qualcosa e non funziona ugualmente.
      Chiedo il vostro aiuto grazie
      Di seguito la mia macro:
      Sub importa()
      Dim percorso As String, data As String,  Filename As String
      Sheets("Aggiorna report").Select
      percorso = Range("D7") & "\" 'in questa cella indico la cartella di rete
      data = Range("D5") 'in questa cella ho prima selezionato da una tendina la data di cutoff che è nel seguente formato aaaammgg
      Filename = "EXPORT_" & data & "1800" & ".CSV"
      Sheets("appoggio").Select
      Range("A1").Select
      ActiveCell.Offset(1, 0).Range("A1").Select
      ' importo csv
      With ActiveSheet.QueryTables _
      .Add(Connection:="TEXT;" & percorso & Filename, Destination:=ActiveCell)
      .FieldNames = True
      .RowNumbers = False
      .FillAdjacentFormulas = False
      .PreserveFormatting = True
      .RefreshOnFileOpen = False
      .RefreshStyle = xlInsertDeleteCells
      .SavePassword = False
      .SaveData = True
      .AdjustColumnWidth = True
      .RefreshPeriod = 0
      .TextFilePromptOnRefresh = False
      .TextFilePlatform = 1252
      .TextFileStartRow = 1
      .TextFileParseType = xlDelimited
      .TextFileTextQualifier = xlTextQualifierDoubleQuote
      .TextFileConsecutiveDelimiter = False
      .TextFileTabDelimiter = True
      .TextFileSemicolonDelimiter = True
      .TextFileCommaDelimiter = False
      .TextFileSpaceDelimiter = False
      .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
      .TextFileTrailingMinusNumbers = True
      .Refresh BackgroundQuery:=False
      End With
      ' seguono tutte le mie elaborazioni
      End Sub
      • Questo argomento è stato modificato 8 anni, 2 mesi fa da  albatros54.
      #683 Score: 0 | Risposta

      Luca73
      Partecipante
        58 pts
        Ciao
        una possibile soluzione penso potrebbe essere cercare tra tutti i file che stanno nella cartella quello che corrisponde al criterio
        Ho buttato giù due righe (senza poterle verificare) completamente.
        Sono da inserire in sostituzione della riga
        Filename = “EXPORT_” & data & “1800” & “.CSV”
        Aggiungi in testa le variabili
        Dim fs, f, fileW
        il codice potrebbe essere qualcosa del genere
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set f = fs.GetFolder(percorso)
        For Each fileW In f.Files
            If Left(fileW.Name, 15) = "EXPORT_" & Data Then
                 If UCase(Right(fileW.Name, 3)) = "CSV" Then
                     If ((Mid(fileW.Name, 16, 4) * 1 > 1745) And (Mid(fileW.Name, 16, 4) * 1 < 1815)) Then
                         filename = fileW.Name
                        Exit for
                    End If
               End If
          End If
        Next
        Set fs = Nothing
        Set f = Nothing
        null'altro fa che cercare tra i file nella cartella percorso quello che corrisponde al tuo criterio
        al momento ho ipotizzato 15 minuti di anticipo/ritardo. se questo non è un problema si potrebbe sostuituire tutti gli if con un solo if e la funzione like
        if ((UCase(fileW.Name)) Like ("EXPORT_" & Data & "1[7-8]##" & ".CSV")) Then
        Ciao
        Luca
        #685 Score: 0 | Risposta

        Franci76
          Grazie Luca73,
          non avevo dubbi sulla possibilità di trovare qui una soluzione.
          Funziona tutto alla grande ed ho utilizzato un solo If con il like in quanto il range di anticipo/ritardo potrebbe essere anche più ampio di 15 minuti. Unica pecca è la velocità anche perchè l'If analizza ogni singolo file presente nella cartella di rete. Nessun problema comunque.
          Grazie mille
          #686 Score: 0 | Risposta

          Luca73
          Partecipante
            58 pts
            Forse ho trovato qualcosa di più semplice e rapido
            Sub pippo()
            Dim fName As String
            Dim data
            data = "20180101"
            fName = Dir(percorso & " \EXPORT_" & data & "1???.csv")
            If fName = "" Then
            ' File not found!
            Else
            ' File found. Open file to extract data.
            End If
            End Sub
            Nel caso potresti fare due ricerche con
            fName = Dir(percorso & " \EXPORT_" & data & "17??.csv")
            e
            fName = Dir(percorso & " \EXPORT_" & data & "18??.csv")
            Ciao
            Luca
            • Questa risposta è stata modificata 8 anni, 2 mesi fa da  Luca73.
            • Questa risposta è stata modificata 8 anni, 2 mesi fa da  albatros54.
          Login Registrati
          Stai vedendo 4 articoli - dal 1 a 4 (di 4 totali)
          Rispondi a: import csv con nome variabile
          Gli allegati sono permessi solo ad utenti REGISTRATI
          Le tue informazioni: