Condividi tramite

Numerazione progressiva di Files in una determinata cartella.

Anonimo
2015-10-25T11:44:59+00:00

Buona domenica a tutti, ho messo su questo codice che mi numera in progressione dei files  in una determinata cartella.

Il problema che la numerazione è sballata cois come da immagine  allegata.

Dopo il file nr 19 dovrebbe venire il file nr 20 invece il file è 110.

Mi aiutate a capire perchè la numeraione non è consecutiva?

Sub rinomina()

   Dim NomeFiglio, NomeEstensione, Cartella, Conta

   Dim v As String

   v = Application.InputBox("Inserisci il Numero di partenza", "NUMERAZIONE PROGRESSIVA DEI FILES")

   Cartella = "C:\Users\Nicola\Desktop\Nuova cartella"

   NomeFiglio = Dir(Cartella, vbDirectory)

   Conta = 0

   Do While NomeFiglio <> ""

      If (GetAttr(Cartella & NomeFiglio) And vbDirectory) <> vbDirectory Then

        NomeEstensione = Right(NomeFiglio, Len(NomeFiglio) - InStrRev(NomeFiglio, ".") + 1)

        Name Cartella & NomeFiglio As Cartella & Format(Conta, v) & NomeEstensione

        Conta = Conta + 1

      End If

      NomeFiglio = Dir

  Loop

  MsgBox "Sono stati rinominati: " & Conta & " Files!", vbInformation

End Sub

Ciao Nicola.

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

  1. Anonimo
    2015-10-26T13:19:23+00:00

    Ciao Nicola,

    Per motivi diagnostici, prova a eseguire il seguente adattamento del mio codice:

    '==========>>

    Option Explicit

    '--------->>

    Public Sub RenameFiles()

        Dim vPath As Variant, vFirstNumber As Variant, vPrefix As Variant

        Dim sMsg As String, sTitle As String

        Dim iButtons As Long

        Dim sStr As String

        sStr = Application.PathSeparator

        vPath = Application.InputBox(Prompt:="Inserisci il percorso della cartella " _

                                           & "dei file da rinominare," _

                                           & " ad esempio: ABC", _

                                     Title:="PERCORSO DI CARTELLA", _

                                     Default:="C:\Users\Nicola2", _

                                     Type:=2)

        If vPath = "False" Or vPath = vbNullString Then

            sMsg = "Non hai fornito un percorso - Ripova!"

            iButtons = vbCritical

            sTitle = "ERRORE - PERCORSO MANCANTE"

            GoTo XIT

        End If

        If Right(vPath, 1) <> sStr Then

            vPath = vPath & sStr

        End If

        vFirstNumber = Application.InputBox(Prompt:="Inserisci il Numero di partenza", _

                                            Title:="NUMERAZIONE PROGRESSIVA DEI FILES", _

                                            Default:=1, _

                                            Type:=1)

        If vFirstNumber = "False" Then

            sMsg = "Non hai fornito un numero iniziale - Ripova!"

            iButtons = vbCritical

            sTitle = "ERRORE - RIPPROVA"

            GoTo XIT

        End If

        vPrefix = Application.InputBox(Prompt:="Inserisci un prefisso per i file," _

                                             & " ad esempio: ABC", _

                                       Title:="PREFISSO OPZIONALE", _

                                       Default:="", _

                                       Type:=2)

        Call RenominaFilePogressivamente(vPath, vFirstNumber, vPrefix)

        Exit Sub

    XIT:

        Call MsgBox(Prompt:=sMsg, Buttons:=iButtons, Title:=sTitle)

    End Sub

    '--------->>

    Public Function RenominaFilePogressivamente(myFolderPath, _

                                                Optional FirstNumber = 1, _

                                                Optional sPrefix)

        Dim oFSO As Object

        Dim oFolder As Object

        Dim oFiles As Object

        Dim oFile As Object

        Dim iCtr As Long, jCtr As Long, iPos As Long

        Dim sStr As String, aStr As String, sExt As String

        Dim oldName As String

        Dim V As Variant

        Dim sMsg As String, sTitle As String

        Dim iButtons As Long

        Dim arrOther() As Variant

        Set oFSO = CreateObject("Scripting.FileSystemObject")

        Set oFolder = oFSO.GetFolder(myFolderPath)

        Set oFiles = oFolder.Files

        For Each oFile In oFiles

            With oFile

                oldName = .Name

                iPos = InStrRev(.Name, ".")

                sExt = Right(.Name, Len(.Name) - iPos + 1)

                If UCase(sExt) = ".PDF" Then

                    .Name = sPrefix & FirstNumber + iCtr & sExt

                    iCtr = iCtr + 1

                    Debug.Print iCtr & vbTab; "Old: " & oldName; vbTab _

                              & "New: " & oFile.Name

            Else

                jCtr = jCtr + 1

                ReDim Preserve arrOther(1 To jCtr)

                arrOther(jCtr) = .Name

            End If

            End With

        Next oFile

        sMsg = "Sono stati rinominati: " _

             & iCtr & " Files!"

        iButtons = vbInformation

        sTitle = "# FILE RINOMINATI"

    XIT:

        Call MsgBox(Prompt:=sMsg, Buttons:=iButtons, Title:=sTitle)

        If CBool(jCtr) Then

            aStr = Join(arrOther, vbNewLine)

            sMsg = "I seguenti " & jCtr & "file non pdf sono stato trovati:" _

                 & vbNewLine & vbNewLine & aStr

             Call MsgBox(sMsg, vbInformation, "FILE NON PDF")

        End If

    End Function

    '<<=========

    Ho cominciato con questa cartella C:\Users\Nicola2\

    Ho eseguito il codice, scegliendo 1 come primo numero e AAA come prefisso. Ho ricevuto i due messagi:

    e

    Nella finestra Immediate vedo

    Poi, riguardando la cartella, vedo:

    Postscriptum:

    Quando ho inviato questa risposta, non vedevo la risposta precedente di Mauro.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento

