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

Problema formato data

Ultimo Aggiornamento: 02/10/2020 13:08
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

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

Re:
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.
Vota:
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
Problema su formato data (4 messaggi, agg.: 23/09/2020 15:01)
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 16:36. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com