Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

[VBA] Confronto date e unione fogli

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

[VBA] Confronto date e unione fogli

Postdi bome » 01/09/14 12:06

Ciao a tutti ho risolto un sacco di problemi grazie al vostro forum. Ma adesso ho bisogno di un grande aiuto
Devo tirar fuori dei grafici da dei csv che sono in numero variabile e hanno un nome che supera i 31 caratteri. Riesco a farli aprire e metterli in ordine.

Ma purtroppo mi sono arenato in questi problemi:
Deve scansionare tutti i fogli a partire dal terzo (i primi 3 fogli sono fissi) e controllare che la data nella casella C1 sia uguale, se non lo è deve mandare un avviso dove avverte che le date non sono uguali (un normale msgbox è perfetto).
La cella ha la data impostata in questo modo.
Date-Time=11:41:51 2014-04-22
A me interessa confrontare solo la data e non l’ora.

In seguito deve scansionare ancora i fogli dal terzo in poi come prima controllando la cella E1 nel caso ci siano 2 o più fogli uguali li deve riunire in uno solo. In che modo?
Vanno uniti prendendo intestazione e dati del primo (tutto il foglio praticamente) sostituendo in parte o totalmente i dati del primo con quelli del secondo.
La colonna B(i valori partono da B4) ha dei valori progressivi che indicano lo stato di avanzamento della macchina in caso di malfunzionamento o problemi vari può essere riportata indietro totalmente o parzialmente quindi devo tener buoni i valori del secondo foglio dal punto in cui riparte in poi.
Per esempio: nella colonna B del primo foglio ho : 1, 1.2, 2, 2.3, 3, 3.2, 3.6, 4, 4.5, 5
Nel nella colonna B del secondo foglio ho : 3.1, 3.3, 4.3, 4.5, 5.3, 5.7, 6
Deve praticamente cancellare le righe di dati 3.2, 3.6, 4, 4.5, 5 del primo foglio e attaccarci quelle del secondo foglio 3.1, 3.3, 4.3, 4.5, 5.3, 5.7, 6. Diventando : 1, 1.2, 2, 2.3, 3, 3.1, 3.3, 4.3, 4.5, 5.3, 5.7, 6 naturalmente il secondo foglio va eliminato.
Fatto questo se incontra un altro foglio con la cella E1 uguale prende il foglio appena creato e unisce i fogli allo stesso modo di prima.
Vi fornisco anche un esempio dei csv che vanno elaborati...
https://www.dropbox.com/sh/nfq4r4pz3a56 ... 7uX1a?dl=0
Ho cercato di essere il più chiaro possibile. Uso Excel 2010. Ringrazio fin da ora quelli che proveranno ad aiutarmi.
Microsoft Office 2010
bome
Utente Junior
 
Post: 18
Iscritto il: 04/08/14 18:24

Sponsor
 

Re: [VBA] Confronto date e unione fogli

Postdi Anthony47 » 02/09/14 00:40

Ciao bome, benvenuto nel forum.
Riesco a farli aprire e metterli in ordine.
Se riesci gia' a fare questo non passarci i soli csv ma il workbook con i fogli gia' ordinati.
Questo ci evita di scaldare l' acqua, e dovrebbe anche evitarci di capire quale e' il terzo foglio da cui cominciare a lavorare.

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13903
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [VBA] Confronto date e unione fogli

Postdi bome » 02/09/14 13:49

OK! Ti ringrazio molto. Appena posso metto il Workbook!
Microsoft Office 2010
bome
Utente Junior
 
Post: 18
Iscritto il: 04/08/14 18:24

Re: [VBA] Confronto date e unione fogli

Postdi bome » 04/09/14 09:57

Ho aggiunto nella cartella dropbox il file "WorkBookOK". Ho aperto un log completo. Sono una trentina di csv.
Microsoft Office 2010
bome
Utente Junior
 
Post: 18
Iscritto il: 04/08/14 18:24

