Excel VBA - Convertir du Texte en Date?

j'ai une colonne de dates (colonne A) stockée sous forme de texte dans le format AAAA-mm-JJ que j'essaie de convertir en dates, finalement afin que je puisse faire des recherches contre eux.

j'ai lu quelques sujets ici et essayé certaines des suggestions, mais je ne peux rien obtenir à travailler. A été en utilisant:

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 encore stockée sous forme de texte.

Ma compréhension est que J'ai besoin d'utiliser CDate() pour changer le format de la valeur de texte à date. J'ai essayé quelque chose comme ceci:

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 décalage de type. Je me suis demandé si c'était parce que j'essayais de sauvegarder les valeurs de date de nouveau dans une cellule non-date formatée alors j'ai essayé de le combiner avec le .NumberFormat = "date" ci-dessus, qui ne fonctionne pas non plus.

Toutes les suggestions seraient appréciées.

17
demandé sur user1300244 2013-12-04 16:20:49

9 réponses

Vous pouvez rapidement convertir une colonne de texte qui ressemble aux dates en dates réelles avec l'équivalent VBA de la commande données ► Text-to-Columns de la feuille de travail.

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 vrac sont généralement beaucoup plus rapides que la boucle à travers les cellules et les VBA portée.Texttocumns method c'est très rapide. Il vous permet également la liberté de définir un masque de conversion MDY vs. DMY ou YMD qui sévit de nombreuses importations de texte où le format de date ne correspond pas à la région du système paramètre. Voir Textfilecolumndatypes propriété pour une liste complète des formats de date disponibles.

avertissement: soyez prudent lors de l'importation de texte qui les dates n'ont pas été converties. Une date textuelle avec des nombres entiers Ambigus par mois et par jour peut déjà avoir été convertie à tort; par exemple 07/11/2015 peut avoir été interprété comme 07-Nov-2015 ou 11-Jul-2015 selon les paramètres régionaux du système. Dans ce cas, abandonner l'importation et ramener le texte avec les données ► Obtenir des données externes ► à partir du texte et spécifier le masque de conversion de date correcte dans L'Assistant D'importation de texte. En VBA, utilisez le Cahiers d'exercices.Méthode OpenText et spécifiez xlcolumndatype.

25
répondu Jeeped 2015-06-03 02:11:43

Vous pouvez utiliser DateValue pour convertir votre chaîne de caractères en 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 yyyy-mm-dd formater la chaîne directement dans une valeur de date native Excel.

17
répondu Sam 2013-12-04 12:48:22

en plus des autres options, je confirme qu'en utilisant

c.Value = CDate(c.Value)

fonctionne (testé avec la description de votre cas, avec Excel 2010). En ce qui concerne les raisons pour lesquelles vous obtenez une erreur de décalage de type, vous pouvez vérifier (e.g.) .

Il pourrait être un jeu de paramètres régionaux question.

10
répondu sancho.s 2017-05-23 11:46:51

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 colonne contient des valeurs de texte comme 2013-12-25 sans cellule d'en-tête.

5
répondu Gary's Student 2013-12-04 12:31:40

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

Essayer de changer les colonnes en fonction de votre feuille

3
répondu Jose Luis Martin Cara 2015-10-28 15:47:02

à L'OP... J'ai aussi eu une erreur d'inadéquation de type la première fois que j'ai essayé d'exécuter votre sous-programme. Dans mon cas, il a été causé par des données non-date-like dans la première cellule (c.-à-d. un en-tête). Quand j'ai changé le contenu de la cellule d'en-tête en date-style txt pour le test, il a fonctionné très bien...

J'espère que cela aidera aussi.

1
répondu Eric 2015-02-20 18:10:50

Le Souffle du passé mais je pense que j'ai trouvé une réponse facile à cela. La suite travaillé pour moi. Je pense que c'est l'équivalent de sélectionner la cellule frappant F2 et ensuite frapper enter, ce qui fait Excel reconnaître le texte comme une date.

Columns("A").Select
Selection.Value = Selection.Value
1
répondu Christian Stanyer 2018-08-16 13:02:23

je me suis débarrassé du décalage de type par le code suivant:

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 dans le format "dd.mmm.Oui!2-->

0
répondu Vitaliy Prushak 2017-06-01 08:36:07

Pour le DD- MM

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

U peut utiliser le FORMAT (date, "dd - mmm - AAAA") pour entrer les dates dans une chaîne à partir de la feuille de calcul.

plus Tard, lors de la sortie à partir d'une chaîne de caractères, il ne confondra pas les jours et les mois.

0
répondu Gilco 2017-09-05 00:37:59