Risposta accettata dall'autore della domanda

  1. Anonimo
    2015-10-26T13:16:48+00:00

    Neppure io.

    A me il codice di Norman funziona tranquillamente.

    Sicuro che nella cartella ci siano SOLO i file che credi/vedi?

    Rifai la cartella nuova. Copiaci i file e fai girare questa macro (modifica la parte in grassetto con il tuo riferimento):

    Public Sub m()

        Dim objFSO As Object

        Dim objFolder As Object

        Dim objFile As Object

        Dim sPath As String

        Dim lCont As Long

        Dim lCount As Long

        lCont = 0

        sPath = "**C:\TestPDF**"

        Set objFSO = CreateObject("Scripting.FileSystemObject")

        Set objFolder = objFSO.GetFolder(sPath)

        lCount = objFolder.Files.Count

        For Each objFile In objFolder.Files

            If Right(objFile.Name, 4) = ".pdf" Then

                lCont = lCont + 1

            End If

        Next

        MsgBox "Fle totali: " & lCount & _

            vbNewLine & "File .pdf: " & lCont

    RigaChiusura:

        Set objFile = Nothing

        Set objFolder = Nothing

        Set objFSO = Nothing

        Exit Sub

    End Sub

    Questa invece ti restituisce, sempre prima della trasformazione del nome, eventuali file non .pdf:

    Public Sub m()

        Dim objFSO As Object

        Dim objFolder As Object

        Dim objFile As Object

        Dim sPath As String

        Dim lCont As Long

        Dim s As String

        sPath = "**C:\TestPDF**"

        Set objFSO = CreateObject("Scripting.FileSystemObject")

        Set objFolder = objFSO.GetFolder(sPath)

        For Each objFile In objFolder.Files

            If Right(objFile.Name, 4) <> ".pdf" Then

                lCont = lCont + 1

                s = s & objFile.Name & vbNewLine

            End If

        Next

        MsgBox "Fle non .pdf: " & lCont & vbNewLine & s

    RigaChiusura:

        Set objFile = Nothing

        Set objFolder = Nothing

        Set objFSO = Nothing

        Exit Sub

    End Sub

    Ovviamente dovresti sapere a priori quanti file ci sono nella cartella per confrontarli con il MsgBox.

    La risposta è stata utile?

    0 commenti Nessun commento

