web-dev-qa-db-fra.com

Excel VBA - Convertir le texte en date?

J'ai une colonne de dates (colonne A) stockée sous forme de texte au format aaaa-mm-jj que j'essaie de convertir en dates, afin que je puisse effectuer des recherches.

J'ai lu quelques sujets ici et essayé certaines des suggestions, mais je ne peux rien faire fonctionner. On utilisait:

Columns("A").Select
Selection.NumberFormat = "date"

Cela a changé le format des cellules à ce jour mais n'a pas réellement changé le format de la valeur qui était toujours stockée sous forme de texte.

Si j'ai bien compris, je dois utiliser CDate () pour changer le format de la valeur de text en date. J'ai essayé quelque chose comme ça:

Dim c As Range
For Each c In ActiveSheet.UsedRange.columns("A").Cells
    c.Value = CDate(c.Value)
Next c

Ce qui me donne une erreur de correspondance de type. Je me demandais si c'était parce que j'essayais de sauvegarder les valeurs de date dans une cellule non formatée, alors j'ai essayé de la combiner avec le .NumberFormat = "date" ci-dessus, qui ne fonctionnait pas non plus.

Toute suggestion serait appréciée.

18
user1300244

Vous pouvez convertir rapidement une colonne de texte ressemblant à des dates en dates réelles avec l'équivalent VBA de la commande Données ► Texte-à-colonnes de la feuille de calcul.

With ActiveSheet.UsedRange.Columns("A").Cells
    .TextToColumns Destination:=.Cells(1), DataType:=xlFixedWidth, FieldInfo:=Array(0, xlYMDFormat)
    .NumberFormat = "yyyy-mm-dd"   'change to any date-based number format you prefer the cells to display
End With

Les opérations en bloc sont généralement beaucoup plus rapides que la boucle dans les cellules et la méthode Range.TextToColumns de VBA est très rapide. Il vous permet également de définir librement un masque de conversion MDY ou DMY ou YMD qui affecte de nombreuses importations de texte dont le format de date ne correspond pas aux paramètres régionaux du système. Voir Propriété TextFileColumnDataTypes pour une liste complète des formats de date disponibles.

Mise en garde: faites attention lors de l'importation de texte que certaines des dates n'ont pas déjà été converties. Une date textuelle avec des entiers de mois et de jour ambigus peut déjà avoir été mal convertie; par exemple. 07/11/2015 peut avoir été interprété comme 07-Nov-2015 ou 11-Jul-2015 en fonction des paramètres régionaux du système. Dans ce cas, abandonnez l'importation et réintégrez le texte à l'aide de Données ► Obtenir des données externes ► De texte et spécifiez le masque de conversion de date correct dans l'assistant d'importation de texte. Dans VBA, utilisez la méthode Workbooks.OpenText et spécifiez le xlColumnDataType.

25
user4039065

Vous pouvez utiliser DateValue pour convertir votre chaîne en une date dans cette instance.

Dim c As Range
For Each c In ActiveSheet.UsedRange.columns("A").Cells
    c.Value = DateValue(c.Value)
Next c

Il peut convertir la chaîne de formatage yyyy-mm-dd directement en une valeur de date Excel native.

19
Sam

Outre d’autres options, je confirme que l’utilisation de

c.Value = CDate(c.Value)

fonctionne (juste testé avec la description de votre cas, avec Excel 2010). En ce qui concerne les raisons pour lesquelles vous obtenez une erreur d’écart type, vous pouvez vérifier (par exemple) this .

Cela pourrait être un problème de paramètres régionaux.

11
sancho.s

Peut-être:

Sub dateCNV()
    Dim N As Long, r As Range, s As String
    N = Cells(Rows.Count, "A").End(xlUp).Row
    For i = 1 To N
        Set r = Cells(i, "A")
        s = r.Text
        r.Clear
        r.Value = DateSerial(Left(s, 4), Mid(s, 6, 2), Right(s, 2))
    Next i
End Sub

Cela suppose que la colonneAcontient des valeurs de texte telles que 2013-12-25 sans cellule d'en-tête.

6
Gary's Student

Ce code fonctionne pour moi

Dim N As Long, r As Range
N = Cells(Rows.Count, "B").End(xlUp).Row
For i = 1 To N
    Set r = Cells(i, "B")
    r.Value = CDate(r.Value)
Next i

Essayez-le en changeant les colonnes en fonction de votre feuille

3

Explosion du passé, mais je pense avoir trouvé une réponse facile à cette question. Ce qui suit a fonctionné pour moi. Je pense que cela revient à sélectionner la cellule qui frappe F2 puis Entrée, ce qui permet à Excel de reconnaître le texte comme une date.

Columns("A").Select
Selection.Value = Selection.Value
1
Christian Stanyer

Pour l’opérateur….… J’ai également eu une erreur d’écart type lors de la première utilisation de votre sous-routine. Dans mon cas, c'était dû à des données non datées dans la première cellule (c'est-à-dire un en-tête) . Lorsque j'ai changé le contenu de la cellule d'en-tête en txt de style date à des fins de test, tout s'est bien passé ...

J'espère que cela aide aussi.

1
Eric

Pour DD -MM- YYYY, voici une solution de contournement simple pour gérer les chaînes et les dates:

insérez la date dans la chaîne via DD -MMM- AAAA par exemple 01-11-2017 -> 01-Nov-2017

Vous pouvez utiliser le format (date, "jj - mmm - aaaa") pour entrer des dates dans une chaîne de la feuille de calcul.

Plus tard, lorsque vous le sortez d'une chaîne, cela ne confondra pas les jours et les mois.

0
Gilco

J'ai eu un problème très similaire plus tôt. Malheureusement, j'ai regardé ce fil et je n'ai pas trouvé de réponse qui me satisfasse. J'espère que cela aidera les autres. 

En utilisant VBA.DateSerial(year,month,day), vous pouvez surmonter le biais intrinsèque d'Excel pour le format de date américain. Cela signifie également que vous avez un contrôle total sur les données, ce que je préfère personnellement:

function convDate(str as string) as Date
  Dim day, month, year as integer
  year  = int(mid(str,1,4))
  month = int(mid(str,6,2))
  day   = int(mid(str,9,2))
  convDate = VBA.DateSerial(year,month,day)
end function
0
Sancarn

Je me suis débarrassé de l'inadéquation des types en suivant le code:

Sub ConvertToDate()

Dim r As Range
Dim setdate As Range

'in my case I have a header and no blank cells in used range,
'starting from 2nd row, 1st column
Set setdate = Range(Cells(2, 1), Cells(2, 1).End(xlDown)) 

    With setdate
        .NumberFormat = "dd.mm.yyyy" 'I have the data in format "dd.mm.yy"
        .Value = .Value
    End With

    For Each r In setdate
        r.Value = CDate(r.Value)
    Next r

End Sub

Mais dans mon cas particulier, j'ai les données au format "jj.mm.yy"

0
Vitaliy Prushak