Re: [VBA] Confronto date e unione fogli

Postdi Anthony47 » 04/09/14 18:18

Ho aggiunto nella cartella dropbox il file "WorkBookOK". Ho aperto un log completo. Sono una trentina di csv.
Devi pero' passarci un link per accedere al file nel tuo fropbox!

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13903
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [VBA] Confronto date e unione fogli

Postdi bome » 04/09/14 22:30

Anthony47 ha scritto:
Ho aggiunto nella cartella dropbox il file "WorkBookOK". Ho aperto un log completo. Sono una trentina di csv.
Devi pero' passarci un link per accedere al file nel tuo fropbox!

Ciao


Non funziona quello che ho messo nel primo post? Se ho sbagliato qualcosa chiedo scusa ma è la prima volta che uso Dropbox.
Microsoft Office 2010
bome
Utente Junior
 
Post: 18
Iscritto il: 04/08/14 18:24

Re: [VBA] Confronto date e unione fogli

Postdi Flash30005 » 04/09/14 23:01

Non c'è alcun link del dropbox nel tuo post
ti consiglio di fare sempre un'anteprima del post (quando sei nell'editor) e verificare che ci sia tutto ciò che intendevi inserire prima di inviare per la pubblicazione,
inoltre ricordati di condividere i file del dropbox altrimenti potrai vederli/scaricare solo tu

ciao
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: [VBA] Confronto date e unione fogli

Postdi ricky53 » 04/09/14 23:52

Ciao Anthony e Flash,
il link sta nel "SUO Primo Intervento" e nel DropBox linkato ha aggiunto il file; è in coda agli altri file già presenti.

Io sono riuscito a scaricarlo.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: [VBA] Confronto date e unione fogli

Postdi bome » 05/09/14 02:43

Grazie ricky :-) . Colpa mia, scusate. Dovevo mettere più in evidenza il link.
Microsoft Office 2010
bome
Utente Junior
 
Post: 18
Iscritto il: 04/08/14 18:24

Re: [VBA] Confronto date e unione fogli

Postdi Anthony47 » 05/09/14 11:49