12 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2015-10-25T18:59:28+00:00

    Ciao Mauro, grazie infinte per la spiegazione molto professionale ed esaustiva.

    Ciao Norman, è vero quando rinominavo i files questi non ripartivano mai dal numero impostato nella InputBox ma si aggiungeva altra numerazione e cosi che ottenevo una numerazione confusa e sbagliata.

    Comunque ho notato che mi conta 31 files anziché 30(sono 30 quelli realmente presenti nella cartella), perchè questo Norman?

    Ciao Nicola.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2015-10-25T18:06:24+00:00

    Ciao Nicola,

    Oltre alla risposta di Mauro, credo ci sono diverse problemi con tuo uso della funzione Dir(). Non meno di questi sarebbe il fatto che, come scritto, il tuo codice potrebbe, durante lo stesso ciclo di esecuzione della macro, rinomina un file precedentemente rinominato. In questo modo ci potrebbero essere delle lacune nella numerazione. Inoltre, il codice domanda che l'utente fornisca un numero iniziale, ma poi non utilizza mai quel numero iniziale!

    Prova quindi qualcosa del genere:

    '==========>>

    Option Explicit

    '--------->>

    Public Sub RenameFiles()

        Dim vPath As Variant, vFirstNumber As Variant, vPrefix As Variant

        Dim sMsg As String, sTitle As String

        Dim iButtons As Long

        Dim sStr As String

        sStr = Application.PathSeparator

        vPath = Application.InputBox(Prompt:="Inserisci il percorso della cartella " _

                                           & "dei file da rinominare," _

                                           & " ad esempio: ABC", _

                                     Title:="PERCORSO DI CARTELLA", _

                                     Default:="C:\Users\Nicola2", Type:=2)    'Desktop\Nuova cartella", _

                                                                              Type:=2)

         If vPath = "False" Or vPath = vbNullString Then

            sMsg = "Non hai fornito un percorso - Ripova!"

            iButtons = vbCritical

            sTitle = "ERRORE - PERCORSO MANCANTE"

            GoTo XIT

        End If

           If Right(vPath, 1) <> sStr Then

            vPath = vPath & sStr

        End If

        vFirstNumber = Application.InputBox(Prompt:="Inserisci il Numero di partenza", _

                                            Title:="NUMERAZIONE PROGRESSIVA DEI FILES", _

                                            Default:=1, _

                                            Type:=1)

        If vFirstNumber = "False" Then

            sMsg = "Non hai fornito un numero iniziale - Ripova!"

            iButtons = vbCritical

            sTitle = "ERRORE - RIPPROVA"

            GoTo XIT

        End If

        vPrefix = Application.InputBox(Prompt:="Inserisci un prefisso per i file," _

                                             & " ad esempio: ABC", _

                                       Title:="PREFISSO OPZIONALE", _

                                       Default:="", _

                                       Type:=2)

        Call RenominaFilePogressivamente(vPath, vFirstNumber, vPrefix)

        Exit Sub

    XIT:

        Call MsgBox(Prompt:=sMsg, Buttons:=iButtons, Title:=sTitle)

    End Sub

    '--------->>

    Public Function RenominaFilePogressivamente(myFolderPath, _

                                                Optional FirstNumber = 1, _

                                                Optional sPrefix)

        Dim oFSO As Object

        Dim oFolder As Object

        Dim oFiles As Object

        Dim oFile As Object

        Dim iCtr As Long, iPos As Long

        Dim sStr As String, sExt As String

        Dim V As Variant

        Dim sMsg As String, sTitle As String

        Dim iButtons As Long

        Const sCartella As String = "C:\Users\Nicola2"  'Desktop\Nuova cartella"

        Set oFSO = CreateObject("Scripting.FileSystemObject")

        Set oFolder = oFSO.GetFolder(myFolderPath)

        Set oFiles = oFolder.Files

        For Each oFile In oFiles

            With oFile

                iPos = InStrRev(.Name, ".")

                sExt = Right(.Name, Len(.Name) - iPos + 1)

                .Name = sPrefix & FirstNumber + iCtr & sExt

            End With

            iCtr = iCtr + 1

        Next oFile

        sMsg = "Sono stati rinominati: " _

             & iCtr & " Files!"

        iButtons = vbInformation

        sTitle = "# FILE RINOMINATI"

    XIT:

        Call MsgBox(Prompt:=sMsg, Buttons:=iButtons, Title:=sTitle)

    End Function

    '<<=========

    Nota che solo la procedura  RenameFiles  viene eseguita dall'utente anche se il vero lavoro sia effetuata dalla funzione RenominaFilePogressivamente

    Perché hai già rinominato i file, ogni tentativo di rinominarli con un numero di sequenza di sovrapposizione causerà errori. Per evitare questo problema, rinominarli prima con un'altra sequenza numerica, ad esempio a partire da 5000 e poi ripetere la macro utilizzando 1 come il primo numero.

    Nota che il codice consente anche di aggiungere opzionalmente un prefisso per la nuova sequenza numerica.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2015-10-25T16:56:28+00:00

    Non è *sballata* è corretta.

    I nomi dei file sono testo, NON numeri. Quindi come testo binario sono ordinati correttamente.

    Devi salvarli così fino a 999: 001, 002, ..... 999.

    Se sono più di 999: 0001, 0002, ..... 9999

    Se sono più di 9999: 00001, ecc.

    L'ordine che vedi (e che vediamo noi nell'immagine che hai postato) è relativo a testo.

    Se non sai come ottenere quei *numeri* (testo) vedi qui sotto un piccolo esempio:

    Public Sub m()

        Dim lng As Long

        Dim s As String

        For lng = 1 To 10

            s = s & "Ciao " & Format(lng, "0000") & vbNewLine

        Next

        MsgBox s

    End Sub

    Che da come risultato:

    La risposta è stata utile?

    0 commenti Nessun commento