Pagina precedente | 1 2 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

Trasferire dati da report giornaliero a elenco mensile

Ultimo Aggiornamento: 27/10/2017 19:31
Post: 1
Registrato il: 10/09/2017
Città: ANNONE VENETO
Età: 59
Utente Junior
2007
OFFLINE
10/09/2017 15:25

Un saluto a tutti.
Sono un utilizzatore di Excel con un livello minimo di conoscenza.
Collaboro con un'associazione di volontariato e mi hanno chiesto di risolvere un problema con Excel. Ho cercato sia in Google che nel sito ma non ho trovato le parole chiavi corrette per individuare un aiuto.
Espongo il problema:
Un software genera giornalmente un report dati in xls.
Ogni giorno cambiano i dati ma il formato resta lo stesso
Dovrei copiare i dati di alcune celle di questo report in un foglio xls disponendoli su righe successive in base alla data.
Devo pertanto generare un elenco inserendo giorno per giorno questi dati .
Qualcuno può cortesemente aiutarmi indicandomi un link dove poter trovare un supporto o fornirmi qualche indicazione utile a rispovere il problema ?
Vi ringrazio per le risposte
Ciao
Post: 541
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Senior
Excel 2016-32bit Win11
OFFLINE
10/09/2017 22:33

Questo Forum esiste proprio per aiutare a risolvere le difficoltà.
Se alleghi un file di esempio, eventualmente senza dati sensibili, ma che rispecchi esattamente la struttura del file originale ed eventualmente integrato con un esempio di risultato finale, fatto manualmente se ancora non sono stati fatti dei tentativi per risolvere il problema, troverai sicuramente qualcuno disposto a darti il giusto suggerimento.

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Post: 1
Registrato il: 10/09/2017
Città: ANNONE VENETO
Età: 59
Utente Junior
2007
OFFLINE
16/09/2017 15:34

Esportazione dati da report per data
Mi scuso del ritardo ma non ho avuto modo di rispondere prima.
Allego il file di dati NPL_REPORT.XLS generato giornalmente con la data inserita nella cella J11.
I dati da copiare devono essere inseriti nel foglio NPL_DATI.XLS; in particolare le celle J33, J46 , J38 del file NPL_REPORT.XLS devono essere copiate nel file NPL_DATI.XLS nelle celle C(data corrispondente), D(data corrispondente), F(data corrispondente), dove per data corrispondente intendo il numero di riga corrispondente alla data del report.
Pertanto avrei la necessità di una macro che individui la data nel foglio NPL_REPORT.XLS e che copi le tre celle J33,J46,J38 nelle tre celle C,D,F del file NPL_DATI.XLS in corrispondenza della data uguale.
Preciso che il file NPL_DATI.XLS mi viene fornito ogni 4/5 settimane con le date già inserite e quindi ogni mese circa ne ho uno nuovo.
Ho colorato le celle nei due fogli per rendere meglio l'idea.
Allego i due file per rendere meglio l'idea.
La procedura per copiare i dati è fatta giornalmente.
Vi ringrazio per l'aiuto e per la collaborazione
[SM=x423017]


Post: 542
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Senior
Excel 2016-32bit Win11
OFFLINE
17/09/2017 23:16


Preciso che il file NPL_DATI.XLS mi viene fornito ogni 4/5 settimane con le date già inserite e quindi ogni mese circa ne ho uno nuovo.

Non ho capito bene questa frase visto che dici "fornito ogni 4/5 settimane" (al singolare) poi "con le date già inserite" (al plurale) poi ancora "ogni mese circa ne ho uno" (al singolare) ma poi nel tuo esempio NPL_REPORT c'è una sola data. Mi aspettavo un foglio esempio con più date. E poi, perché nel file NPL_DATI il mese di settembre è completamente diverso dagli altri ? mi aspettavo tutti con lo stesso layout.

Detto questo, in base agli esempi allegati, ti propongo questa macro da mettere in un modulo VBE del file NPL_DATI da lanciare quando serve importare "il dato di un giorno specifico". Una volta lanciata ti viene chiesto di navigare fino al file NPL_REPORT da importare e poi procede con l'inserimento dei 3 totali una volta individuato il foglio relativo al mese della data e la riga relativa al giorno.
Rimane comunque un grosso problema che non sono riuscito a superare, ovvero, nella colonna B del file NPL_DATI, mescolati insieme ai giorni del mese, ci sono i numeri della settimana. La macro per funzionare correttamente abbisogna che tali numeri della settimana siano tolti dalla colonna B e, suggerisco, inseriti nella colonna A insieme al testo "TOT" già presente.

Visto i dubbi che ho testé indicato, la macro la potrai eventualmente utilizzare come base su cui potrai applicare le giuste modifiche per adattarla alla tua realtà che a mio modo di vedere non hai esposto negli esempi.
Option Explicit

Sub ImportaDatiReport()

    Dim cFile As String
    Dim nFile As String
    Dim wbk1 As Workbook
    Dim wbk2 As Workbook
    Dim cMese As String
    Dim cGiorno As String
    Dim sht2 As Worksheet
    Dim riga As Long
    Dim x As Long
    
    Set wbk1 = ActiveWorkbook                               'individua il file DATI
    cFile = Application.GetOpenFilename("Excel Files(*.xls*), *.xls*")  'scelta file REPORT da caricare
    x = Len(cFile)
    While Mid(cFile, x, 1) <> "\"                           'cerca il primo separatore da destra
        x = x - 1
    Wend
    nFile = Right(cFile, Len(cFile) - x)                    'ricava il nome del file REPORT
    Workbooks.Open cFile                                    'apri file REPORT
    Set wbk2 = Workbooks(nFile)                             'individua il file REPORT
    Set sht2 = wbk2.Sheets("aa")                            'individua il foglio in REPORT
    cMese = MonthName(Month(sht2.Range("J4")))              'rileva mese in REPORT
    cGiorno = Day(sht2.Range("J4"))                         'rileva giorno in REPORT
    With wbk1.Sheets(cMese)
         'ricava riga corrispondente al giorno rilevato in REPORT
        riga = .Columns("B").Find(What:=cGiorno, SearchDirection:=xlNext, SearchOrder:=xlByRows).Row
        .Cells(riga, 3).Value = sht2.Range("J33").Value     'riporto dati in colonna C
        .Cells(riga, 4).Value = sht2.Range("J38").Value     'riporto dati in colonna D
        .Cells(riga, 6).Value = sht2.Range("J46").Value     'riporto dati in colonna F
    End With
    wbk2.Close SaveChanges:=False                           'chiudi file REPORT senza salvare
    Set wbk1 = Nothing
    Set wbk2 = Nothing
    Set sht2 = Nothing

