La consultazione del forum è libera per tutti.
Per poter porre un quesito è invece necessario essere un utente registrato (clicca qui se non lo sei).
Tutti gli utenti che richiedono un supporto, come da REGOLAMENTO, sono caldamente invitati ad allegare un file di esempio con l'indicazione di quello che si desidera ottenere.
Buongiorno a tutti,
Mi chiamo Alessandro e sono nuovo del forum.
Sto scrivendo una macro che grossomodo vorrei facesse questo. Analizzando una colonna specifica (es. K) nella quale sono contenuti dei valori a 5 o 6 cifre che nel file di origine erano delle date, vorrei sostanzialmente trasformarli nuovamente in date anche dentro excel. Il problema è che quando importo i dati nel foglio excel da questo programma, le date mi vengono scritte in formato numerico senza "/", quindi ad esempio la data 12 Maggio 2024 mi viene scritta 120524 e così via...
La mia macro sostanzialmente dovrebbe fare questo:
1- Individuare tutte le celle della colonna che contengono numeri di 5 o 6 cifre (perché se il giorno è inferiore al 10 del mese, la data mi viene scritta senza lo zero davanti, quindi ad esempio 70524 per indicare il 7 Maggio 2024)
2- Aggiungere il "20" per avere l'anno scritto per intero
3- Aggiungere i simboli "/" dove servono per creare le date
In definitiva, prendendo i due esempi di prima (7 Maggio 2024 e 12 Maggio 2024) dovrei trovarmeli sotto forma di 7/05/2024 e 12/05/2024.
Il problema nasce solo con le date che hanno il giorno uguale o inferiore a 12: in questo caso la data che mi viene fuori inverte giorno e mese (es. se avevo inizialmente 70524, anziché uscire 07/05/2024 mi esce 05/07/2024). Mentre le date con giorno 13 del mese o superiore sono convertite perfettamente.
Dove sto sbagliando?
Allego codice:
Sub ConvertiInData() Dim ws As Worksheet Dim rng As Range Dim cell As Range Dim lastRow As Long Dim valore As String Dim valore1 As String Dim valorefinale As String ' Imposta il foglio di lavoro su cui lavorare Set ws = ThisWorkbook.Sheets("Foglio1") ' Cambia "Foglio1" con il nome effettivo del foglio ' Determina l'ultima riga della colonna K con dati lastRow = ws.Cells(ws.Rows.Count, "K").End(xlUp).Row ' Imposta il range su cui lavorare (dalla cella K1 all'ultima riga con dati) Set rng = ws.Range("K1:K" & lastRow) ' Cicla attraverso ogni cella nel range For Each cell In rng ' Verifica se la cella non è vuota e contiene un numero If Not IsEmpty(cell.Value) And IsNumeric(cell.Value) Then ' Ottiene il valore della cella valore = CStr(cell.Value) ' Aggiunge il numero "20" solo se il numero ha meno di 7 cifre If Len(valore) < 7 Then valore1 = Left(valore, Len(valore) - 2) & "20" & Right(valore, 2) End If ' Assegna il valore modificato alla cella cell.Value = valore1 'Aggiunge il simbolo "/" in modo da creare un formato data del tipo G/MM/AAAA oppure GG/MM/AAAA If Len(valore1) = 7 Then valorefinale = Left(valore1, 1) & "/" & Mid(valore1, 2, 2) & "/" & Right(valore1, 4) End If If Len(valore1) = 8 Then valorefinale = Left(valore1, 2) & "/" & Mid(valore1, 3, 2) & "/" & Right(valore1, 4) End If ' Assegna il valore modificato alla cella cell.Value = valorefinale End If Next cell End Sub
Grazie a tutti in anticipo
Alessandro
ciao
sei sicuro che solo il giorno venga scritto senza lo 0 davanti?
il mese è sempre scritto con doppia cifra?
secondo me basta
Sub ConvertiInData() Dim ws As Worksheet Dim rng As Range Dim cell As Range Dim lastRow As Long ' Imposta il foglio di lavoro su cui lavorare Set ws = ThisWorkbook.Sheets("Foglio1") ' Cambia "Foglio1" con il nome effettivo del foglio ' Determina l'ultima riga della colonna K con dati lastRow = ws.Cells(ws.Rows.Count, "K").End(xlUp).Row ' Imposta il range su cui lavorare (dalla cella K1 all'ultima riga con dati) Set rng = ws.Range("K1:K" & lastRow) ' Cicla attraverso ogni cella nel range For Each cell In rng ' Verifica se la cella non è vuota e contiene un numero If Not IsEmpty(cell.Value) And IsNumeric(cell.Value) Then If Len(cell) = 5 Then cell = Mid(cell.Value, 2, 2) & "/" & Left(cell, 1) & "/" & Right(cell, 2) ElseIf Len(cell) > 5 Then cell = Mid(cell.Value, 3, 2) & "/" & Left(cell, 2) & "/" & Right(cell, 2) End If End If Next cell End Sub
nota che ho invertito i mesi con i giorni
exel non ragiona in italiano😀
@gianfranco55 Si perché il giorno costituisce la prima cifra, ed excel quando si tratta di un numero non scrive mai lo zero davanti (es. se la data è 070524 excel lo trasforma subito in 70524, mentre invece se fosse per esempio 120524 non ci sarebbero problemi perché lo zero si trova in mezzo al numero)
Di solito con excel se vuoi mantenere lo zero davanti devi mettere l'apostrofo, ma poi il tutto viene formattato come testo...
ciao
prova la macro sopra
ciao a tutti,
ed un saluto particolare a Gianfranco 😉
meglio che la colonna K abbia formato "Generale".
Posto le due macro riviste, in entrambe mancava solo una riga di codice e per quella
di Gianfranco è veramente una "pignoleria" 🤣
quella di Gianfranco, sotto quella di Alessandro
Buona serata
Frank
Sub converti_data() Dim ws As Worksheet Dim rng As Range Dim cell As Range Dim lastRow As Long ' Imposta il foglio di lavoro su cui lavorare Set ws = ThisWorkbook.Sheets("Foglio1") ' Cambia "Foglio1" con il nome effettivo del foglio ' Determina l'ultima riga della colonna K con dati lastRow = ws.Cells(ws.Rows.Count, "K").End(xlUp).Row ' Imposta il range su cui lavorare (dalla cella K1 all'ultima riga con dati) Set rng = ws.Range("K1:K" & lastRow) ' Cicla attraverso ogni cella nel range For Each cell In rng ' Verifica se la cella non è vuota e contiene un numero If Not IsEmpty(cell.Value) And IsNumeric(cell.Value) Then If Len(cell) = 5 Then cell = Mid(cell.Value, 2, 2) & "/" & Left(cell, 1) & "/" & Right(cell, 2) ElseIf Len(cell) > 5 Then cell = Mid(cell.Value, 3, 2) & "/" & Left(cell, 2) & "/" & Right(cell, 2) End If End If Next cell '====================================================================================== Columns("k").AutoFit 'riga aggiunta per aggiornare la larghezza della colonna se serve '====================================================================================== End Sub Sub ConvertiInData() Dim ws As Worksheet Dim rng As Range Dim cell As Range Dim lastRow As Long Dim valore As String Dim valore1 As String Dim valorefinale As String ' Imposta il foglio di lavoro su cui lavorare Set ws = ThisWorkbook.Sheets("Foglio1") ' Cambia "Foglio1" con il nome effettivo del foglio ' Determina l'ultima riga della colonna K con dati lastRow = ws.Cells(ws.Rows.Count, "K").End(xlUp).Row ' Imposta il range su cui lavorare (dalla cella K1 all'ultima riga con dati) Set rng = ws.Range("K1:K" & lastRow) ' Cicla attraverso ogni cella nel range For Each cell In rng ' Verifica se la cella non è vuota e contiene un numero If Not IsEmpty(cell.Value) And IsNumeric(cell.Value) Then ' Ottiene il valore della cella valore = CStr(cell.Value) ' Aggiunge il numero "20" solo se il numero ha meno di 7 cifre If Len(valore) < 7 Then valore1 = Left(valore, Len(valore) - 2) & "20" & Right(valore, 2) End If ' Assegna il valore modificato alla cella cell.Value = valore1 'Aggiunge il simbolo "/" in modo da creare un formato data del tipo G/MM/AAAA oppure GG/MM/AAAA If Len(valore1) = 7 Then valorefinale = Left(valore1, 1) & "/" & Mid(valore1, 2, 2) & "/" & Right(valore1, 4) End If If Len(valore1) = 8 Then valorefinale = Left(valore1, 2) & "/" & Mid(valore1, 3, 2) & "/" & Right(valore1, 4) End If ' Assegna il valore modificato alla cella cell.Value = valorefinale '=================================================================================== cell.NumberFormat = "mm/dd/yyyy" 'riga aggiunta per formattare come data '=================================================================================== End If Next cell End Sub
Vi ringrazio molto per l'aiuto!
ciao
se hai risolto gentilmente chiudi la discussione
grazie