You are here:--[RISOLTO] Importare alcune colonne da foglio esterno
[RISOLTO] Importare alcune colonne da foglio esterno2019-08-10T10:42:15+02:00

Home Forum Domande su Excel VBA e MACRO [RISOLTO] Importare alcune colonne da foglio esterno

  • Autore
    Articoli
  • bg66bg66
    Partecipante
      Post totali: 50

      Buongiorno,
      vorrei importare nel file “Riesume_forum”, solamente i campi pieni nelle colonne B – C – E – F – Q del file “Produz_forum”. Le celle piene della colonna B possono fare da discriminante ( in pratica se in altri campi della riga ci sono dati ma la cella della colonna B è vuota -> non è necessario importare quei dati).

      E, possibilmente, aggiungendo un riferimento nella colonna F del file”Riesume_forum” che mi faccia capire da che file proviene.

      href=”https://www.dropbox.com/s/xzodxsajasensf5/Riesume_forum.xlsx?dl=0″
      href=”https://www.dropbox.com/s/nrm8o2371qhn5cx/Produz_forum.xlsx?dl=0″

      Tenuto conto che all fine dell’anno le righe potrebbero essere molte e i mesi da importare, ovviamente, sono 12 e ben accetto qualche consiglio per evitare di importare giornalmente gli stessi dati passati al solo scopo di aggiungere quelli nuovi.

      Grazie per l’aiuto
      BG66

      • Questo argomento è stato modificato 2 mesi, 1 settimana fa da bg66 bg66. Ragione: non visualizzava link
      • Questo argomento è stato modificato 2 mesi, 1 settimana fa da bg66 bg66.
      • Questo argomento è stato modificato 1 mese, 1 settimana fa da sid sid.
    • sidsid
      Moderatore
        Post totali: 718

        Il link non è valido; rimettilo

      • bg66bg66
        Partecipante
          Post totali: 50

          Ciao Sid,
          ci ri-provo non usando il pulsante link:
          https://www.dropbox.com/s/xzodxsajasensf5/Riesume_forum.xlsx?dl=0
          https://www.dropbox.com/s/nrm8o2371qhn5cx/Produz_forum.xlsx?dl=0

          A presto.

          • Questa risposta è stata modificata 2 mesi, 1 settimana fa da bg66 bg66.
        • sidsid
          Moderatore
            Post totali: 718

            Nel file “Produz_forum” ogni giorno è formato sempre da 30 righe?

          • sidsid
            Moderatore
              Post totali: 718

              Tenuto conto che all fine dell’anno le righe potrebbero essere molte e i mesi da importare, ovviamente, sono 12………

              Vorrei anche capire se tu hai 12 file da cui importare i dati, oppure è un unico file con 12 fogli

            • bg66bg66
              Partecipante
                Post totali: 50

                Ciao Sid,
                confermo che:
                1) il file Produz_forum mantiene sempre la stessa impostazione per qualsiasi mese
                2) che avrò 12 files ( 01_GENNAIO_2019,02_FEBBRAIO_2019, etc) composti da un solo foglio di lavoro.

              • sidsid
                Moderatore
                  Post totali: 718

                  Il file da cui importi i dati, è sempre aperto o può essere anche chiuso? Nel caso lo apri manualmente, oppure da codice?

                • bg66bg66
                  Partecipante
                    Post totali: 50

                    Il file da cui importi i dati, è sempre aperto o può essere anche chiuso? Nel caso lo apri manualmente, oppure da codice?

                    Ciao Sid,
                    SE è aperto leggo quello che mi serve e lo lascio aperto
                    SE non è già aperto preferirei aprirlo con codice e poi chiuderlo

                    Ovviamente se non è un casino verificare queste condizioni.

                    Gene

                  • sidsid
                    Moderatore
                      Post totali: 718

                      Intanto ti mando il codice da mettere in un modulo standard del file Riesume.
                      Si presuppone che il file “Produz_forum” sia aperto; se non lo è aprilo.
                      Se funziona bene adattiamo il tutto con l’apertura del file del mese.

                      Sub IMPORTA()
                      Dim wbMaster As Workbook, wbSlave As Workbook
                      Dim wsMaster As Worksheet, wsSlave As Worksheet
                      Dim j As Long, nIncr As Long
                      Dim vMatrix() As Variant, vTabella As Variant
                      Dim t As Date
                      
                      Set wbMaster = ThisWorkbook
                      Set wsMaster = wbMaster.Sheets("Riesume")
                      Set wbSlave = Application.Workbooks("Produz_forum.xlsx")
                      Set wsSlave = wbSlave.Sheets("LUGLIO_19")
                      t = Time
                      
                      vTabella = wsSlave.Range("B5:Q" & ActiveSheet.UsedRange.Rows.Count)
                      
                      For j = LBound(vTabella) To UBound(vTabella)
                          If vTabella(j, 1) <> vbNullString Then
                              nIncr = nIncr + 1
                              ReDim Preserve vMatrix(1 To 6, 1 To nIncr)
                              vMatrix(1, nIncr) = vTabella(j, 1)
                              vMatrix(2, nIncr) = vTabella(j, 2)
                              vMatrix(3, nIncr) = vTabella(j, 4)
                              vMatrix(4, nIncr) = vTabella(j, 5)
                              vMatrix(5, nIncr) = vTabella(j, 16)
                              vMatrix(6, nIncr) = wbSlave.Name
                          End If
                      Next j
                      
                      vMatrix = Application.Transpose(vMatrix) 'traspongo la matrice creata
                      With wsMaster
                          .Range("A2:F" & Rows.Count).Clear 'pulisco il foglio master
                          .Range("A2:F" & UBound(vMatrix) + 1) = vMatrix 'scarico la matrice nel foglio
                          .Range("A:F").Columns.AutoFit 'adatto le colonne al testo
                      End With
                      MsgBox Format(Time - t, "HH:MM:SS"), vbInformation, "CODICE ESEGUITO IN....."
                      
                      Set wbMaster = Nothing
                      Set wsMaster = Nothing
                      Set wsMaster = Nothing
                      Set wsSlave = Nothing
                      
                      End Sub
                    • bg66bg66
                      Partecipante
                        Post totali: 50

                        Ciao Sid,
                        ovviamente funziona perfettamente.

                        Attendo tue.

                        Grazie
                        Gene

                      • bg66bg66
                        Partecipante
                          Post totali: 50

                          Ciao Sid,
                          per l’importazione pensavo che forse era più logico che quando lancio la macro, lo script mi chiede che mese voglio importare e dopo la scelta esegue l’operazione aprendo e poi chiudendo solo quello richiesto.
                          Ovviamente accodando i dati partendo dall’ultima riga piena e/o sovrascrivendo quelli già parzialmente importati.
                          Cosa ne pensi?

                          Gene

                          • Questa risposta è stata modificata 2 mesi, 1 settimana fa da bg66 bg66.
                          • Questa risposta è stata modificata 2 mesi, 1 settimana fa da bg66 bg66.
                        • sidsid
                          Moderatore
                            Post totali: 718

                            Per me va bene.
                            I 12 file stanno tutti nella stessa cartella?

                          • bg66bg66
                            Partecipante
                              Post totali: 50

                              Si. E’ stato uno dei tuoi primi insegnamenti molti thread fa.

                            • sidsid
                              Moderatore
                                Post totali: 718

                                I 12 file stanno tutti nella stessa cartella?

                                Come si chiama la cartella?
                                In quale directory si trova?

                              • bg66bg66
                                Partecipante
                                  Post totali: 50

                                  I 12 file stanno tutti nella stessa cartella?

                                  Come si chiama la cartella?
                                  In quale directory si trova?

                                  Percorso: I:\Produzione\2019\
                                  nomi files: 01_GENNAIO_2019,02_FEBBRAIO_2019, etc
                                  nome foglio di lavoro: GENNAIO_19, FEBBRAIO_19, etc

                                • sidsid
                                  Moderatore
                                    Post totali: 718

                                    ogni file ha soltanto un foglio?

                                  • sidsid
                                    Moderatore
                                      Post totali: 718

                                      I dati del file mese, colonna B (Dato 1), sono univoci o possono esere ripetuti?
                                      Nel caso fossero univoci, lo sono anche a livello di anno, cioè NON troverò lo stesso codice negli altri 11 file?

                                      Per spiegarmi meglio, il dato in B5 del foglio Luglio_19 (IFE13115I), posso trovarlo anche negli altri mesi?

                                      • Questa risposta è stata modificata 2 mesi fa da sid sid.
                                    • bg66bg66
                                      Partecipante
                                        Post totali: 50

                                        Per spiegarmi meglio, il dato in B5 del foglio Luglio_19 (IFE13115I), posso trovarlo anche negli altri mesi?

                                        No è un dato univoco in un file che presenta anche un secondo foglio “Riesume” ( quest’ultimo ha lo stesso nome per tutti i files mensili).

                                        Gene

                                      • sidsid
                                        Moderatore
                                          Post totali: 718

                                          Quindi saranno tutti dati univoci?

                                        • sidsid
                                          Moderatore
                                            Post totali: 718

                                            No è un dato univoco in un file che presenta anche un secondo foglio “Riesume” ( quest’ultimo ha lo stesso nome per tutti i files mensili).

                                            Quindi se non ho capito male, ogni file mese ha 2 fogli: il primo con la tabella giornaliera dei dati da importare, il secondo (riesume) a cosa serve?

                                          • bg66bg66
                                            Partecipante
                                              Post totali: 50

                                              Ciao Sid,
                                              confermo che ogni file è composto da due fogli di lavoro.
                                              Riesume mi aggrega la produzione giornaliera e serve come appoggio per altri files.

                                            • sidsid
                                              Moderatore
                                                Post totali: 718

                                                Ricapitoliamo il discorso

                                                Dal file principale (da ora lo chiamo MASTER) eseguo la macro:
                                                – si apre una finestra di esplora risorse, da dove scelgo il file (da ora lo chiamo SLAVE) da cui desidero importare i dati.
                                                – slave ha 2 fogli: il primo è quello che ci interessa, e la sua struttura è uguale per tutti e 12 i files dei mesi.
                                                – questo foglio sarà sempre in prima posizione in tutti e 12 i files.
                                                – il secondo foglio di slave non deve essere preso in considerazione.
                                                – ciclo i valori di slave uno alla volta, per verificare se questi sono già presenti nel master.
                                                – se il valore è già presente lo ignoro, altrimenti lo aggiungo al master, rispettando sempre le condizioni di importazione.
                                                – alla fine dell’importazione, chiudo slave.

                                                Dimentico qualcosa?

                                              • bg66bg66
                                                Partecipante
                                                  Post totali: 50

                                                  No non dimentichi nulla.

                                                • sidsid
                                                  Moderatore
                                                    Post totali: 718

                                                    Ti passo la macro + una udf che estrae il nome del file da aprire.
                                                    Va messo tutto in un modulo standard
                                                    Questa la udf

                                                    Public Function NOME_FILE_CON_ESTENSIONE(ByVal sDir As String) As String
                                                    NOME_FILE_CON_ESTENSIONE = Mid(sDir, InStrRev(sDir, "\", , vbTextCompare) + 1, Len(sDir))
                                                    End Function

                                                    Questa la macro da abbinare ad un pulsante

                                                    Sub IMPORTA()
                                                    Dim wbMaster As Workbook, wbSlave As Workbook
                                                    Dim wsMaster As Worksheet, wsSlave As Worksheet
                                                    Dim j As Long, nIncr As Long, nRiga As Long
                                                    Dim vMatrix() As Variant, vTabella As Variant
                                                    Dim fd As FileDialog
                                                    Dim sPercorso As String, sNomeFile As String
                                                    Dim rng As Range
                                                    
                                                    Set fd = Application.FileDialog(msoFileDialogFilePicker)
                                                    Set wbMaster = ThisWorkbook
                                                    Set wsMaster = wbMaster.Sheets("Riesume")
                                                    
                                                    Application.ScreenUpdating = False
                                                    On Error GoTo GEST_ERR
                                                    
                                                    'directory dove si aprirà l'esplora risorse
                                                    fd.InitialFileName = "I:\Produzione\2019\"
                                                    
                                                    If Not fd.Show Then
                                                         Err.Raise vbObjectError + 513, Description:="Operazione annullata"
                                                    End If
                                                    sNomeFile = NOME_FILE_CON_ESTENSIONE(fd.SelectedItems(1))
                                                    
                                                    '***********************************************************
                                                    'GESTIONE APERTURA SLAVE
                                                    On Error Resume Next
                                                    If IsError(Application.Workbooks(sNomeFile)) Then
                                                        Set wbSlave = Application.Workbooks.Open(sNomeFile)
                                                    Else
                                                        Set wbSlave = Application.Workbooks(sNomeFile)
                                                    End If
                                                    On Error GoTo 0
                                                    '***********************************************************
                                                    On Error GoTo GEST_ERR
                                                    
                                                    Set wsSlave = wbSlave.Sheets(1) ' primo foglio di slave
                                                    Set rng = wsSlave.Range("B5:Q" & wsSlave.UsedRange.Rows.Count)
                                                    vTabella = rng
                                                    wbSlave.Close False 'ho i dati di slave quindi lo chiudo
                                                    
                                                    For j = LBound(vTabella) To UBound(vTabella)
                                                        If vTabella(j, 1) <> vbNullString Then
                                                            With Application
                                                                'verifico se il dato è già presente nel master
                                                                If IsError(.Match(vTabella(j, 1), wsMaster.Columns(1), 0)) Then
                                                                    nIncr = nIncr + 1
                                                                    ReDim Preserve vMatrix(1 To 6, 1 To nIncr)
                                                                    vMatrix(1, nIncr) = vTabella(j, 1) 'dato1
                                                                    vMatrix(2, nIncr) = vTabella(j, 2) 'dato2
                                                                    vMatrix(3, nIncr) = vTabella(j, 4) 'dato3
                                                                    vMatrix(4, nIncr) = vTabella(j, 5) 'dato4
                                                                    vMatrix(5, nIncr) = vTabella(j, 16) 'dato5
                                                                    vMatrix(6, nIncr) = sNomeFile 'mese importato
                                                                End If
                                                            End With
                                                        End If
                                                    Next j
                                                    ReDim Preserve vMatrix(1 To 6, 1 To nIncr + 1)
                                                    If nIncr = 0 Then
                                                         Err.Raise vbObjectError + 513, Description:="Nessun valore da importare per il file ''" & sNomeFile & "''"
                                                    End If
                                                    
                                                    vMatrix = Application.Transpose(vMatrix) 'traspongo la matrice creata
                                                    
                                                    With wsMaster
                                                        nRiga = .Range("A" & Rows.Count).End(xlUp).Row + 1
                                                        .Range("A" & nRiga & ":F" & nRiga + UBound(vMatrix) - 1) = vMatrix 'scarico la matrice nel foglio
                                                        .Range("A:F").Columns.AutoFit 'adatto le colonne al testo
                                                    End With
                                                    Application.ScreenUpdating = True
                                                    MsgBox "Importati " & nIncr & " elementi dal file ''" & sNomeFile & "''", vbInformation, "IMPORTAZIONE DATI"
                                                    GEST_ERR:
                                                    
                                                    If Err.Number <> 0 Then
                                                        MsgBox Err.Description, vbExclamation, "ATTENZIONE"
                                                    End If
                                                    
                                                    Set wbMaster = Nothing
                                                    Set wbSlave = Nothing
                                                    Set wsMaster = Nothing
                                                    Set wsSlave = Nothing
                                                    Set rng = Nothing
                                                    Set fd = Nothing
                                                    End Sub

                                                    Fa sapere, ciao.

                                                    • Questa risposta è stata modificata 2 mesi fa da sid sid.
                                                  • bg66bg66
                                                    Partecipante
                                                      Post totali: 50

                                                      [RISOLTO]
                                                      Ciao Sid,
                                                      Le prove odierne hanno dato esito positivissimo.
                                                      Continuerò a testarla e a stressarla nei prossimi giorni.

                                                      Grazie mille e alla prossima.

                                                      Gene

                                                    • sidsid
                                                      Moderatore
                                                        Post totali: 718

                                                        Grazie a te per il riscontro.

                                                      Devi essere loggato per rispondere a questa discussione.

                                                      Utilizzando il sito, accetti l'utilizzo dei cookie da parte nostra. maggiori informazioni

                                                      Questo sito utilizza i cookie per fornire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o cliccando su "Accetta" permetti il loro utilizzo.

                                                      Chiudi