Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 9 su 9

Excel 2013 - "Aprire elenco file .xlsm ed inserire una colonna in ciascuno di loro

  1. #1
    stige non  in linea Scolaretto
    Post
    185
    Like Inviati  
    4
    Like Ricevuti  
    0
    Ciao a tutti,

    Ho un elenco di file contenuti in una cartella, tutti i file hanno la stessa struttura.

    Io devo aprire ogni file ed inserire una colonna nella colonna A intestandola ed assegnando un valore alla prima cella.

    La mia routine "sembra" funzionare per si ferma al primo file individuato nella cartella che contiene i file e non inserisce la colonna desiderata, dove sto sbagliando ? mi dareste qualche suggerimento ?
    grazie


    '****************************************************************
    '* Inserisce per ogni file contenuto nella cartella il nome dell'operatore
    '****************************************************************
    
    Sub Secondo_AggiungiColonnaPerOgniFile()
        Dim fDialog As FileDialog
        Dim i As Integer
        Dim ur As Long
        Dim uR1 As Long
        Dim WK As Workbook
        Dim WK1 As Workbook
        Dim sh As Worksheet
        Dim sh1 As Worksheet
        Dim fs As Object
        Dim Fold As Object
        Dim Nomefile As Object
        Dim cartella As Variant
        
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
        
        Set fDialog = Application.FileDialog(msoFileDialogFolderPicker)
        MsgBox "Scegli la cartella con i files!", vbInformation, "AVVISO"
        
        With fDialog
            .Show
            On Error GoTo esci
            cartella = .SelectedItems(1)
        End With
        
        Set WK = ThisWorkbook
        Set sh = WK.Worksheets(1)
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set Fold = fs.getfolder(cartella)
        Set cartella = Fold.Files
        For Each Nomefile In cartella
        
           Set WK1 = Workbooks.Open(Nomefile)
           Set sh1 = WK1.Worksheets(1)
         
           'questa  la parte che dovrebbe eseguire per ogni file 
           Columns("A:A").Select
           Selection.Insert Shift:=xlToRight
           Range("A1").Select
           ActiveCell.Value = "Nome"
           Range("A2").Select
           ActiveCell.Value = "aaaa"
           
           ActiveWorkbook.Save
           ActiveWorkbook.Close
    
           Application.DisplayAlerts = True
    
           WS.AutoFilterMode = False
           WS.Activate
    
           'salva il file una aggiornato e passa al successivo
           ActiveWorkbook.Save
           ActiveWorkbook.Close
        Next
        WK.Save
    
      
        'qui non mi restituisce nulla mentre dovrebbe avvisarmi che ha finito
        MsgBox "Fatto!", vbInformation, "NOTIFICA"
        Set fs = Nothing
        Set cartella = Nothing
        Set Fold = Nothing
    esci:
        Set fDialog = Nothing
        Application.ScreenUpdating = True
        Application.DisplayAlerts = True
    End Sub
    
    Grazie a tutti.
    Ultima modifica di TheTruster; 28-01-2021 15:56  Motivo: Inserimento tag [CODE][/CODE]

  2. #2
    L'avatar di TheTruster
    TheTruster non  in linea Moderatore Globale Ultimo blog: Mouse Wheel in Visual Basic 6 - ActiveX
    Post
    7,244
    Blogs
    3
    Like Inviati  
    19
    Like Ricevuti  
    13
    Ciao,
    queste due righe:
           WS.AutoFilterMode = False
           WS.Activate
    
    Fai riferimento all'oggetto WS, ma nel tuo codice non se ne trova traccia.
    Tra l'altro hai una gestione che consente solo l'uscita dalla routine, quindi l'errore non viene evidenziato.
    Se usassi l'Option Explicit quelle righe, se la variabile non fosse dichiarata, darebbero errore.

    TheTruster
    Ultima modifica di TheTruster; 23-02-2021 10:02 
    ℹ️ Leggi di pi su TheTruster ...

  3. #3
    stige non  in linea Scolaretto
    Post
    185
    Like Inviati  
    4
    Like Ricevuti  
    0
    Quote Originariamente inviato da TheTruster Visualizza il messaggio
    Ciao,
    queste due righe:
           WS.AutoFilterMode = False
           WS.Activate
    
    Fai riferimento all'oggetto WS, ma nel tuo codice non se ne trova traccia.
    Tra l'altro hai una gestione che consente solo l'uscita dalla routine, quindi l'errore non viene evidenziato.
    Se usassi l'Option Explicit quelle righe, se la variabile non fosse dichiarata, darebbero errore.

    TheTruster
    Ti ringrazio TheTruster, ci lavoro sopra.
    Ultima modifica di TheTruster; 23-02-2021 10:02 

  4. #4
    Sgrubak non  in linea Scribacchino
    Post
    595
    Like Inviati  
    10
    Like Ricevuti  
    11
    Oltre a quanto segnalato da TheTruster, noto che i metodi [ActiveWorkbook.Save] e [ActiveWorkbook.Close], sono richiamati due volte all'interno del ciclo.
    Non che il secondo Save genera errore e non lo vedi per l'[On Error GoTo esci]?

  5. #5
    stige non  in linea Scolaretto
    Post
    185
    Like Inviati  
    4
    Like Ricevuti  
    0
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    Oltre a quanto segnalato da TheTruster, noto che i metodi [ActiveWorkbook.Save] e [ActiveWorkbook.Close], sono richiamati due volte all'interno del ciclo.
    Non che il secondo Save genera errore e non lo vedi per l'[On Error GoTo esci]?
    grazie, ci lavoro sopra

  6. #6
    stige non  in linea Scolaretto
    Post
    185
    Like Inviati  
    4
    Like Ricevuti  
    0
    Buon giorno a tutti,

    non mi sembra una soluzione molto elegante per sono riuscito a risolvere il mio problema, utilizzo un foglio come format e lo replico rinominando ogni nuovo singolo foglio prendendo il nome da un elenco cos come la prima colonna (l'idea che una volta ricevuti gli n. fogli con un unico passaggio li posso aggregare), nella fase di copia ogni foglio viene protetto da password.

     Sub Copia_e_nomina_fogli()
        Dim sh1 As Worksheet
        Dim sh2 As Worksheet
        Dim Nr As Integer
        Dim NomeDip As String
        Application.ScreenUpdating = False
        Set sh1 = Worksheets("Orario")
        Set sh2 = Worksheets("Complessivo")
        
       'cicla l'elenco dei nomi
        
        For i = 2 To sh2.Cells(Rows.Count, 1).End(xlUp).Row
            
            'se la prima cella dell'elenco non  vuota
            If sh2.Cells(i, 1) <> "" Then
                NomeFoglio = RTrim(sh2.Cells(i, 1))
                
                NomeFoglio = Replace(Replace(NomeFoglio, " - ", "_"), " ", "_")
                
                Sheets("Orario").Copy After:=Sheets(Sheets.Count)
                ActiveSheet.Name = NomeFoglio
                
                'assegna il nome alla prima colonna del foglio
                ActiveSheet.Cells(2, 1).Value = Sheets("Complessivo").Cells(i, 1)
                
                'conta il numero di record della colonna precompilata che verr distribuita
                LastRow = sh1.UsedRange.Rows.Count
              
                
               'riempie con il nome del dipendente la colonna, ricorda di aggiornare il count delle righe
                For Nr = 2 To LastRow
                   ActiveSheet.Cells(Nr, 1).Value = NomeFoglio
                Next
                            
                ActiveSheet.Protect Password:="1234", DrawingObjects:=True, Contents:=True, Scenarios:=True _
                , AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                AllowFormattingRows:=True, AllowInsertingColumns:=True, AllowInsertingRows _
                :=True
         
                Sheets(NomeFoglio).Move After:=Sheets(Worksheets.Count)
                
            End If
        Next i
        Sheets("Menu").Select
        Application.ScreenUpdating = True
    End Sub
    
    Accetto ovviamente consigli su errori occulti o migliorie

    Grazie a tutti.

    buona giornata.
    Ultima modifica di AntonioG; 23-02-2021 07:31  Motivo: Tag CODE per il codice

  7. #7
    Sgrubak non  in linea Scribacchino
    Post
    595
    Like Inviati  
    10
    Like Ricevuti  
    11
    Ma prima di cambiare completamente approccio, hai lavorato su quel che ti abbiamo fatto notare io e TheTruster?

  8. #8
    stige non  in linea Scolaretto
    Post
    185
    Like Inviati  
    4
    Like Ricevuti  
    0
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    Ma prima di cambiare completamente approccio, hai lavorato su quel che ti abbiamo fatto notare io e TheTruster?
    ho provato a fare il debug riga per riga per i miei tentativi non mi hanno dato la soddisfazione richiesta, la soluzione che ho trovato frutto dell'empasse in cui ero finito

  9. #9
    Sgrubak non  in linea Scribacchino
    Post
    595
    Like Inviati  
    10
    Like Ricevuti  
    11
    Quote Originariamente inviato da stige Visualizza il messaggio
    la soluzione che ho trovato frutto dell'empasse in cui ero finito
    Per carit! chiaro che se uno deve risolvere il problema, la prima soluzione che funziona va bene...

    Ma ai fini della discussione, sei partito dicendo che avevi un problema a ciclare delle cartelle ed inserire delle colonne, e risolvi tutto ciclando dei fogli? Cio se anche io il problema di "Aprire elenco file .xlsm ed inserire una colonna in ciascuno di loro" e con google finisco qui, che beneficio ho della tua soluzione visto che fa tutt'altra cosa?

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. [Excel 2013] Ottenere elenco stampanti
    Da Sgrubak nel forum Microsoft Excel
    Risposte: 10
    Ultimo Post: 22-02-2021, 17:14
  2. Excel 2013 - "blindare" inserimento ore in celle excel
    Da stige nel forum Microsoft Excel
    Risposte: 13
    Ultimo Post: 18-01-2021, 11:31
  3. Files xlsm collegati e correlati fra loro e VBA
    Da KOFMF nel forum Microsoft Excel
    Risposte: 0
    Ultimo Post: 10-01-2016, 13:35
  4. Aprire un file excel 2013 con comando access 2013
    Da MikeEvsp nel forum Microsoft Access
    Risposte: 6
    Ultimo Post: 03-07-2015, 08:41
  5. Ripetere la ricerca con la funzione "Cerca nei file" In VS 2013 for Web
    Da giovannigiorgio nel forum Altri linguaggi e strumenti
    Risposte: 3
    Ultimo Post: 13-03-2014, 13:35