| | Post: 55 | Registrato il: 22/03/2010
| Città: MILANO | Età: 53 | Utente Junior | 2007-2010 | | OFFLINE | |
|
23/09/2020 14:13 | |
Gentilissimi, è da un po che non scrivo.
Ho un problema (anzi due) che magari per voi più esperti
potrebbe essere di facile soluzione.
Mi è stato consegnato un database e nella prima colonna
i numeri rappresentano una data, però non nel formato classico.
Ho necessità di convertirle nel formato classico (es. prima cella da 0112007 a 01/01/2007. Inoltre, come potete vedere dall'esempio, non sono indicati alcuni giorni (mancano) ed in quel caso c'è sempre la necessità
di recuperare il dato mancante per poi eseguire operazioni di interpolazione.
Mi scuso anticipatamente se non ho seguito qualcosa in linea con il regolamento del forum e sarei grato se qualcuno di voi può suggerire qualcosa che velocizzi il processo, su serie di parecchi dati(diversi anni) si può fare anche a mano ma con enorme dispendio di tempo.
CaBi |
|
| | Post: 835 | Registrato il: 24/06/2015
| Città: CATANIA | Età: 80 | Utente Senior | Excel2019 | | OFFLINE |
|
23/09/2020 15:30 | |
Ciao
Ritengo che la sequenza di date si possa fare solo con VBA. Questa macro esegue quanto richiesto (per l'eventuale interpolazione devi provvedere tu):
Option Explicit
Sub SequenzaData()
Dim dt, lt, mn As Integer, mx As Integer, ur As Long, a As Long, i As Long
ur = Cells(Rows.Count, 1).End(xlUp).Row
mn = Len(Cells(2, 1))
mx = Len(Cells(ur, 1))
dt = CDate(Right(Cells(2, 1), 4) & "/" & Left(Right(Cells(2, 1), 6), 2) & "/" & Left(Cells(2, 1), mn - 6))
lt = CDate(Right(Cells(ur, 1), 4) & "/" & Left(Right(Cells(ur, 1), 6), 2) & "/" & Left(Cells(ur, 1), mx - 6))
a = 1
For i = CDbl(dt) To CDbl(lt)
If dt > CDbl(lt) Then Stop: Exit For
a = a + 1
Cells(a, 5) = dt
dt = CDbl(dt) + 1
Next i
End Sub
Fai sapere. Ciao,
Mario |
| | Post: 58 | Registrato il: 22/03/2010
| Città: MILANO | Età: 53 | Utente Junior | 2007-2010 | | OFFLINE | |
|
23/09/2020 16:41 | |
Marius44, 23/09/2020 15:30:
Ciao
Ritengo che la sequenza di date si possa fare solo con VBA. Questa macro esegue quanto richiesto (per l'eventuale interpolazione devi provvedere tu):
Option Explicit
Sub SequenzaData()
Dim dt, lt, mn As Integer, mx As Integer, ur As Long, a As Long, i As Long
ur = Cells(Rows.Count, 1).End(xlUp).Row
mn = Len(Cells(2, 1))
mx = Len(Cells(ur, 1))
dt = CDate(Right(Cells(2, 1), 4) & "/" & Left(Right(Cells(2, 1), 6), 2) & "/" & Left(Cells(2, 1), mn - 6))
lt = CDate(Right(Cells(ur, 1), 4) & "/" & Left(Right(Cells(ur, 1), 6), 2) & "/" & Left(Cells(ur, 1), mx - 6))
a = 1
For i = CDbl(dt) To CDbl(lt)
If dt > CDbl(lt) Then Stop: Exit For
a = a + 1
Cells(a, 5) = dt
dt = CDbl(dt) + 1
Next i
End Sub
Fai sapere. Ciao,
Mario
Ciao, grazie per l'istruzione.
Ovviamente esegue e converte le date nel formato corretto ma
include anche due valori mancanti(nel nostro caso osservabili nel mio esempio), il 14 ed il 17 gennaio 2007.
Questo è il mio vero problema. Forse con un'ulteriore operazione, esempio vercverticale o altra si riesce ad affiancare al formato corretto, un vero/falso, oppure con i dati della seconda colonna, done nel 14 o 15 non deve apparire nulla. Poi le operazioni finali di interpolazione le eseguo con pacchetti su R statistics abbastanza afficienti.
CABi
|
| | Post: 836 | Registrato il: 24/06/2015
| Città: CATANIA | Età: 80 | Utente Senior | Excel2019 | | OFFLINE |
|
23/09/2020 17:48 | |
Ciao
Mi sono attenuto a quanto da te detto:
in quel caso c'è sempre la necessità
di recuperare il dato mancante
Se non vuoi recuperare le date mancanti basta non farle scrivere (ma deve calcolarle lo stesso e lasciare lo spazio vuoto).
Ciao,
Mario |
|
24/09/2020 15:27 | |
Un saluto a Marius44
Forse non ho capito quello che desideri fare, prova con questo VBA (NB valido solamente se i MESI sono composti da due caratteri) Sub Cerca()
Dim ur, x, r, rg As Object, Area As Range, DData As Date
ur = Range("D" & Rows.Count).End(xlUp).Row
Set Area = Range("D2:D" & ur)
ur = Range("A" & Rows.Count).End(xlUp).Row
For x = 2 To ur
If Len(Cells(x, 1)) = 8 Then
DData = Mid(Cells(x, 1), 1, 2) & "/" & Mid(Cells(x, 1), 3, 2) & "/" & Mid(Cells(x, 1), 5, 8)
Set rg = Area.Find(DData, LookIn:=xlValues, LookAt:=xlWhole)
If rg Is Nothing Then
Cells(x, 3) = "Non trovata"
Else
r = rg.Row
Cells(r, 5) = Cells(x, 2)
End If
Else
DData = Mid(Cells(x, 1), 1, 1) & "/" & Mid(Cells(x, 1), 2, 2) & "/" & Mid(Cells(x, 1), 4, 7)
Set rg = Area.Find(DData, LookIn:=xlValues, LookAt:=xlWhole)
If rg Is Nothing Then
Cells(x, 3) = "Non trovata"
Else
r = rg.Row
Cells(r, 5) = Cells(x, 2)
End If
End If
Next x
Set Area = Nothing
Set rg = Nothing
MsgBox "fatto"
End Sub |
| | Post: 59 | Registrato il: 22/03/2010
| Città: MILANO | Età: 53 | Utente Junior | 2007-2010 | | OFFLINE | |
|
28/09/2020 12:50 | |
ABCDEF@Excel, 24/09/2020 15:27:
Un saluto a Marius44
Forse non ho capito quello che desideri fare, prova con questo VBA (NB valido solamente se i MESI sono composti da due caratteri) Sub Cerca()
Dim ur, x, r, rg As Object, Area As Range, DData As Date
ur = Range("D" & Rows.Count).End(xlUp).Row
Set Area = Range("D2:D" & ur)
ur = Range("A" & Rows.Count).End(xlUp).Row
For x = 2 To ur
If Len(Cells(x, 1)) = 8 Then
DData = Mid(Cells(x, 1), 1, 2) & "/" & Mid(Cells(x, 1), 3, 2) & "/" & Mid(Cells(x, 1), 5, 8)
Set rg = Area.Find(DData, LookIn:=xlValues, LookAt:=xlWhole)
If rg Is Nothing Then
Cells(x, 3) = "Non trovata"
Else
r = rg.Row
Cells(r, 5) = Cells(x, 2)
End If
Else
DData = Mid(Cells(x, 1), 1, 1) & "/" & Mid(Cells(x, 1), 2, 2) & "/" & Mid(Cells(x, 1), 4, 7)
Set rg = Area.Find(DData, LookIn:=xlValues, LookAt:=xlWhole)
If rg Is Nothing Then
Cells(x, 3) = "Non trovata"
Else
r = rg.Row
Cells(r, 5) = Cells(x, 2)
End If
End If
Next x
Set Area = Nothing
Set rg = Nothing
MsgBox "fatto"
End Sub
Grazie, non ho potuto vedere prima il tuo ms, in serata faccio una prova.
CaBi
|
| | Post: 10 | Registrato il: 24/01/2019
| Città: SARONNO | Età: 62 | Utente Junior | 2013 | | OFFLINE | |
|
02/10/2020 13:08 | |
Anche se in ritardo, provo a dare un mio contributo sempre con l'assunto che il mese sia sempre presentato su due cifre.
Ho usato solo funzioni di excel senza uso di macro o VBA, cosa che potrebbe tornare utile.
La funzione usata è
=SE.ERRORE(DATA(DESTRA(A2;4);STRINGA.ESTRAI(A2;LUNGHEZZA(A2)-5;2);SE(LUNGHEZZA(A2)=8;SINISTRA(A2;2);SINISTRA(A2;1)));"") che non fa altro di comporre la data usando i tre parametri della funzione DATA(anno, mese, giorno) dove anno, mese e giorno sono i pezzi della stringa iniziale presente in colonna A dell'esempio. Nella regola usata, la data di partenza sta nella cella A2.
Il risultato è in colonna E.
Spero di aver ben interpretato la necessità iniziale. |
|
|