Visualizzazione post con etichetta macro. Mostra tutti i post
Visualizzazione post con etichetta macro. Mostra tutti i post

mercoledì 18 gennaio 2012

Macro Excel: eseguire una macro a tutti i file di una cartella (e sottocartelle)

Una volta creata la nostra macro per modificare il nostro file, come possiamo applicarla automaticamente a tutti file di una cartella e relative sottocartelle? Semplice, con un'altra macro!

Quindi, dopo aver fatto la nostra macro "principale" (ovvero quella che vogliamo applicare ai files) la chiamiamo MyMacro (si fa scrivendo MyMacro dopo il primo Sub che troverete in alto alla macro) e aggiungiamo altre due nuove macro come queste:
Sub ExecuteApplyMacroToAllFiles()

    'Change the path to the main folder
    Call ApplyMacroToAllFiles("C:\test folder")

End Sub

Sub ApplyMacroToAllFiles(ByVal MyPath As String)

    Dim FileSys As Object
    Dim objFolder As Object
    Dim objSubFolder As Object
    Dim objFile As Object
    Dim wkbOpen As Workbook
   
    Set FileSys = CreateObject("Scripting.FileSystemObject")
    Set objFolder = FileSys.GetFolder(MyPath)

    Application.ScreenUpdating = False
   
    For Each objSubFolder In objFolder.SubFolders
        For Each objFile In objSubFolder.Files
            Set wkbOpen = Workbooks.Open(filename:=objFile)
            'Change the name of your macro
            Call MyMacro
            wkbOpen.Close savechanges:=True
        Next
        Call ApplyMacroToAllFiles(objSubFolder.Path)
    Next

    Application.ScreenUpdating = True

End Sub
In grassetto ho evidenziato le modifiche da fare, la prima è la cartella da usare (quella che contiene i nostri file) e la seconda è il nome della nostra macro da applicare.

Una volta fatto questo ci basta avviare la macro chiamata "ExecuteApplyMacroToAllFiles" e vedremo il nostro excel macinare un file dopo l'altro.

martedì 17 gennaio 2012

Macro Excel: applicare i bordi trovando automaticamente l'ultima riga di una tabella

    'change last row style
    Cells.Find(What:="*", After:=[a1], SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Select
    Range(ActiveCell, ActiveCell.Offset(0, -6)).Select
   
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
Questo codice praticamente è identico a quello precedente con la sola importante differenza che in questo caso trova automaticamente l'ultima cella dell'ultima riga, e tenendo premuto lo "shift" seleziona la riga intera andando a sinistra di 6 celle (è quell'offset 0,-6 che vedete).

Macro Excel: applicare "Tutti i bordi" e "Bordo casella spesso" ad una serie di celle

'change first row style
    Range("A2:K2").Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
Questo lunghissimo codice non vi deve spaventare per la lunghezza, fa una cosa molto semplice: seleziona le celle dalla A2 fino alla K2, applica "Tutti i bordi" prima e "Bordo casella spesso" dopo. Utile per le prime e le ultime righe di una tabella.

Macro Excel: cancellare il contenuto di una colonna tranne l'ultima cella

    'delete all the cells (but not the last one) of the K column
    Range("K3", Range("K65536").End(xlUp).Offset(-1, 0)).Select
    Selection.ClearContents
Questo codice trova il range di celle della colonna K, escludendo la cella piu in basso (che di solito contiene una foruma per calcolare il totale) e cancella i dati contenute in esse.

Macro Excel: copiare e incollare una colonna

 'copy and paste J column
    Columns("J:J").Select
    Selection.Copy
    Columns("K:K").Select
    ActiveSheet.Paste
Questo codice seleziona la colonna J, la copia, seleziona la colonna K e la incolla su di essa.

Macro Excel: cambiare formato numero

'add year and change number format
    Range("J2").Select
    Selection.NumberFormat = "General"
    ActiveCell.FormulaR1C1 = "2011"
Questo codice seleziona una cella, ne cambia il formato numerico impostandolo su "Generale" e aggiunge la scritta "2011".

Macro Excel: aggiungere testo alle celle

'add years to the cells
    Range("F2").Select
    ActiveCell.FormulaR1C1 = "2007"
    Range("G2").Select
    ActiveCell.FormulaR1C1 = "2008"
    Range("H2").Select
    ActiveCell.FormulaR1C1 = "2009"
    Range("I2").Select
    ActiveCell.FormulaR1C1 = "2010"
Questo codice seleziona una determinata cella e aggiunge un anno (o qualsiasi altro testo).

Macro Excel: cambiare larghezza colonne

'adjust column width
    Columns("F:K").Select
    Selection.ColumnWidth = 15
Questo seleziona una serie di colonne (in questo caso dalla F alla K) e ne setta la larghezza impostandola a 15.

Macro Excel: disunire una cella unita

'unmerge the first cell
    Range("A1:J1").Select
    With Selection
        .HorizontalAlignment = xlGeneral
        .VerticalAlignment = xlCenter
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = True
    End With
    Selection.UnMerge

Con questo codice invece si seleziona una cella unita (in questo caso la A1:J1) e la si disunisce. Tante di quelle proprietà servono solo a mantenere il testo all'interno e a formattarlo per la visualizzazione a sinistra.

Macro Excel: calcellare una riga se è vuota

'delete second row if blank
If [A2] = "" Then Rows("2:2").Delete

Con questo codice cancella la seconda riga del foglio nel caso la prima cella fosse vuota.

Macro Excel: cancellare formattazione tabella se esiste

'delete tabella1 (table's name) if exists
On Error Resume Next
ActiveSheet.ListObjects("Tabella1").Unlist

Questo pezzettino di codice cancella la formattazione della tabella1, se la trova, in caso contrario salta al comando successivo.

Macro Excel: l'inizio

Come ormai avrete capito questo blog è un po come se fosse il mio blocco note pubblico, dove mettere tutte le cose che trovo interessanti per me e per gli altri. Da poco mi sono cimentato (ahimè) nella noiosissima programmazione di macro per Excel 2007 con Visual Basic for Application (VBA).

Quindi oggi metterò dei pezzettini di codice, nel caso serve a me o a chiunque altro in futuro. Se non vi interessa l'argomento skippate di brutto tutti i prossimi 11 post.