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.
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.
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.
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.
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.
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
à 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.
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
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-->
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.