End Sub
[Modificato da rollis13 17/09/2017 23:34]

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Post: 2
Registrato il: 10/09/2017
Città: ANNONE VENETO
Età: 59
Utente Junior
2007
OFFLINE
18/09/2017 18:39

Innanzitutto grazie per la rapidità della risposta.
Mi scuso se non ho esposto bene il mio quesito
Cerco di chiarire il problema relativo ai due fogli.

"Non ho capito bene questa frase visto che dici "fornito ogni 4/5 settimane" (al singolare) poi "con le date già inserite" (al plurale) poi ancora "ogni mese circa ne ho uno" (al singolare) ma poi nel tuo esempio NPL_REPORT c'è una sola data."

Il file NPL_DATI viene inviato una volta al mese con le date già inserite in colonna B e comprende 4/5 settimane che dipendono non dal mese solare (quindi non dal 1° del mese all'ultimo del mese solare)ma da come inizia la settimana il primo gennaio di ogni anno.
E' un file che deve raccogliere i dati riepilogativi generati giorno per giorno da un software

Il file NPL_REPORT viene generato ogni giorno da un programma.
Oltre la data del giorno riporta i dati delle tre celle che mi interessa trasferire nel file NPL_DATI.

Quindi,ad esempio, in un mese solare si creano 31 file NPL_REPORT contraddistinti dalla data di generazione.

Pertanto il mio problema è trasferire i tre dati che mi interessano nelle corrispondenti celle del file NPL_DATI, nelle righe con data corrispondente.

Mi scuso se non riesco ad essere più comprensibile e quindi riallego un file NPL_DATI dove ho specificato il significato delle celle e cosa inserire.
Riallego inoltre due file NPL_REPORT generati in due date diverse

A titolo esemplificativo ho compilato manualmente il file NPL_DATI con i valori di due file NPL_REPORT generati ii giorni 13/9/17 e 14/9/17

Per quanto concerne il numero delle settimane che interferiscono con la macro potrei aggiungere una colonna da qualche parte con le date, come ho fatto nel file NPL_DATI che allego

I due file sono presenti nel desktop del pc.
Spero di essere stato più chiaro e rendere l'idea del mio problema
Ancora grazie per la disponibilità

Post: 543
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Senior
Excel 2016-32bit Win11
OFFLINE
18/09/2017 23:14

In pratica non hai aggiunto ulteriori informazioni utili se non confermare quanto avevo "quasi intuito"; ovvero, avrai a disposizione un file NPL_REPORT per ogni giorno del file NPL_DATI e che i suoi fogli, pur nominati per mese, sono in realtà un gruppo di settimane di quel periodo mensile. Ora però mi sorge un altro dubbio, ovvero, i file NPL_REPORT sono tutti nominati alla stessa maniera ? come fai a distinguerli l'uno dall'altro senza aprirli e controllare la data in cella J4 ?

Per quanto riguarda il problema della colonna B dove i numeri delle settimane sono infilati in mezzo ai giorni e, se ho capito bene, il file NPL_DATI non lo crei tu ma ti viene fornito già pronto, invece di sprecare energie e creare un'ulteriore colonna di date manualmente, quello che ti avevo suggerito nel post precedente può essere fatto tramite macro così da lasciare nella colonna B solo i numeri dei giorni in modo da permettere alla macro che ti avevo proposto di operare liberamente.

Quello che però ora mi mette in crisi, e che prima non avevo preso in considerazione, è il fatto che il foglio che chiami "mese" in realtà contiene alcune date relative alla settimana precedente o successiva e riferite ad un altro mese; in questo momento non mi vengono in mente soluzioni "facili".
Per ora la mia macro funzionerebbe bene se il foglio mese contenesse solo date relative al mese stesso.

Pur permanendo il problema delle date relative ad un mese diverso (che per ora non ho idea come risolvere) per integrare la gestione della colonna B basta aggiungere una decina di righe di codice per farla funzionare e questa è la macro appositamente modificata. Fai qualche prova con il mese di ottobre che è completo.
Option Explicit

Sub ImportaDatiReport()

    Dim cFile As String
    Dim nFile As String
    Dim wbk1 As Workbook
    Dim wbk2 As Workbook
    Dim cMese As String
    Dim cGiorno As String
    Dim sht2 As Worksheet
    Dim riga As Long
    Dim x As Long
    
    Set wbk1 = ActiveWorkbook                               'individua il file DATI
    cFile = Application.GetOpenFilename("Excel Files(*.xls*), *.xls*")  'scelta file REPORT da caricare
    x = Len(cFile)
    While Mid(cFile, x, 1) <> "\"                           'cerca il primo separatore da destra
        x = x - 1
    Wend
    nFile = Right(cFile, Len(cFile) - x)                    'ricava il nome del file REPORT
    Workbooks.Open cFile                                    'apri file REPORT
    Set wbk2 = Workbooks(nFile)                             'individua il file REPORT
    Set sht2 = wbk2.Sheets("aa")                            'individua il foglio in REPORT
    cMese = MonthName(Month(sht2.Range("J4")))              'rileva mese in REPORT
    cGiorno = Day(sht2.Range("J4"))                         'rileva giorno in REPORT
    With wbk1.Sheets(cMese)
        '=================== aggiunta ==========================
         'prepara la colonna B con i soli giorni
        x = 6                                                       'inizia dalla riga 6
        Do While .Cells(x, 1) <> ""                                 'esegui fintanto che la cella in colonna A non è vuota
            If .Cells(x, 1) = "TOT" Then                            'cerca TOT in colonna A
                .Cells(x, 1) = .Cells(x, 1) & " " & .Cells(x, 2)    'unisci la cella in colonna B alla A
                .Cells(x, 2) = ""                                   'svuota la cella in B
            End If
            x = x + 1
        Loop
        '=======================================================
         'ricava riga corrispondente al giorno rilevato in REPORT
        riga = .Columns("B").Find(What:=cGiorno, SearchDirection:=xlNext, SearchOrder:=xlByRows).Row
        .Cells(riga, 3).Value = sht2.Range("J33").Value     'riporto dati in colonna C
        .Cells(riga, 4).Value = sht2.Range("J38").Value     'riporto dati in colonna D
        .Cells(riga, 6).Value = sht2.Range("J46").Value     'riporto dati in colonna F
    End With
    wbk2.Close SaveChanges:=False                           'chiudi file REPORT senza salvare
    Set wbk1 = Nothing
    Set wbk2 = Nothing
    Set sht2 = Nothing

End Sub
[Modificato da rollis13 18/09/2017 23:17]

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Post: 3
Registrato il: 10/09/2017
Città: ANNONE VENETO
Età: 59
Utente Junior
2007
OFFLINE
20/09/2017 19:02

Ti rispondo:
avrai a disposizione un file NPL_REPORT per ogni giorno del file NPL_DATI e che i suoi fogli, pur nominati per mese, sono in realtà un gruppo di settimane di quel periodo mensile.

Esatto

Ora però mi sorge un altro dubbio, ovvero, i file NPL_REPORT sono tutti nominati alla stessa maniera ? come fai a distinguerli l'uno dall'altro senza aprirli e controllare la data in cella J4 ?

Il file NPL_REPORT viene generato ogni giorno e sovrascrive quello del giorno precedente

Per quanto riguarda il problema della colonna B dove i numeri delle settimane sono infilati in mezzo ai giorni e, se ho capito bene, il file NPL_DATI non lo crei tu ma ti viene fornito già pronto, invece di sprecare energie e creare un'ulteriore colonna di date manualmente, quello che ti avevo suggerito nel post precedente può essere fatto tramite macro così da lasciare nella colonna B solo i numeri dei giorni in modo da permettere alla macro che ti avevo proposto di operare liberamente.

Purtroppo non posso modificare la colonna B. Mi viene più facile aggiungere una colonna con la data automatica

Quello che però ora mi mette in crisi, e che prima non avevo preso in considerazione, è il fatto che il foglio che chiami "mese" in realtà contiene alcune date relative alla settimana precedente o successiva e riferite ad un altro mese; in questo momento non mi vengono in mente soluzioni "facili".
Per ora la mia macro funzionerebbe bene se il foglio mese contenesse solo date relative al mese stesso.


E' un'ulteriore complicazione. Tieni presente che i realtà i dati da trasferire non sono solo tre come nei file di esempio che ho allegato altrimenti mi conviene farlo manualmente. Sono molti di più disposti però nella stessa colonna degli altri

Pur permanendo il problema delle date relative ad un mese diverso (che per ora non ho idea come risolvere) per integrare la gestione della colonna B basta aggiungere una decina di righe di codice per farla funzionare e questa è la macro appositamente modificata. Fai qualche prova con il mese di ottobre che è completo.

Se ho capito bene devo creare nel file NPL_DATI una nuova macro, copiare le righe che hai compilato, salvare la macro e poi attivarla.
Quando mi arriva il nuovo file devo rifare la macro?
Per me è abbastanza complicato e anche se cerco di apprendere sono veramente a livello basso.
Grazie per il tempo che mi dedichi
Post: 544
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Senior
Excel 2016-32bit Win11
OFFLINE
20/09/2017 22:28

Sì, la macro la devi inserire in un modulo del file NPL_DATI ogni volta che ne ricevi uno ed utilizzarla fino ad esaurimento dei giorni presenti.
Naturalmente ci sono sicuramente diverse soluzioni per evitare di dover inserire la macro ogni volta nel file NPL_DATI; per esempio: potresti avere un file Excel di appoggio nel quale inserisci la macro, appositamente modificata, e quando ti arriva il file NPL_REPORT non fai altro che lanciare questo file appoggio dal quale la macro ti chiederà di indicare il file NPL_DATI da aggiornare e dove si trova il file NPL_REPORT da cui prelevare i dati.
Per quanto riguarda il numero della settimana che deve rimanere nella colonna B, così com'è stato spostato in colonna A, a termine dell'elaborazione lo si può riportare in colonna B.
Rimane il problema di base, ovvero, non ho idea di come gestire le date che si riferiscono a mesi accavallati, pertanto, prendi la mia macro solo come punto/idea di partenza da migliorare e completare.

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Post: 4
Registrato il: 10/09/2017
Città: ANNONE VENETO
Età: 59
Utente Junior
2007
OFFLINE
21/09/2017 18:28

Ho provato la prima macro che hai realizzato e funziona a meraviglia.
Ho fatto dei vari test simulando vari file NPL_REPORT e cambiando la data nella cella J4; quando attivo la macro i dati vengono trasferiti nelle celle specifiche del file NPL_DATI.
Ho riscontrato quanto rilevato nelle tue spiegazioni e cioè gli errori generati quando simulo delle date riferite a giorni di un mese riportate nel mese successivo come ad esempio il 31 ottobre che è inserito nel foglio di novembre
Visto che la macro è sostanzialmente corretta credo che sarebbe più semplice aggiungere da parte mia una colonna con la data completa e far cercare alla macro la data interessata.
Cioè fare una scansione di tutti i fogli della cartella partendo dal primo gennaio 20xx fino a trovare la data corrispondente a J4
mentre, se ho compreso, la tua macro apre il file REPORT, individua la cella con la data (J4), ricava il nome del mese e il giorno e poi cerca nel file DATI il foglio con il nome del mese ed individua il numero del giorno

Inoltre credo di aver capito che la macro apra il browser per la ricerca dei file con questa riga di istruzione:

Set wbk1 = ActiveWorkbook 'individua il file DATI
cFile = Application.GetOpenFilename("Excel Files(*.xls*), *.xls*") 'scelta file REPORT da caricare


Considerato che devo aprire sempre il file con lo stesso nome e sempre salvato sul desktop è possibile evitare il passaggio ?
L'istruzione potrebbe essere qualcosa di simile ?

Workbooks.Open Filename:="c:\utenti\npl\desktop\NPL_REPORT.xls"

La seconda macro la sto provando ma non noto differenze con la prima

Ancora grazie [SM=x423017]





Post: 545
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Senior
Excel 2016-32bit Win11
OFFLINE
23/09/2017 00:01

La logica della macro più o meno è quella mentre l'unica differenza tra la prima e la seconda è che nella seconda il numero settimana veniva spostato automaticamente in colonna A in modo da lasciare nella colonna B solo i numeri dei giorni.
In questa nuova versione il percorso ed i nome file sono riportati in modo statico ed il numero della settimana viene nuovamente riportato nella colonna B al termine dell'elaborazione dato che hai fatto capire che è necessario lasciarlo nella colonna B.
La ricerca del foglio "giusto" ora si basa sul numero della settimana (metodo europeo; la settimana n.1 è quella che contiene il primo giovedì) ma già ho visto una criticità: nel mese di dicembre i giorni 27,28,29,30 sono riportati due volte. Per superare questa criticità probabilmente basta restringere il campo di ricerca alle date relative alla sola settimana individuata invece che all'intera colonna B in modo da ricavare la "riga" giusta.
Option Explicit

Sub ImportaDatiReport()

    Dim wbk1 As Workbook
    Dim nMese As String
    Dim cGiorno As String
    Dim nSett As Integer
    Dim sht As Variant
    Dim sht2 As Worksheet
    Dim riga As Long
    Dim x As Long
    
    Set wbk1 = ActiveWorkbook                                           'individua il file DATI
    Workbooks.Open "C:\Users\NPL\Desktop\NPL_REPORT.xls"    'apri file REPORT (indicare correttamente il percorso)
    Set sht2 = Workbooks("NPL_REPORT.xls").Sheets("aa")                 'individua il foglio in REPORT
    cGiorno = Day(sht2.Range("J4"))                                     'rileva giorno in REPORT
    nSett = Application.WeekNum(sht2.Range("J4"), 21)                   'rileva settimana (metodo europeo) in REPORT
     'cerca in tutti i fogli del file NPL_DATI il numero settimana
    For Each sht In wbk1.Worksheets
        If sht.Name <> "PIAVE" Then                                     'escludi il primo foglio
            With sht                                                    'attiva il foglio da controllare
                x = 6                                                   'inizia dalla riga 6
                Do While .Cells(x, 1) <> ""                             'esegui fintanto che la cella in colonna A non è vuota
                    If .Cells(x, 1) = "TOT" Then                        'cerca TOT in colonna A
                        If .Cells(x, 2) = nSett Then                    'confronta numero settimana
                            nMese = sht.Name                            'assegna nome mese
                            GoTo trovato                                'esci dal loop e procedi
                        End If
                    End If
                    x = x + 1
                Loop
            End With
        End If
    Next sht
     'segnala errore per mancanza del foglio con numero settimana prevista
    If nMese = "" Then
        MsgBox "Il numero settimana " & nSett & " corrispondente al giorno " & sht2.Range("J4") & " non è presente nei fogli del file NPL_DATI."
        GoTo fine
    End If
trovato:
    With wbk1.Sheets(nMese)
         'prepara la colonna B con i soli giorni
        x = 6                                                           'inizia dalla riga 6
        Do While .Cells(x, 1) <> ""                                     'esegui fintanto che la cella in colonna A non è vuota
            If .Cells(x, 1) = "TOT" Then                                'cerca TOT in colonna A
                .Cells(x, 1) = .Cells(x, 1) & " " & .Cells(x, 2)        'unisci la cella in colonna B alla A
                .Cells(x, 2) = ""                                       'svuota la cella in B
            End If
            x = x + 1
        Loop
         'ricava riga corrispondente al giorno rilevato in NPL_REPORT
        riga = .Columns("B").Find(What:=cGiorno, SearchDirection:=xlNext, SearchOrder:=xlByRows).Row
        .Cells(riga, 3).Value = sht2.Range("J33").Value                 'riporto dati in colonna C
        .Cells(riga, 4).Value = sht2.Range("J38").Value                 'riporto dati in colonna D
        .Cells(riga, 6).Value = sht2.Range("J46").Value                 'riporto dati in colonna F
         'ripristina la colonna B con i giorni + numero settimana
        x = 6                                                           'inizia dalla riga 6
        Do While .Cells(x, 1) <> ""                                     'esegui fintanto che la cella in colonna A non è vuota
            If Left(.Cells(x, 1), 3) = "TOT" Then                       'cerca TOT in colonna A
                .Cells(x, 2) = Mid(.Cells(x, 1), 4, Len(.Cells(x, 1)))  'metti num.sett. in colonna B
                .Cells(x, 1) = Left(.Cells(x, 1), 3)                    'aggiorna colonna A
            End If
            x = x + 1
        Loop
    End With
fine:
    Workbooks("NPL_REPORT.xls").Close SaveChanges:=False                'chiudi file REPORT senza salvare
    Set wbk1 = Nothing
    Set sht2 = Nothing

End Sub
[Modificato da rollis13 24/09/2017 00:01]

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Post: 5
Registrato il: 10/09/2017
Città: ANNONE VENETO
Età: 59
Utente Junior
2007
OFFLINE
23/09/2017 08:30

Re:
rollis13, 23/09/2017 00.01:

La logica della macro più o meno è quella mentre l'unica differenza tra la prima e la seconda è che nella seconda il numero settimana veniva spostato automaticamente in colonna A in modo da lasciare nella colonna B solo i numeri dei giorni.
In questa nuova versione il percorso ed i nome file sono riportati in modo statico ed il numero della settimana viene nuovamente riportato nella colonna B al termine dell'elaborazione dato che hai fatto capire che è necessario lasciarlo nella colonna B.
La ricerca del foglio "giusto" ora si basa sul numero della settimana (metodo europeo; la settimana n.1 è quella che contiene il primo giovedì) ma già ho visto una criticità: nel mese di dicembre i giorni 27,28,29,30 sono riportati due volte. Per superare questa criticità probabilmente basta restringere il campo di ricerca alle date relative alla sola settimana individuata invece che all'intera colonna B in modo da ricavare la "riga" giusta.
Option Explicit

Sub ImportaDatiReport()

    Dim wbk1 As Workbook
    Dim nMese As String
    Dim cGiorno As String
    Dim nSett As Integer
    Dim sht As Variant
    Dim sht2 As Worksheet
    Dim riga As Long
    Dim x As Long
    
    Set wbk1 = ActiveWorkbook                                           'individua il file DATI
    Workbooks.Open "C:\Users\NPL\Desktop\NPL_REPORT.xls"    'apri file REPORT (indicare correttamente il percorso)
    Set sht2 = Workbooks("NPL_REPORT.xls").Sheets("aa")                 'individua il foglio in REPORT
    cGiorno = Day(sht2.Range("J4"))                                     'rileva giorno in REPORT
    nSett = Application.WeekNum(sht2.Range("J4"))                       'rileva settimana in REPORT
     'cerca in tutti i fogli del file NPL_DATI il numero settimana
    For Each sht In wbk1.Worksheets
        If sht.Name <> "PIAVE" Then                                     'escludi il primo foglio
            With sht                                                    'attiva il foglio da controllare
                x = 6                                                   'inizia dalla riga 6
                Do While .Cells(x, 1) <> ""                             'esegui fintanto che la cella in colonna A non è vuota
                    If .Cells(x, 1) = "TOT" Then                        'cerca TOT in colonna A
                        If .Cells(x, 2) = nSett Then                    'confronta numero settimana
                            nMese = sht.Name                            'assegna nome mese
                            GoTo trovato                                'esci dal loop e procedi
                        End If
                    End If
                    x = x + 1
                Loop
            End With
        End If
    Next sht
     'segnala errore per mancanza del foglio con numero settimana prevista
    If nMese = "" Then
        MsgBox "Il numero settimana " & nSett & " corrispondente al giorno " & sht2.Range("J4") & " non è presente nei fogli del file NPL_DATI."
        GoTo fine
    End If
trovato:
    With wbk1.Sheets(nMese)
         'prepara la colonna B con i soli giorni
        x = 6                                                           'inizia dalla riga 6
        Do While .Cells(x, 1) <> ""                                     'esegui fintanto che la cella in colonna A non è vuota
            If .Cells(x, 1) = "TOT" Then                                'cerca TOT in colonna A
                .Cells(x, 1) = .Cells(x, 1) & " " & .Cells(x, 2)        'unisci la cella in colonna B alla A
                .Cells(x, 2) = ""                                       'svuota la cella in B
            End If
            x = x + 1
        Loop
         'ricava riga corrispondente al giorno rilevato in NPL_REPORT
        riga = .Columns("B").Find(What:=cGiorno, SearchDirection:=xlNext, SearchOrder:=xlByRows).Row
        .Cells(riga, 3).Value = sht2.Range("J33").Value                 'riporto dati in colonna C
        .Cells(riga, 4).Value = sht2.Range("J38").Value                 'riporto dati in colonna D
        .Cells(riga, 6).Value = sht2.Range("J46").Value                 'riporto dati in colonna F
         'ripristina la colonna B con i giorni + numero settimana
        x = 6                                                           'inizia dalla riga 6
        Do While .Cells(x, 1) <> ""                                     'esegui fintanto che la cella in colonna A non è vuota
            If Left(.Cells(x, 1), 3) = "TOT" Then                       'cerca TOT in colonna A
                .Cells(x, 2) = Mid(.Cells(x, 1), 4, Len(.Cells(x, 1)))  'metti num.sett. in colonna B
                .Cells(x, 1) = Left(.Cells(x, 1), 3)                    'aggiorna colonna A
            End If
            x = x + 1
        Loop
    End With
fine:
    Workbooks("NPL_REPORT.xls").Close SaveChanges:=False                'chiudi file REPORT senza salvare
    Set wbk1 = Nothing
    Set sht2 = Nothing

End Sub



Resto veramente meravigliato delle possibilità offerte da questo tipo di programmazione. Per quanto mi sarei potuto impegnare con le mie conoscenze non sarei mai arrivato a questo punto.
Ti ringrazio per il fondamentale apporto che mi stai fornendo.
Appena possibile integro la macro e poi la provo.
Grazie
Giancarlo
Post: 546
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Senior
Excel 2016-32bit Win11
OFFLINE
23/09/2017 23:58

Anche se non ho fatto molti test questa potrebbe essere una versione operativa. La ricerca del giorno nel file NPL_DATI avviene solamente nella settimana una volta individuato il foglio che la contiene. Eliminata pertanto anche la necessità predisporre la colonna B per poi rimetterla a posto.
Option Explicit

Sub ImportaDatiReport()

    Dim wbk1 As Workbook
    Dim nMese As String
    Dim cGiorno As String
    Dim nSett As Integer
    Dim rCella As String
    Dim sht As Variant
    Dim sht2 As Worksheet
    Dim riga As Long
    Dim x As Long
    
    Set wbk1 = ActiveWorkbook                                           'individua il file DATI
     'apri il file NPL_REPORT presente sul Desktop dell'utente attivo
    Workbooks.Open CreateObject("WScript.Shell").SpecialFolders("DeskTop") & "\NPL_REPORT.xls"
    Set sht2 = Workbooks("NPL_REPORT.xls").Sheets("aa")                 'individua il foglio in REPORT
    cGiorno = Day(sht2.Range("J4"))                                     'rileva giorno in REPORT
    nSett = WorksheetFunction.WeekNum(sht2.Range("J4"), 21)             'rileva settimana (metodo europeo) in REPORT
     'cerca in tutti i fogli del file NPL_DATI il numero settimana
    For Each sht In wbk1.Worksheets
        If sht.Name <> "PIAVE" Then                                     'escludi il primo foglio
            With sht                                                    'attiva il foglio da controllare
                x = 6                                                   'inizia dalla riga 6
                Do While .Cells(x, 1) <> ""                             'esegui fintanto che la cella in colonna A non è vuota
                    If .Cells(x, 1) = "TOT" Then                        'cerca TOT in colonna A
                        If .Cells(x, 2) = nSett Then                    'confronta numero settimana
                            nMese = sht.Name                            'assegna nome mese
                            rCella = .Cells(x, 2).Address               'individua la cella del numero settimana
                            GoTo trovato                                'esci dal loop e procedi
                        End If
                    End If
                    x = x + 1
                Loop
            End With
        End If
    Next sht
     'segnala errore per mancanza del foglio con numero settimana prevista
    If nMese = "" Then
        MsgBox "Il numero settimana " & nSett & " corrispondente al giorno " & sht2.Range("J4") & " non è presente nei fogli del file NPL_DATI."
        GoTo fine
    End If
trovato:
    With wbk1.Sheets(nMese)
         'ricava la riga del giorno nella settimana corrispondente presente nel mese individuato
        x = Range(rCella).Row - 1
        riga = .Range("B" & x - 6 & ":B" & x).Find(What:=cGiorno, SearchDirection:=xlNext, SearchOrder:=xlByRows).Row
        .Cells(riga, 3).Value = sht2.Range("J33").Value                 'riporto dati in colonna C
        .Cells(riga, 4).Value = sht2.Range("J38").Value                 'riporto dati in colonna D
        .Cells(riga, 6).Value = sht2.Range("J46").Value                 'riporto dati in colonna F
    End With
fine:
    Workbooks("NPL_REPORT.xls").Close SaveChanges:=False                'chiudi file REPORT senza salvare
    Set wbk1 = Nothing
    Set sht2 = Nothing

End Sub

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Post: 6
Registrato il: 10/09/2017
Città: ANNONE VENETO
Età: 59
Utente Junior
2007
OFFLINE
28/09/2017 17:47

Ciao

Ho provato l'ultima versione ma genera un errore
Ti allego gli screeshoot
Mi sembra di capire che non trova il numero settimana in REPORT.xls
Mi scuso per il ritardo ma ho avuto problemi con il lavoro.
Grazie per la tua risposta

Post: 547
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Senior
Excel 2016-32bit Win11
OFFLINE
29/09/2017 00:40

Forse dipende dalla versione di Excel in uso (non credo dipenda da una libreria non attiva). Riprova con uno di questi:

nSett = Application.WeekNum(sht2.Range("J4"), 21)

nSett = Application.WorksheetFunction.WeekNum(sht2.Range("J4"), 21)

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Post: 7
Registrato il: 10/09/2017
Città: ANNONE VENETO
Età: 59
Utente Junior
2007
OFFLINE
29/09/2017 16:19

Non funziona nessuna delle due linee che hai inviato
Generano lo stesso errore della precedente
Allego la versione di Excel
Ciao
Post: 549
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Senior
Excel 2016-32bit Win11
OFFLINE
29/09/2017 19:58

In rete non ho trovato informazioni per Excel 2K7 ma credo che non preveda il parametro 21.
Prima di tutto controlla che WorksheetFunction sia attivo e che accetti WeekNum. Dalla finestra VBA premi il tasto F2 / nella finestra Visualizzatore Oggetti che compare scegli Excel nella prima cella / poi tra le Classi cerca WorksheetFunction / e se trovata cerca WeekNum tra i Membri.
Se c'è chiudi la finestra e torna alla macro nel modulo e metti un 2 al posto del 21 alla riga, così vediamo se vi sono altri problemi:

nSett = WorksheetFunction.WeekNum(sht2.Range("J4"), 2)

La prima difficoltà è che con 2 il numero settimana calcolata per l'anno 2017 sarà +1 . Questo in modo empirico lo puoi "aggiustare" modificando la riga in:

nSett = WorksheetFunction.WeekNum(sht2.Range("J4"), 2) - 1

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Post: 8
Registrato il: 10/09/2017
Città: ANNONE VENETO
Età: 59
Utente Junior
2007
OFFLINE
29/09/2017 20:39

Faccio un test su Excel 2010
Così verifico e poi ti so dire
Grazie
Ciao
Post: 9
Registrato il: 10/09/2017
Città: ANNONE VENETO
Età: 59
Utente Junior
2007
OFFLINE
30/09/2017 16:51

Ciao
Ho provato su Excel 2010 e la macro funziona.
Però facendo vari test ho notato che i dati del giorno 01/11/2017 sono inseriti nel giorno 31/10/2017 mentre altri giorni ( ad esempio 01/12/2017) generano un errore che riporto nell'allegata immagine.
Le date in fogli non presenti generano la corretta comunicazione del foglio mancante.
Grazie veramente per la tua dedizione
Post: 550
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Senior
Excel 2016-32bit Win11
OFFLINE
30/09/2017 17:59

Per quanto riguarda date tipo giorno 01/11 che hanno il 31 nella cella precedente è una mia distrazione. In questo caso è chiaro che il Find cerca il primo numero 1 disponibile e lo trova già nel 31. Per ovviare basta inserire uno dei tanto parametri previsti tipo LookAt:=xlWhole (intero) oppure LookAt:=xlValues (valori) pertanto la riga può essere riscritta così:
riga = .Range("B" & x - 6 & ":B" & x).Find(What:=cGiorno, LookAt:=xlWhole, SearchDirection:=xlNext, SearchOrder:=xlByRows).Row

Invece per il 01/12/2017 non ho riscontri, il 1' dicembre vale quanto un 1' novembre pertanto se la macro funziona per uno funziona anche per l'altro. In ogni caso dall'immagine si vede il Debug fermo a quella riga ma non c'è traccia dell'errore segnalato.

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Post: 10
Registrato il: 10/09/2017
Città: ANNONE VENETO
Età: 59
Utente Junior
2007
OFFLINE
01/10/2017 11:10

Re:
rollis13, 30/09/2017 17.59:

Per quanto riguarda date tipo giorno 01/11 che hanno il 31 nella cella precedente è una mia distrazione. In questo caso è chiaro che il Find cerca il primo numero 1 disponibile e lo trova già nel 31. Per ovviare basta inserire uno dei tanto parametri previsti tipo LookAt:=xlWhole (intero) oppure LookAt:=xlValues (valori) pertanto la riga può essere riscritta così:
riga = .Range("B" & x - 6 & ":B" & x).Find(What:=cGiorno, LookAt:=xlWhole, SearchDirection:=xlNext, SearchOrder:=xlByRows).Row

Invece per il 01/12/2017 non ho riscontri, il 1' dicembre vale quanto un 1' novembre pertanto se la macro funziona per uno funziona anche per l'altro. In ogni caso dall'immagine si vede il Debug fermo a quella riga ma non c'è traccia dell'errore segnalato.



Provo appena possibile ma non ho dubbi che sicuramente la macro funzionerà .



Post: 11
Registrato il: 10/09/2017
Città: ANNONE VENETO
Età: 59
Utente Junior
2007
OFFLINE
17/10/2017 19:59

Re:
rollis13, 30/09/2017 17.59:

Per quanto riguarda date tipo giorno 01/11 che hanno il 31 nella cella precedente è una mia distrazione. In questo caso è chiaro che il Find cerca il primo numero 1 disponibile e lo trova già nel 31. Per ovviare basta inserire uno dei tanto parametri previsti tipo LookAt:=xlWhole (intero) oppure LookAt:=xlValues (valori) pertanto la riga può essere riscritta così:
riga = .Range("B" & x - 6 & ":B" & x).Find(What:=cGiorno, LookAt:=xlWhole, SearchDirection:=xlNext, SearchOrder:=xlByRows).Row

Invece per il 01/12/2017 non ho riscontri, il 1' dicembre vale quanto un 1' novembre pertanto se la macro funziona per uno funziona anche per l'altro. In ogni caso dall'immagine si vede il Debug fermo a quella riga ma non c'è traccia dell'errore segnalato.



Scusa il ritardo nella risposta ma ero via per lavoro
la macro funziona perfettamente
Sono veramente contento ed apprezzo la tua capacità e la disponibilità nel risolvere questo problema per me insormontabile.
Ho fatto vari test ed ho notato un altro inconveniente non legato alla macro ma al formato dei dati.
Nel file NPL_REPORT i dati sono inspiegabilmente in formato testo e non numerico e dopo l'importazione non funzionano le varie formule
Ho cercato una possibile soluzione che dovrebbe essere legata all'utilizzo del comando :

NumberFormat = "#,##0.00"

In questo caso per per formattare una cella con numero a 2 decimali e separatore delle migliaia.(almeno mi sembra di aver capito)

Ho fatto diverse prove ma non capisco dove inserirlo nelle righe di codice relative alla scrittura dei dati nelle celle stabilite.

Forse non è la soluzione ideale ?
Come si potrebbe risolvere?

Grazie di tutto

Post: 578
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Senior
Excel 2016-32bit Win11
OFFLINE
17/10/2017 22:42

Analizzando i primi file esempio non noto la criticità che hai appena evidenziato; utilizzando i dati importati eventuali formule li prendono in considerazione come numeri.
Dopo tutta questa implementazione credo sia il caso di riportare 2 nuovi esempi di file Dati e Report con dati più vicini alla realtà (formato celle e contenuto celle).

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Post: 12
Registrato il: 10/09/2017
Città: ANNONE VENETO
Età: 59
Utente Junior
2007
OFFLINE
19/10/2017 15:39

Re:
rollis13, 17/10/2017 22.42:

Analizzando i primi file esempio non noto la criticità che hai appena evidenziato; utilizzando i dati importati eventuali formule li prendono in considerazione come numeri.
Dopo tutta questa implementazione credo sia il caso di riportare 2 nuovi esempi di file Dati e Report con dati più vicini alla realtà (formato celle e contenuto celle).



rollis13, 17/10/2017 22.42:

Analizzando i primi file esempio non noto la criticità che hai appena evidenziato; utilizzando i dati importati eventuali formule li prendono in considerazione come numeri.
Dopo tutta questa implementazione credo sia il caso di riportare 2 nuovi esempi di file Dati e Report con dati più vicini alla realtà (formato celle e contenuto celle).



Allego il file originale "PIAVE_Obiettivi corretto.xls" ex NPL_DATI.xls, il file "riepilogovendite.xls" ex NPL_REPORT.xls che sono quelli originali.

Ti allego la macro modificata per gestire i file con i nomi originali e 4 immagini relative a:

immagine.jpg = errore formato colonna C (le altre sono corrette)

immagine1.jpg= errore relativo alla somma settimanale mentre il totale mese è corretto

immagine2.jpg=formula del totale mese realizzata sommando una ad una le celle relative al giornaliero colonna C

immagine3.jpg= funzionesomma usata per il calcolo settimanale

Purtroppo non posso cambiare la tipologia delle formule in quanto il file PIAVE_Obiettivi corretto.xls viene fornito più volte nel corso dell'anno

La macro per renderla sempre disponibile è stata salvata nella cartella personale

Grazie [SM=x423017]


Post: 580
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Senior
Excel 2016-32bit Win11
OFFLINE
19/10/2017 22:35

Il numero in formato testo te lo porti avanti dal file Riepilogo; se non è possibile modificare il modo/formato in cui vengono compilate le celle nel file Riepilogo nella macro ti basta cambiare il codice delle righe che importano il valore moltiplicando il valore stesso per uno (così per tutte le righe, non si sa mai):

.Cells(riga, 3).Value = sht2.Range("J33").Value * 1

Poi, per non complicarti la vita nelle formule che metti nella riga 47, invece di riportare tutte le celle con il rischio di commettere errori puoi sfruttare questa Function, che riporto sotto, da mettere in un modulo vba e poi nelle varie celle della riga 47 puoi usare questa formula dove indichi prima il range a partire dal primo TOT da sommare fino all'ultimo e poi ogni quante righe.
Esempio per cella C47 poi basta trascinare a destra a parte riformattare i decimali dove diversi:

=SommaOgni(C13:C37;6)

Function SommaOgni(Importi As Range, Salta As Integer) As Double
  
    Dim x As Integer, Totale As Double
    
    For x = 1 To Importi.Count Step Salta
        Totale = Totale + Importi(x)
    Next
    SommaOgni = Totale

End Function
[Modificato da rollis13 19/10/2017 22:38]

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Post: 13
Registrato il: 10/09/2017
Città: ANNONE VENETO
Età: 59
Utente Junior
2007
OFFLINE
21/10/2017 17:32

Re:
rollis13, 19/10/2017 22.35:

Il numero in formato testo te lo porti avanti dal file Riepilogo; se non è possibile modificare il modo/formato in cui vengono compilate le celle nel file Riepilogo nella macro ti basta cambiare il codice delle righe che importano il valore moltiplicando il valore stesso per uno (così per tutte le righe, non si sa mai):

.Cells(riga, 3).Value = sht2.Range("J33").Value * 1

Poi, per non complicarti la vita nelle formule che metti nella riga 47, invece di riportare tutte le celle con il rischio di commettere errori puoi sfruttare questa Function, che riporto sotto, da mettere in un modulo vba e poi nelle varie celle della riga 47 puoi usare questa formula dove indichi prima il range a partire dal primo TOT da sommare fino all'ultimo e poi ogni quante righe.
Esempio per cella C47 poi basta trascinare a destra a parte riformattare i decimali dove diversi:

=SommaOgni(C13:C37;6)

Function SommaOgni(Importi As Range, Salta As Integer) As Double
  
    Dim x As Integer, Totale As Double
    
    For x = 1 To Importi.Count Step Salta
        Totale = Totale + Importi(x)
    Next
    SommaOgni = Totale

End Function



Ciao

La modifica della moltiplicazione funziona bene ed ha sistemato il formato cella.
Ho fatto svariate prove e tutte le date funzionano tranne il 27/28/29/30 novembre,il 1°, il 2 il 3 dicembre
Funziona il 30/10, il 30/09, il 01/01/2018 ma quella settimana (la 48) genera sempre lo stesso errore
Ti allego la videata.
Avevo già corretto la riga come indicato in un precedente post ma l'errore si ripropone solo in quelle date.
Rispetto a quanto allegato nel post precedente ho modificato la macro aggiungendo il codice *1 come da te indicato senza ulteriori modifiche
La settimana incriminata è la 48
[SM=x423021]
Post: 581
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Senior
Excel 2016-32bit Win11
OFFLINE
21/10/2017 23:30

La settimana 48 ti crea problemi in quanto, oltre che essere presente nel foglio dicembre, risulta duplicata nel mese di novembre nelle righe nascoste 38-45.

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Post: 14
Registrato il: 10/09/2017
Città: ANNONE VENETO
Età: 59
Utente Junior
2007
OFFLINE
22/10/2017 13:21

Verissimo
Non avevo colto il particolare
Oltretutto è l'unica settimana nascosta dove hanno lasciato il numero
Veramente geniale
Non sarei mai arrivato fin qua
Grazie molte
[SM=x423047]
Post: 15
Registrato il: 10/09/2017
Città: ANNONE VENETO
Età: 59
Utente Junior
2007
OFFLINE
22/10/2017 13:25

RISOLTO
Jacknemo, 22/10/2017 13.21:

Verissimo
Non avevo colto il particolare
Oltretutto è l'unica settimana nascosta dove hanno lasciato il numero
Veramente geniale
Non sarei mai arrivato fin qua
Grazie molte
[SM=x423047]




Post: 16
Registrato il: 10/09/2017
Città: ANNONE VENETO
Età: 59
Utente Junior
2007
OFFLINE
22/10/2017 20:28

Re:
rollis13, 21/10/2017 23.30:

La settimana 48 ti crea problemi in quanto, oltre che essere presente nel foglio dicembre, risulta duplicata nel mese di novembre nelle righe nascoste 38-45.



Spero di non andare contro il regolamento del forum
Riapro la discussione per un dettaglio
Mi sono accorto che nel trasferimento si copia anche il formato cella che nel file di partenze non ha bordi mentre nel file di destinazione la formattazione delle celle ha i bordi
Come si riesce a trasferire i valori ma non modificare la formattazione (in questo caso i bordi) della cella ?
[SM=x423017]

Post: 582
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Senior
Excel 2016-32bit Win11
OFFLINE
22/10/2017 22:14

Con i file allegati non riesco a replicare il problema.
In ogni caso, in pratica, non è possibile che ciò avvenga, ovvero, nella macro ho utilizzato appositamente .value per evitare "inquinamento"; tale parametro impone la copia di soli valori (la cifra).
Forse, a meno di modifiche successive alla macro, si tratta di un caso con una cella specifica; sii più preciso.

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Vota: 15MediaObject5,00232 2
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 2 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 16:25. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com