web-dev-qa-db-fra.com

VBA Convert String to Date

J'ai des données dans une feuille Excel au format suivant:

Code de l'articleDate de livraison
 5456987 24.01.2009 
 5456988 
 5456989 12.24.2009 
 5456990 24/12/2009 

J'ai stocké les valeurs de DeliveryDate dans un tableau. Je dois prendre une décision sur les bases de la date, puis imprimer le résultat dans une nouvelle feuille. Je dois donc convertir les valeurs en tableau:

Dim current as Date, highest as Date, result() as Date
For Each itemDate in DeliveryDateArray
    current = CDate(itemDate)
    if current > highest then
         highest = current
    end if
    ' some more operations an put dates into result array
Next itemDate
'After activating final sheet...
Range("A1").Resize(UBound(result), 1).Value = Application.Transpose(result)

Malheureusement, la fonction CDate () renvoie l'erreur:

Erreur d'exécution '13':

Incompatibilité de type

Existe-t-il une fonction dans VBA qui peut:

  • analyser la chaîne avec tout format de date et renvoyer un objet date avec lequel travailler.
  • retourne un objet date vide, si la chaîne est vide ou mal formée (pour comparaison dans la boucle).

Modifier:

Pour reproduire l'erreur, exécutez simplement myDate = CDate("24.01.2009")

6
vulcan raven

Essayez d'utiliser Replace pour voir si cela fonctionnera pour vous. Le problème tel que je le vois qui a été mentionné plusieurs fois ci-dessus est que la fonction CDate s'étouffe sur les règles. Vous pouvez utiliser replace pour les remplacer par des barres obliques. Pour répondre à votre question sur une fonction dans vba qui peut analyser n'importe quel format de date, il n'y en a pas, vous avez des options très limitées.

Dim current as Date, highest as Date, result() as Date 
For Each itemDate in DeliveryDateArray
    Dim tempDate As String
    itemDate = IIf(Trim(itemDate) = "", "0", itemDate) 'Added per OP's request.
    tempDate = Replace(itemDate, ".", "/")
    current = Format(CDate(tempDate),"dd/mm/yyyy")
    if current > highest then 
        highest = current 
    end if 
    ' some more operations an put dates into result array 
Next itemDate 
'After activating final sheet... 
Range("A1").Resize(UBound(result), 1).Value = Application.Transpose(result) 
12
Mark Hall

J'ai utilisé ce code:

ws.Range ("A: A"). FormulaR1C1 = "= DATEVALUE (RC [1])"

la colonne A sera mm/jj/aaaa

RC [1] est la colonne B, la chaîne TEXT, par exemple, 30/01/12, CECI IS NOT DATE TYPE

0

Il semblerait que l'erreur puisse apparaître sur la ligne de données vide, avez-vous essayé de vous assurer que itemDate n'est pas vide avant d'exécuter la fonction CDate ()? Je pense que cela pourrait être votre problème.

0
DROP TABLE users