Risolto creare un file txt se non esiste nella directory

ezio68

Utente abituale
Original poster
12 Marzo 2023
732
28
28
58
Siracusa
2021
buongiorno, come da titolo vorrei creare un file txt con l'oggetto fso però c'è qualcosa che non va. Ho usato un goto per uscire dalla sub :
Visual Basic:
Private Sub CommandButton2_Click()

    Dim FSO As Object
    Dim NEWFILE As Object
    Dim NOME_FILE As String
    Dim Elenco As Object
    Dim Elemento As Variant
    Dim nome As String
    Dim I As Long
    Dim UR As Long
    
    Set FSO = CreateObject("SCRIPTING.FILESYSTEMOBJECT")
    Set Elenco = FSO.getfolder("C:\Users\***\Desktop\test\")
    
    UR = Cells(Rows.Count, 1).End(xlUp).Row
    NOME_FILE = "nuovo.txt"
    
    For Each Elemento In Elenco.Files
        nome = nome & vbCrLf & Elemento.Name
        If Elemento.Name = NOME_FILE Then
            MsgBox "FILE ESISTENTE !"
            GoTo ESCI
        End If
        Debug.Print Elemento.Name & " - "; NOME_FILE
    Next Elemento
    
ESCI:
    MsgBox ("ELENCO DEI FILE PRESENTI : " & vbCrLf & "--------------------------------" & vbCrLf & nome)
    Exit Sub
    
    Set NEWFILE = FSO.CREATETEXTFILE("C:\Users\***\Desktop\test\" & NOME_FILE)
    
    For I = 2 To UR
        NEWFILE.WRITELINE Cells(I, 1)
    Next I
    
End Sub

ma scusate, dopo aver confrontato i vari nomi , perché non crea il file ? cosa mi sfugge ?
grazie
 

ezio68

Utente abituale
Original poster
12 Marzo 2023
732
28
28
58
Siracusa
2021
Visual Basic:
Private Sub CommandButton2_Click()

    Dim FSO As Object
    Dim NEWFILE As Object
    Dim NOME_FILE As String
    Dim Elenco As Object
    Dim Elemento As Variant
    Dim nome As String
    Dim I As Long
    Dim UR As Long
    Dim Verifica As Boolean
   
    Set FSO = CreateObject("SCRIPTING.FILESYSTEMOBJECT")
    Set Elenco = FSO.getfolder("C:\Users\***\Desktop\test\")
   
    UR = Cells(Rows.Count, 1).End(xlUp).Row
    NOME_FILE = "nuovo03.txt"
   
    For Each Elemento In Elenco.Files
        nome = nome & vbCrLf & Elemento.Name
        If Elemento.Name = NOME_FILE Then
            MsgBox "FILE ESISTENTE !"
            Verifica = True
            Exit Sub
        End If
    Next Elemento
   
    MsgBox ("ELENCO DEI FILE PRESENTI : " & vbCrLf & "--------------------------------" & vbCrLf & nome)
   
    If Verifica = False Then
        Set NEWFILE = FSO.CREATETEXTFILE("C:\Users\***\Desktop\test\" & NOME_FILE)
            For I = 2 To UR
                NEWFILE.WRITELINE Cells(I, 1)
            Next I
    End If
   
End Sub

non credevo di risolvere con una variabile di tipo boolean . scossa @scossa , praticamente devo creare un file all'interno di una cartella, ma non posso aprire la cartella di volta in volta per verificare se il file esiste ( il file assume un nome tipo 001.txt, 002.txt, 003. txt . . . quindi dovrei ricordarmi quale sia l'ultimo). Ho tolto il goto e ho utilizzato quindi una variabile di tipo boolean e pare che adesso funziona . . . c'è solo da aggiustare e/o inserire qualcosa (tipo inputbox per il nome da assegnare al nuovo file).
 

ezio68

Utente abituale
Original poster
12 Marzo 2023
732
28
28
58
Siracusa
2021
qualcosa di più completo . . .
Visual Basic:
Private Sub CommandButton2_Click()

    Dim FSO As Object
    Dim NEWFILE As Object
    Dim NOME_FILE As String
    Dim Elenco As Object
    Dim Elemento As Variant
    Dim nome As String
    Dim I As Long
    Dim UR As Long
    Dim Verifica As Boolean
    Dim fdl As FileDialog
    Dim Percorso As String
    
    Set fdl = Application.FileDialog(msoFileDialogFolderPicker)
    Set FSO = CreateObject("SCRIPTING.FILESYSTEMOBJECT")
    Set Elenco = FSO.getfolder("C:\Users\***\Desktop\test\")
    
    fdl.Show
    
    Percorso = fdl.SelectedItems(1) & "\"
    
    UR = Cells(Rows.Count, 1).End(xlUp).Row
    
    NOME_FILE = InputBox("inserisci il nome del file")
    
    If NOME_FILE = "" Then
        MsgBox ("nessun nome inserito!")
        Exit Sub
    End If
    
    For Each Elemento In Elenco.Files
        nome = nome & vbCrLf & Elemento.Name
        If Elemento.Name = NOME_FILE Then
            MsgBox "FILE ESISTENTE !"
            Verifica = True
            MsgBox ("ELENCO DEI FILE PRESENTI : " & vbCrLf & "--------------------------------" & vbCrLf & nome)
            Exit Sub
        End If
    Next Elemento
    
    If Verifica = False Then
        Set NEWFILE = FSO.CREATETEXTFILE(Percorso & NOME_FILE)
            For I = 2 To UR
                NEWFILE.WRITELINE Cells(I, 1)
            Next I
            MsgBox ("il file " & NOME_FILE & "è stato creato nella cartella " & Percorso)
    End If
    
End Sub

percorso & nome del file dinamico. Si chiede ai moderatori la chiusura di questa discussione considerata risolta. Grazie.
 

Terio

Excel/Vba Expert
Supermoderatore
6 Gennaio 2021
28.705
6.300
2.345
55
Arce
2016, 2019, 365
Si chiede ai moderatori la chiusura di questa discussione considerata risolta
Non capisco cosa ti impedisca di farlo in autonomia:unsure:
Mi sembra che scossa @scossa (ciao Marco) ti abbia dato l'indicazione corretta.

Ciao.
 

ezio68

Utente abituale
Original poster
12 Marzo 2023
732
28
28
58
Siracusa
2021
Mi sembra che .avatar--xss { width: 21px; height: 21px; line-height: 21px !important; margin-right: 2px; } scossa @scossa @scossa (ciao Marco) ti abbia dato l'indicazione corretta.
Sicuramente… purtroppo un po’ di confusione ci stare…
 
  • Like
Reactions: Terio

scossa

Excel/VBA Expert
Staff
14 Luglio 2015
4.266
1.431
145
Verona Provincia
scossavr.altervista.org
2010, 2024
qualcosa di più completo . . .
A parte altri dettagli, mi spieghi come fai a dire che quel codice funziona visto che manca un'istruzione fondamentale ?
Visual Basic:
.....
    If Verifica = False Then
        Set NEWFILE = FSO.CREATETEXTFILE(Percorso & NOME_FILE)
            For I = 2 To UR
                NEWFILE.WRITELINE Cells(I, 1)
            Next I
            MsgBox ("il file " & NOME_FILE & "è stato creato nella cartella " & Percorso)
    End If
    
End Sub

cioè la chiusura di NEWFILE con NEWFILE.Close
 

ezio68

Utente abituale
Original poster
12 Marzo 2023
732
28
28
58
Siracusa
2021
A parte altri dettagli, mi spieghi come fai a dire che quel codice funziona visto che manca un'istruzione fondamentale ?
Ciao Marco, eppure funziona lo stesso, ma per completezza di codice e soprattutto per logica di chiusura ho messo il metodo close :
Visual Basic:
Private Sub CommandButton1_Click()

    Dim FSO As Object
    Dim NEWFILE As Object
    Dim NOME_FILE As String
    Dim Elenco As Object
    Dim Elemento As Variant
    Dim nome As String
    Dim I As Long
    Dim UR As Long
    Dim Verifica As Boolean
    Dim fdl As FileDialog
    Dim Percorso As String
  
    Set fdl = Application.FileDialog(msoFileDialogFolderPicker)
    Set FSO = CreateObject("SCRIPTING.FILESYSTEMOBJECT")
    Set Elenco = FSO.getfolder("C:\Users\INFO\Desktop\test\")
  
    fdl.Show
  
    Percorso = fdl.SelectedItems(1) & "\"
  
    UR = Cells(Rows.Count, 1).End(xlUp).Row
  
    NOME_FILE = InputBox("inserisci il nome del file")
  
    If NOME_FILE = "" Then
        MsgBox ("nessun nome inserito!")
        Exit Sub
    End If
  
    For Each Elemento In Elenco.Files
        nome = nome & vbCrLf & Elemento.Name
        If Elemento.Name = NOME_FILE Then
            MsgBox "FILE ESISTENTE !"
            Verifica = True
            MsgBox ("ELENCO DEI FILE PRESENTI : " & vbCrLf & "--------------------------------" & vbCrLf & nome)
            Exit Sub
        End If
    Next Elemento
  
    If Verifica = False Then
        Set NEWFILE = FSO.CREATETEXTFILE(Percorso & NOME_FILE)
            For I = 2 To UR
                NEWFILE.WRITELINE Cells(I, 1)
            Next I
            NEWFILE.Close
            MsgBox ("il file " & NOME_FILE & "è stato creato nella cartella " & Percorso)
    End If

End Sub

invece noto una grave incoerenza in quella che era la mia idea di rendere tutto dinamico; mi spiego : che senso ha utilizzare la finestra filedialog quando poi faccio la verifica dell'esistenza del file in un percorso obbligato ?
 
Ultima modifica:

ezio68

Utente abituale
Original poster
12 Marzo 2023
732
28
28
58
Siracusa
2021
invece noto una grave incoerenza in quella che era la mia idea di rendere tutto dinamico; mi spiego : che senso ha utilizzare la finestra filedialog quando poi faccio la verifica dell'esistenza del file in un percorso obbligato ?

Visual Basic:
Set Elenco = FSO.getfolder("C:\Users\INFO\Desktop\test\")
'...........
    For Each Elemento In Elenco.Files

però non so come sfruttare l'oggetto filedialog per prendere l'insieme dei file contenuti all'interno di una cartella :

For Each Elemento in FDL.???

Domani magari aprirò un'altra discussione su questa problematica anche perché questa discussione è chiusa ed in ogni caso può essere trattato un argomento per ogni singola discussione .
Grazie di tutto Marco


Funzionerà lo stesso ma non è certo il modo di scrivere codice "solido"; come trovo quanto meno rischioso uscire "bruscamente" con Exit Sub sparsi e non distruggere esplicitamente le istanze degli oggetti creati. Ma questa è solo la mia opinione.
Marco purtroppo non conosco certe sottigliezze ma è giusto il tuo pensiero e non è una opinione .In tutti gli esempi viene utilizzato il metodo close però ho dimenticato a metterlo.

Domani magari aprirò un'altra discussione su questa problematica anche perché questa discussione è chiusa ed in ogni caso può essere trattato un argomento per ogni singola discussione .
risolto anche questo problema : ho sfruttato la stringa generata da Percorso = fdl.SelectedItems(1) & "\" e quindi mi è venuto questo flash che funziona : Set Elenco = FSO.getfolder(Percorso) . L'incastro è riuscito !

[riuniti i messaggi]​
 
Ultima modifica di un moderatore:

TheTruster

Utente abituale
Expert
19 Gennaio 2021
967
454
95
thetruster.altervista.org
LTSC 2024
Visual Basic:
    For Each Elemento In Elenco.Files
        nome = nome & vbCrLf & Elemento.Name
        If Elemento.Name = NOME_FILE Then
            MsgBox "FILE ESISTENTE !"
            Verifica = True
            MsgBox ("ELENCO DEI FILE PRESENTI : " & vbCrLf & "--------------------------------" & vbCrLf & nome)
            Exit Sub
        End If
    Next Elemento

So che la discussione è risolta e so anche che la maggior parte di questo codice fa parte del tuo studio, ma non capisco la necessità di usare questo codice per testare l'esistenza di un file, quando basta una semplice Dir.
E comunque, anche la logica di questa sezione di codice mi sembra un po' contorta, perchè la visualizzazione dell'elenco dei file esistenti dovrebbe essere spostata all'esterno del ciclo.
Così come fai adesso, se trovi un file esistente, la lista dei files esistenti è comunque parziale, perchè il ciclo si interrompe in quell'eventualità.

La logica, in pseudo codice, dovrebbe essere:

Visual Basic:
Ciclo Elementi
    Concateno i nomi nella stringa
    Verifico se il file esiste
    Se esiste
        Flag Verifica = True
    Fine Se
Prossimo Elemento

Se Flag Verifica = True
    Mostro messaggio con avviso file esistente e lista file già presenti
Altrimenti
    Il file non esiste e posso crearlo
Fine Se

TheTruster
 
  • Like
Reactions: Terio and scossa

scossa

Excel/VBA Expert
Staff
14 Luglio 2015
4.266
1.431
145
Verona Provincia
scossavr.altervista.org
2010, 2024
E comunque, anche la logica di questa sezione di codice mi sembra un po' contorta, perchè la visualizzazione dell'elenco dei file esistenti dovrebbe essere spostata all'esterno del ciclo.

Mi sembra che tutto il codice sia poco chiaro: ad esempio NEWFILE.WRITELINE Cells(I, 1) qual è il contenuto delle celle in quella colonna? L'elenco stesso dei file presenti? :dubbioso: :unsure:

P.S.:
quindi mi è venuto questo flash che funziona : Set Elenco = FSO.getfolder(Percorso) . L'incastro è riuscito !
Ezio, ma nel tuo codice Percorso non è ancora stato selezionato ?!
 
Ultima modifica:

TheTruster

Utente abituale
Expert
19 Gennaio 2021
967
454
95
thetruster.altervista.org
LTSC 2024
L'elenco stesso dei file presenti?
Suppongo siano dei dati da scrivere dentro il file, anche se ovviamente ignoro di cosa si tratti.
Comunque anche in quel caso adotterei un approccio più modulare, creando una routine di scrittura che accetti come parametri Path, NomeFile e Range da scrivere.
Infilare tutto nella stessa routine mi fa venire l'orticaria 😂

Al di là delle battute, ovviamente la moa non è una critica fine a se stressa. So che Ignazio si sta impegnando molto per migliorare, e questi consigli per me sono le classiche "best pratices" della programmazione, che ci si dovrebbe abituare a seguire fin da subito.

TheTruster
 

scossa

Excel/VBA Expert
Staff
14 Luglio 2015
4.266
1.431
145
Verona Provincia
scossavr.altervista.org
2010, 2024
So che Ignazio si sta impegnando molto per migliorare, e questi consigli per me sono le classiche "best pratices" della programmazione, che ci si dovrebbe abituare a seguire fin da subito.
Infatti, a me dispiace vedere tutto questo impegno, da parte di Ezio, speso senza un orientamento preciso; mi sembra come se "bevesse il brodo con un cucchiaio coi buchi" .....
 
  • Like
Reactions: Sgrubak

ezio68

Utente abituale
Original poster
12 Marzo 2023
732
28
28
58
Siracusa
2021
Così come fai adesso, se trovi un file esistente, la lista dei files esistenti è comunque parziale, perchè il ciclo si interrompe in quell'eventualità.
buongiorno a tutti . . .
Ti spiego : siccome devo creare un file che si trova all'interno di una cartella che ne contiene altri con nome simile ( esempio : ignazio001, ignazio002, ignazio003 . . .) non appena il nome del file inserito nell'inputbox è uguale, esce dal ciclo perché non mi interessa più continuare. Sicuramente avrei potuto utilizzare un Dir, ma voglio mettere in pratica quello che sto studiando. Ma perché non va bene scritto in questo modo : MsgBox ("il file " & NOME_FILE & "è stato creato nella cartella " & Percorso) ? lo faccio per evitare di allungare la "visione del codice" ed avere un listato più compatto . . .
scossa @scossa , in questo caso , per testare la scrittura del file ho inserito l'elenco dei mesi (ma in effetti conterrà dei numeri di 20 cifre per ogni cella ). ti rispondo con sincerità :"Infatti, a me dispiace vedere tutto questo impegno, da parte di Ezio, speso senza un orientamento preciso; mi sembra come se "bevesse il brodo con un cucchiaio coi buchi" ....." , su youtube i videocorsi che si trovano vanno tutti su questo genere, forse ci potrebbe essere qualcosa in lingua inglese, ma una cosa è leggere, un'altra cosa è ascoltare . . .
 

scossa

Excel/VBA Expert
Staff
14 Luglio 2015
4.266
1.431
145
Verona Provincia
scossavr.altervista.org
2010, 2024
su youtube i videocorsi che si trovano vanno tutti su questo genere,
E' questo il problema, ovviamente opinione strettamente personale: YT non è la fonte a cui attingere se prima non ti sei studiato un testo "serio"; questo per quanto riguarda qualsiasi linguaggio di programmazione (ribadisco IMHO).
 
  • Love
Reactions: Sgrubak

TheTruster

Utente abituale
Expert
19 Gennaio 2021
967
454
95
thetruster.altervista.org
LTSC 2024
Il problema fondamentale è che studiare la programmazione non significa studiare la sintassi di un linguaggio.
Quella è secondaria. Quello che si deve studiare è come strutturare un programma, come creare la sua architettura. Quale responsabilità ad una routine e quale ad un'altra.
E' davvero raramente una questione di linguaggio.

Tu ti stai focalizzando sul modo di ottenere quello che vuoi seguendo un tutorial su YT, senza sapere se sia o meno la metodologia più corretta. Magari la sintassi è impeccabile (ne dubito) ma il metodo?

TheTruster
 
  • Like
Reactions: Sgrubak