Convertir des dates en VBA

Bonjour,

J'ai un tableau contenant des dates provenant d'un fichier Excel externe et elles arrivent en format texte

J'ai créée une macro avec un FOR pour boucler dans les nouvelles données récupérées; mais l'exécution est lente dans mon fichier.

Y-a-t-il une façon rapide avec un tableau de convertir les données récupérées en format date?

J'inclus un fichier avec la macro contenant le FOR que j'utilise; l'exécution est rapide avec le FOR dans le fichier fourni; mais dans mon fichier c'est lent.

Merci.

Salut,

Tes données de la colonne A sont déjà des dates (tu peux effectuer des calculs avec elles).

Je ne sais pas pourquoi ça mouline chez toi - as-tu beaucoup plus de données ? - mais essaie déjà de placer l'inscruction ci-dessous avant ta boucle For/Next :

Application.ScreenUpdating = False

Si ce n'est pas cela, fournis-nous le fichier qui est lent.

Amicalement.

Bonjour,

Je ne peux pas faire de calcul avec la date en colonne A puisqu'elle est comme du texte.

Dans le fichier fourni, j'ai mis le format en format Date mais si l'on regarde les données, elles sont à gauche dans la colonne A et elles devraient être à droite pour un format Date. Si tu te positionne sur une cellule de date de la colonne A et que tu cliques dessus tu seras en mode édition et si tu appuies sur la touche ENTER la date devient et s'affiche en format Date et la date va vers la droite.

Le fichier contient plusieurs onglets et est gros je ne peux pas le transférer.

Alors comment avec un tableau et VBA ramener la date en colonne A à droite rapidement et s'afficher comme une date.

La macro suivante s'exécute avant de récupérer et avec le FOR c'est lent

Sub Arret_Calcul()

With Application

 .EnableEvents = False

 .Calculation = xlCalculationManual

 .ScreenUpdating = False

 End With

 End Sub

Merci.

Bonjour,
Pour le principe. A adapter.
Cdlt.

Option Explicit

Sub ConvertDates()
Dim tbl As ListObject
    Set tbl = ActiveSheet.ListObjects(1)
    tbl.ListColumns(1).DataBodyRange.TextToColumns _
            Destination:=tbl.ListColumns(1).DataBodyRange.Cells(1), _
            DataType:=xlDelimited, _
            FieldInfo:=Array(1, 5)
    tbl.ListColumns(1).DataBodyRange.NumberFormat = "yyyy-mm-dd"
End Sub

Bonjour et merci pour votre réponse.

J'aimerais savoir comment fonctionne votre macro commande.

Destination:=tbl.ListColumns(1).DataBodyRange.Cells(1)

Est-ce que cela veux dire que modification de format de date est faite sur la colonne A à partir de la ligne 1 donc je peux modifier la commande comme ceci : DataBodyRange.Cells(5) ?

FieldInfo:=Array(1, 5) Qu'est ce que cela signifie ?

Merci c'est super rapide.

Re,

tbl.ListColumns(1).DataBodyRange.Cells(1)
C'est la premère cellule de valeur de de la colonne 1 du tableau (hors en-tête).

Fais un test avec Cells(5) ou Cells(1,5), mais tu travailles avec un tableau structuré !

FieldInfo:=Array(1, 5)
Dans l'éditeur VBE, fais et un double-clic sur TextToColumns, puis F1.
Regarde l'aide sur la méthode et lus particulièrement le paramètre FieldInfo et l'énumération XLColumnDataType.

A te relire si tu ne comprends pas tout.

Cdlt.

Bonjour et merci pour votre réponse,

J'ajoute des nouvelles données à chaque mois donc est-ce je tiens compte des données déjà converties (mai-juin) et je mets en format Date seulement juillet ou je mets en format Date à partir de le ligne 2 et suivantes?

FieldInfo:=Array(1, 5) Qu'est ce que cela signifie ? Est-ce par rapport à ligne et colonne?

Si j'ai à trier un tableau sur une colonne spécifique disons la 3ième colonne avec un tri ascendant qu'elle serait la façon rapide de le faire avec un fichier contenant un tableau et qui contient beaucoup de lignes et de colonnes?

Merci.

Re,

FieldInfo:=Array(1, 5)
C'est pour YMD (année, mois et jour) comme indiqué dans l'aide.

Si tu ajoutes de nouvelles données, exécute de nouveau la procédure.

Dans le fichier joint, j'ai ajouté un tri (à adapter).

Cdlt.