Ho guardato il file e vorrei una conferma...
Vedo che i fogli hanno (in C1) un time stamp non progressivo; mi confermi che, partendo dal foglio 4, i dati del foglio 5 sostituiscono quelli del foglio 4 (aggiornando cosi' il contenuto di foglio 4), i dati del foglio 6 sostituiscono anche loro quelli (aggiornati) del foglio 4, e cosi' via?

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13903
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [VBA] Confronto date e unione fogli

Postdi bome » 06/09/14 03:04

Anthony47 ha scritto:Ho guardato il file e vorrei una conferma...
Vedo che i fogli hanno (in C1) un time stamp non progressivo; mi confermi che, partendo dal foglio 4, i dati del foglio 5 sostituiscono quelli del foglio 4 (aggiornando cosi' il contenuto di foglio 4), i dati del foglio 6 sostituiscono anche loro quelli (aggiornati) del foglio 4, e cosi' via?

Ciao


Mi sono accorto di una svista nel Workbook ho aperto 2 log. Adesso è aggiornato con 1 solo.
Si te lo confermo. La cosa importante e che siano progressivi quelli con lo stesso valore in E1. Vanno infatti uniti quelli con lo stesso valore nella cella E1. Alla fine avrò un solo foglio con WR=01 uno solo con WR=02 uno solo con WR=03 e così via.
Microsoft Office 2010
bome
Utente Junior
 
Post: 18
Iscritto il: 04/08/14 18:24

Re: [VBA] Confronto date e unione fogli

Postdi Anthony47 » 09/09/14 00:44

Vanno infatti uniti quelli con lo stesso valore nella cella E1. Alla fine avrò un solo foglio con WR=01 uno solo con WR=02 uno solo con WR=03 e così via.
Questo chiarisce molte cose.

Penso che questa macro possa funzionare:
Codice: Seleziona tutto
Sub shmerge()
Dim I As Long, J As Long, myMatch, myMatch2, LastB As Long, myBeg As Single, myEnd As Single
Dim DelArr() As Long, myEndRow As Long
'
'Parte prima, merge dei dati
ReDim DelArr(1 To Worksheets.Count)
For J = 4 To Worksheets.Count
    With Sheets(J)
    Sheets(J).Tab.Color = RGB(0, 255, 0)
    .Select
        For I = J + 1 To Worksheets.Count
        If Sheets(I).Range("E1") <> .Range("E1") Then Exit For
            LastB = .Cells(Rows.Count, "B").End(xlUp).Row
            If .Range("B3").Value = "" Then .Range("B3").Value = 0
            myBeg = Sheets(I).Range("B4").Value
            myEnd = Sheets(I).Range("B4").End(xlDown).Value
            myEndRow = Sheets(I).Range("B4").End(xlDown).Row
            myMatch = Application.Match(myBeg - 0.0001, .Range("B:B"))
            myMatch2 = Application.Match(myEnd, .Range("B:B"))
            If Not IsError(myMatch) Then
                If IsError(myMatch2) Then myMatch2 = LastB
                If myMatch <= myMatch2 Then
                .Range(.Cells(myMatch + 1, 1), .Cells(myMatch2, 1)).Select
                    .Range(.Cells(myMatch + 1, 1), .Cells(myMatch2, 1)).EntireRow.Delete
                    .Cells(myMatch + 1, 1).Resize(myEndRow - 4 + 1, 1).EntireRow.Insert
                    Sheets(I).Range(Sheets(I).Range("B4"), Sheets(I).Range("B4").End(xlDown)).EntireRow.Copy _
                        Destination:=.Cells(myMatch + 1, 1)
                    DelArr(I) = I
                    Sheets(I).Tab.Color = RGB(255, 0, 0)
                End If
            End If
        Next I
    End With
    J = I - 1
Next J
'Parte seconda
'Delete sheets:
Stop     '*** VEDI TESTO
For I = UBound(DelArr, 1) To LBound(DelArr, 1) Step -1
    If DelArr(I) = I Then
        Application.DisplayAlerts = False
        Sheets(I).Delete
        Application.DisplayAlerts = True
    End If
Next I
End Sub

Nella prima parte vengono scansionati i fogli e vengono sostituiti i dati iniziali con quelli provenienti dagli altri fogli con lo stesso E1; il foglio che raggruppa tutti i dati viene marcato col tab in colore Verde, quelli che hanno alimentato il foglio di destinazione vengono marcati di rosso.
Nella seconda fase i fogli marcati di rosso vengono eliminati; prima di questa fase pero' la macro si ferma (istruzione Stop) per consentire la verifica che il comportamento sia corretto e che i giusti fogli sono stati modificati e i giusti fogli sono stati marcati per essere cancellati.
Quando, dopo sufficienti prove, sarai certo del risultato potrai eliminare la riga Stop e far completare automaticamente il processo.

Ciao, fai sapere.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13903
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [VBA] Confronto date e unione fogli

Postdi bome » 09/09/14 22:49

Grazie! Ok appena posso lo provo a fondo e faccio sapere!
Microsoft Office 2010
bome
Utente Junior
 
Post: 18
Iscritto il: 04/08/14 18:24

Re: [VBA] Confronto date e unione fogli

Postdi bome » 12/09/14 10:04

Prima di tutto ti ringrazio infinitamente! La macro è perfetta! Ma facendo svariate prove con vari log sono incappato in una anomalia, ovvero un csv che parte da 356.7 gradi. E che quindi non diventa ne rosso ne verde viene ignorato e basta.

Essendo una circonferenza vuol dire semplicemente che l’operatore ha riportato troppo indietro la testa.
Quindi dovrei evitare questi valori anomali. Il range di valori accettati dovrebbe essere 0-180.
Nel worbook su dropbox ho caricato i csv con l’anomalia.
Microsoft Office 2010
bome
Utente Junior
 
Post: 18
Iscritto il: 04/08/14 18:24

Re: [VBA] Confronto date e unione fogli

Postdi Anthony47 » 12/09/14 14:45

Nella macro modifica
myBeg = Sheets(I).Range("B4").Value
in
myBeg = Application.WorksheetFunction.Min(Sheets(I).Range("B1:B50000").Value)

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13903
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [VBA] Confronto date e unione fogli

Postdi bome » 13/09/14 22:49

Anthony47 ha scritto:Nella macro modifica
myBeg = Sheets(I).Range("B4").Value
in
myBeg = Application.WorksheetFunction.Min(Sheets(I).Range("B1:B50000").Value)

Ciao



Scusa non mi sono spiegato bene... i valori anomali dovrebbe evitarli. In pratica non deve tenere conto dei valori superiori a 180.
Microsoft Office 2010
bome
Utente Junior
 
Post: 18
Iscritto il: 04/08/14 18:24

Re: [VBA] Confronto date e unione fogli

Postdi Anthony47 » 14/09/14 00:40

Scusa non mi sono spiegato bene... i valori anomali dovrebbe evitarli. In pratica non deve tenere conto dei valori superiori a 180
Invece con quella modifica cosa ottieni?
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13903
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [VBA] Confronto date e unione fogli

Postdi bome » 14/09/14 11:22

Anthony47 ha scritto:
Scusa non mi sono spiegato bene... i valori anomali dovrebbe evitarli. In pratica non deve tenere conto dei valori superiori a 180
Invece con quella modifica cosa ottieni?




Con la modifica prende anche i valori anomali e li piazza nel foglio "verde". Se serve ho messo in dropbox il foglio WorkbookOkmod con il risultato che ho avuto.
Microsoft Office 2010
bome
Utente Junior
 
Post: 18
Iscritto il: 04/08/14 18:24

Re: [VBA] Confronto date e unione fogli

Postdi Anthony47 » 15/09/14 01:59

Eh, evidentemente avevo fatto un test all' acqua di rose...
Questa parte e' stata cambiata (vedi commenti):
Codice: Seleziona tutto
            myMatch2 = Application.Match(myEnd, .Range("B:B"))
'la prossima e' stata aggiunta:
            mymatch3 = Application.Match(Round(myBeg - 0.000001, 2), Sheets(I).Range("B1:B50000"), 0)
            If Not IsError(myMatch) Then
                If IsError(myMatch2) Then myMatch2 = LastB
                If myMatch <= myMatch2 Then
                .Range(.Cells(myMatch + 1, 1), .Cells(myMatch2, 1)).Select
                    .Range(.Cells(myMatch + 1, 1), .Cells(myMatch2, 1)).EntireRow.Delete
'le prossime 2 sono state modificate:
                    .Cells(myMatch + 1, 1).Resize(myEndRow - mymatch3 + 1, 1).EntireRow.Insert
                    Sheets(I).Range(Sheets(I).Range("B1").Offset(mymatch3 - 1), Sheets(I).Range("B4").End(xlDown)).EntireRow.Copy _
                        Destination:=.Cells(myMatch + 1, 1)
                    DelArr(I) = I
                    Sheets(I).Tab.Color = RGB(255, 0, 0)
                End If
            End If
        Next I

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13903
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [VBA] Confronto date e unione fogli

Postdi bome » 16/09/14 22:21

L'ho provato per bene e sembra essere perfetto!! Per il primo problema ovvero il confronto delle date senza tener conto dell'ora non si può fare nulla?
Comunque grazie mille mi hai risolto un grande problema!
Microsoft Office 2010
bome
Utente Junior
 
Post: 18
Iscritto il: 04/08/14 18:24

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "[VBA] Confronto date e unione fogli":


Chi c’è in linea

Visitano il forum: patel, Zer0Kelvin e 2 ospiti