VBA creazione Matrice Excel



  • VBA - creazione Matrice Excel
    di VeroRV (utente non iscritto) data: 22/03/2016 16:40:54

    Ciao Ragazzi.. sono poco esperta di VBA.. v spiego cosa mi serve.. Ho 12 file excel (solo x iniziare) con all'interno 8 fogli stessa struttura.. Devo creare un file excel "matrice" con tutti i dati presenti nei 12 file, divisi in 8 fogli.. Ho trovato una discussione sul vs forum (vedi link excelvba.it/Forum/story/Excel_e_gli_applicativi_Office/Importare_dati_da_files_chiusi_su_file_riepilogo.html), ma ho problemi quando pesco il secondo file, perchè questa macro, anzichè accodare i dati del 2° file, li copia accanto
    (vedi comando --> n = n + Columns("AD").Column 'Rappresenta la colonna AD dell'intervallo preso in esame) --> come faccio a dirgli di non copiare accanto, ma bensì sotto ??? Grazieee mille!!!!!
     
    ???? --> n = n + Columns("AD").Column 'Rappresenta la colonna AD dell'intervallo preso in esame



  • di alfrimpa data: 22/03/2016 17:57:27

    Ciao VeroRV

    Possiamo provare ma dovresti allegare dei file di esempio con dati fittizi e mostrare nel file "Matrice" come vuoi siano disposti i dati che si andranno a copiare dai file precedenti.

    Alfredo





  • di patel data: 22/03/2016 18:58:04

    piu o meno così
     
    Sub Riepilogo()
    
      Dim FD As FileDialog, MyRange As Range, File As Variant, sh As Byte, LC As Integer, _
      W1 As Workbook, W2 As Workbook, n As Byte
      Set MyRange = [a1:ad34]
      Set W1 = ActiveWorkbook
      n = 1
        Set FD = Application.FileDialog(msoFileDialogFilePicker)
        
        With FD
            .AllowMultiSelect = True 'posso selezionare più files
            .Show
    
    Application.ScreenUpdating = False 'Conviene spegnere lo schermo
    
                For Each File In .SelectedItems 'Il ciclo esterno scorre tutti i files selezionati
                Workbooks.Open File
                Set W2 = ActiveWorkbook
                    For sh = 1 To Worksheets.Count 'Il ciclo interno scorre tutti i fogli di ogni singolo file
                    ' In ogni foglio prende l'intervallo A1:AD34 e lo incolla nel corrispondente foglio del file di riepilogo
                    W2.Worksheets(sh).Range(MyRange.Address).Copy
                    W1.Worksheets(sh).Cells(n, 1).PasteSpecial xlPasteAll '<<<<<<<<<<<<<<<<<<<<<<<<
                    Next
                ' Adesso trovo la colonna su cui posizione il successivo intervallo di dati
                n = n + 35 '<<<<<<<<<<<<<<<<<<<<<<<
                Application.CutCopyMode = False 'svuoto la memoria dagli appunti
                W2.Close savechanges:=False
                Next
        End With
    
    Application.ScreenUpdating = True
    






  • di VeroRV (utente non iscritto) data: 23/03/2016 08:09:11

    ciao e grazie ad entrambi.. x Alfredo --> tra poco allego un file di esempio.
    mentre per patel --> questo codice l'ho trovato anche io, ho solo problemi con il comando
    ' Adesso trovo la colonna su cui posizione il successivo intervallo di dati
    --> n = n + 35 '<<<<<<<<<<<<<<<<<<<<<<<

    Perché io non voglio scrivere il 2° file su altre colonne, ma vorrei che il 2° file scriva i dati in cascata sotto i dati del 1° file..



  • di patel data: 23/03/2016 08:20:51

    io ti ho postato il codice modificato proprio per incolonnare, ovviamente non l'ho provato in mancanza del tuo file





  • di VeroRV (utente non iscritto) data: 23/03/2016 08:33:20

    ok, ora incolonna.. ma come faccio a non mettere n=n+35, ma bensì n=n+UltimaRigaScritta??

    ed inoltre, come posso importare in una nuova colonna "E", quando copio sotto il 2° file, un valore fisso per singolo file (tipo un sequenziale o se possibile, l'inizio del nome file Excel??)



  • di patel data: 23/03/2016 08:50:16

    non hai ancora allegato il file, basta consulenze al buio





  • di VeroRV (utente non iscritto) data: 23/03/2016 09:12:32

    fatto..



  • di patel data: 23/03/2016 10:06:01

    il numero delle righe è fisso ?





  • di VeroRV (utente non iscritto) data: 23/03/2016 10:08:21

    perchè il foglio Matrice deve avere 2 fogli (F1 e F2) con i dati originali dei fogli F1 e F2 dei file Partenza1 e Partenza2..



  • di patel data: 23/03/2016 10:10:01


    il numero delle righe è fisso ?





  • di VeroRV (utente non iscritto) data: 23/03/2016 10:16:06

    no, varia.. ma il numero di colonne è fisso.. cmq ho risolto aggiungendo una variabile x nel ciclo FOR e mettendo

    n=n+x
    anzichè n=n+35

    --> come posso aggiungere una colonna con il nome file, tipo nella colonna E ??



  • di patel data: 23/03/2016 10:19:52

    nel file non hai messo la macro che stai usando





  • di VeroRV (utente non iscritto) data: 23/03/2016 10:39:18

    ECCO LA MACRO..

    ho solo problemi con il range..

    per prova ho provato a fare da
    Set MyRange = [a1:d10]

    ma a me servirebbe da A1 a D(fino alla fine righe)
     
    Option Explicit
    
    Sub Riepilogo()
    
      Dim FD As FileDialog, MyRange As Range, File As Variant, sh As Byte, LC As Integer, _
      W1 As Workbook, W2 As Workbook, n As Byte, x As Byte, y As Byte
      Set MyRange = [a1:d10]
      Set W1 = ActiveWorkbook
      n = 1
      x = 1
      y = 1
        Set FD = Application.FileDialog(msoFileDialogFilePicker)
        
        With FD
            .AllowMultiSelect = True 'posso selezionare più files
            .Show
    
    Application.ScreenUpdating = False 'Conviene spegnere lo schermo
    
                For Each File In .SelectedItems 'Il ciclo esterno scorre tutti i files selezionati
                y = n
                
                Workbooks.Open File
                Set W2 = ActiveWorkbook
                    For sh = 1 To Worksheets.Count 'Il ciclo interno scorre tutti i fogli di ogni singolo file
                    ' In ogni foglio prende l'intervallo A1:AD34 e lo incolla nel corrispondente foglio del file di riepilogo
                    W2.Worksheets(sh).Range(MyRange.Address).Copy
                    W1.Worksheets(sh).Cells(n, 1).PasteSpecial xlPasteAll '<<<<<<<<<<<<<<<<<<<<<<<<
           
                    W1.Worksheets(sh).Cells(n, "N").Value = File '--> QUI METTO NELLA RIGA DI INTESTAZIONE COPIATA NELLA MATRICE IL NOME PERCORSO + NOME FILE
                    x = x + 1
                    Next
                ' Adesso trovo la colonna su cui posizione il successivo intervallo di dati
                n = n + x '<<<<<<<<<<<<<<<<<<<<<<<
                Application.CutCopyMode = False 'svuoto la memoria dagli appunti
                W2.Close savechanges:=False
                Next
        End With
    
    Application.ScreenUpdating = True
    
    End Sub



  • di Albatros54 data: 23/03/2016 11:12:14

    prova ad aggiungere le due righe di codice sotto 
     
    priga = Range("A" & Rows.Count).End(xlUp).Row
        Set MyRange = Range("a1", "D" & priga)






  • di VeroRV (utente non iscritto) data: 23/03/2016 14:42:23

    Grazie mille a chi mi è stato di aiuto.. allego codice VBA utile e che funziona..

    Obiettivo --> avevo 20 file con la stessa struttura, divisi per periodo ed ognuno con 10 fogli --> dovevo creare un unico file "matrice" con all'interno 10 fogli, sui quali dovevo copiare i dati di 20 file excel..

    Questa macro accoda in un file Matrice, tutti i dati dello stesso Foglio (devono avere lo stesso nome) dei vari file excel !!
     
    Option Explicit
    
    Sub Riepilogo()
    
      Dim FD As FileDialog, MyRange As Range, File As Variant, SH As Byte, LC As Integer, _
      W1 As Workbook, W2 As Workbook, n As Long, x As Byte, y As Long, priga As Long
      'Set MyRange = [a1:m6]
      Set W1 = ActiveWorkbook
      n = 1
      x = 1
      y = 1
      priga = 1
        Set FD = Application.FileDialog(msoFileDialogFilePicker)
        
        With FD
            .AllowMultiSelect = True 'posso selezionare più files
            .Show
    
    Application.ScreenUpdating = False 'Conviene spegnere lo schermo
    
                For Each File In .SelectedItems 'Il ciclo esterno scorre tutti i files selezionati
                
                
                    
                Workbooks.Open File
                Set W2 = ActiveWorkbook
              
                    For SH = 1 To Worksheets.Count 'Il ciclo interno scorre tutti i fogli di ogni singolo file
                    ' In ogni foglio prende l'intervallo A1:Mxxxx e lo incolla nel corrispondente foglio del file di riepilogo
                    'Set MyRange = [a1:m12]
                   
                     priga = Range("A" & Rows.Count).End(xlUp).Row
                     Set MyRange = Range("a1", "m" & priga)
                     
                
                    W2.Worksheets(SH).Range(MyRange.Address).Copy
                    W1.Worksheets(SH).Cells(n, 1).PasteSpecial xlPasteAll '<<<<<<<<<<<<<<<<<<<<<<<<
           
                    W1.Worksheets(SH).Cells(n, "N").Value = File '--> qui scrive nella riga di intestazione di ogni file importato "nella matrice" il percorso + nome file
                    
                    x = x + 1
                    Next
                   
                    
                ' Adesso trovo la colonna su cui posizione il successivo intervallo di dati
                n = n + priga '<<<<<<<<<<<<<<<<<<<<<<<
                Application.CutCopyMode = False 'svuoto la memoria dagli appunti
                W2.Close savechanges:=False
                Next
        End With
    
    Application.ScreenUpdating = True
    
    End Sub