Sub ConvertDates()
Dim tbl As ListObject
    Set tbl = ActiveSheet.ListObjects(1)
    tbl.ListColumns(1).DataBodyRange.TextToColumns _
            Destination:=tbl.ListColumns(1).DataBodyRange.Cells(1), _
            DataType:=xlDelimited, _
            FieldInfo:=Array(1, 5)
    tbl.ListColumns(1).DataBodyRange.NumberFormat = "yyyy-mm-dd"
    With tbl
        .Sort.SortFields.Add .ListColumns(3).DataBodyRange, xlSortOnValues, xlAscending
        .Sort.Header = xlYes
        .Sort.Apply
        .Sort.SortFields.Clear
    End With
End Sub

Merci beaucoup pour votre réponse.

J'ai pris le temps de regarder plus attentivement pour le FieldInfo:=Array(1, 5)

le 1 signifie le numéro de la colonne et le 5 est l'une des constantes XlColumnDateType indiquant la manière dont la colonne doit être analysée. 5 = AMD.

Lorsque j'écris ActiveSheet.ListObjects(1), est-ce que je pourrais écrire également ActiveSheet.ListObjects("TableauDate") qui est le nom du tableau ?

J'ai vu également dans les exemples qu'il donnait pour le tri la suivante :

ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1").Sort.SortFields.Add _
 Key:=Range("Table1[[#All],[Column1]]"), _
 SortOn:=xlSortOnValues, _
 Order:=xlAscending, _
 DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1").Sort
 .Header = xlYes
 .MatchCase = False
 .Orientation = xlTopToBottom
 .SortMethod = xlPinYin
 .Apply
End With

Le portion de code :

Key:=Range("Table1[[#All],[Column1]]")

Que signifie le :

[#All]

Merci beaucoup pour votre aide.

Bonjour,
Listobjects(1) suppose que ta feuille comporte un tableau unique dans ta feuille de calcul.
Tu peux évidemment nommer le tableau [Listobjects("nomTableau").
Ta procédure est issue de l'enregistreur de macros et n'est pas optimisée.
Range("Table1[[#All],[Column1]]") correspond à la plage de Column1 incluant l'en-tête et la ligne de total (si affichée).
All en anglais se traduit par Tout en français.
Cdlt.

Bonjour…

Puisque tu cherches à comprendre, voici autre proposition (écriture allégée).

Le tableau (ListObjects) étant nommé TD, le travail n’impliquant que la colonne de titre Date de celui-ci :

Sub ConvertDates()
    [TD[Date]].TextToColumns [TD[Date]], 1, Array(1, 5)
    [TD[Date]].NumberFormat = "yyyy-mm-dd"
End Sub

Dans ce cas les noms des variables ne servent qu’à s’y retrouver (Enregistreur de macro pour débutant) avec

- la variable Destination :=… est soit le numéro de la colonne 1 soit son titre Date (nommée automatiquement [TD[Date]])

- la variable DataType:=… prend la valeur 1

- la variable FieldInfo:=… prend la valeur Array(1, 5)

Pour trier selon une colonne, on peut utiliser soit son titre soit son numéro.

par son titre (Date par exemple)

[TD].Sort [TD[Date]], Header:=1

[TD].Sort [TD[Date]], 2; Header:=1

par son N° (n)

- pour un tri décroissant : [TD].Sort [TD].Columns(n), 2 ,Header:=1

- pour un tri croissant: [TD].Sort [TD].Columns(n), Header:=1 pris à l’initialisation de base (sinon , 1)

par son titre (Date par exemple)

La variable Header prend la valeur 1 (TRUE) pour ne pas prendre le titre sinon 0 (FALSE à l’initilasation de base)

Avec ce type de tableau, pour éviter la zizanie, ne prendre que 1 !

Bonjour,
Une autre proposition VBA.
Cdlt.

Sub ConvertDates2()
Dim TD As Range
    Set TD = Range("tableauDate")
    If Not TD.ListObject.DataBodyRange Is Nothing Then
        With TD.ListObject
            .ListColumns("Date").DataBodyRange.TextToColumns _
                    Destination:=TD(0, 1), _
                    DataType:=xlDelimited, _
                    FieldInfo:=Array(1, 5)
            With .Sort
                .SortFields.Clear
                .SortFields.Add Key:=TD(0, 3)
                .Header = xlYes
                .Apply
            End With
        End With
    End If
End Sub

Formidable, merci beaucoup pour tous ces explications et bonne journée.

Rechercher des sujets similaires à "convertir dates vba"