You are here:Home-Domande su Excel VBA e MACRO-[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

Visualizzazione 25 filoni di risposte
  • Autore
    Post
    • bg66bg66
      Partecipante
        Post totali: 60

        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 topic è stato modificato 1 anno fa da bg66bg66. Motivo: non visualizzava link
        • Questo topic è stato modificato 1 anno fa da bg66bg66.
        • Questo topic è stato modificato 11 mesi fa da sidsid.
      • sidsid
        Moderatore
          Post totali: 749

          Il link non è valido; rimettilo

        • bg66bg66
          Partecipante
            Post totali: 60

            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 1 anno fa da bg66bg66.
          • sidsid
            Moderatore
              Post totali: 749

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

            • sidsid
              Moderatore
                Post totali: 749

                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: 60

                  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: 749

                    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: 60

                      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: 749

                        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: 60

                          Ciao Sid,
                          ovviamente funziona perfettamente.

                          Attendo tue.

                          Grazie
                          Gene

                        • bg66bg66
                          Partecipante
                            Post totali: 60

                            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 12 mesi fa da bg66bg66.
                            • Questa risposta è stata modificata 12 mesi fa da bg66bg66.
                          • sidsid
                            Moderatore
                              Post totali: 749

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

                            • bg66bg66
                              Partecipante
                                Post totali: 60

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

                              • sidsid
                                Moderatore
                                  Post totali: 749

                                  I 12 file stanno tutti nella stessa cartella?

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

                                • bg66bg66
                                  Partecipante
                                    Post totali: 60

                                    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: 749

                                      ogni file ha soltanto un foglio?

                                    • sidsid
                                      Moderatore
                                        Post totali: 749

                                        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 11 mesi, 3 settimane fa da sidsid.
                                      • bg66bg66
                                        Partecipante
                                          Post totali: 60

                                          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: 749

                                            Quindi saranno tutti dati univoci?

                                          • sidsid
                                            Moderatore
                                              Post totali: 749

                                              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: 60

                                                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: 749

                                                  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: 60

                                                    No non dimentichi nulla.

                                                  • sidsid
                                                    Moderatore
                                                      Post totali: 749

                                                      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 11 mesi, 3 settimane fa da sidsid.
                                                    • bg66bg66
                                                      Partecipante
                                                        Post totali: 60

                                                        [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: 749

                                                          Grazie a te per il riscontro.

                                                      Visualizzazione 25 filoni di risposte
                                                      • Devi essere connesso per rispondere a questo topic.