web-dev-qa-db-fra.com

excelle vba string à ce jour

Windows 10 Pro, paramètres régionaux en anglais britannique. Sous Excel VBA, la chaîne "02/05/2017 16:30" Signifie "au Royaume-Uni" le 02 mai 2017 16: 30 "

Mais VBA convertit cela au format américain d'une certaine manière et dans la cellule met "05/02/2017 16:30"

Le code VBA est comme ça

Dim sField As String
sField = "02/05/2017 16:30"
ws.Cells(1,1) = sField

Je peux utiliser CDate pour contourner cela, mais cela nécessite un code supplémentaire pour déterminer quelles cellules sont des dates et lesquelles ne le sont pas, alors que la conversion implicite fonctionne pour tous les types.

5
user40966

Utilisez plutôt une variable Date et indiquez toujours votre date dans MDY dans VBA. 

Dim sField As Date
sField = #05/02/2017 16:30#
ws.Cells(1,1) = sField

Si je comprends bien, vous devez toujours travailler à la «manière américaine» avec les dates MDY. Il ne suit PAS les paramètres régionaux. Ce qui est bien, car cela permet d’exécuter le même code sur des environnements hétérogènes. 

4
Patrick Honorez

Voici une solution de contournement dans le code VBA:

Sub Main()        
    Dim myInput     As String
    Dim splitMe     As Variant
    Dim outputDate  As Date

    myInput = "02/05/2017 16:30"
    splitMe = Split(myInput, "/")        
    outputDate = DateSerial(Left(splitMe(2), 4), splitMe(1), splitMe(0))        
    Debug.Print Format(outputDate, "DD-MMM-YY")
    Debug.Print Format(outputDate, "DD-MM-YYYY")           
End Sub

Il prend la date sous forme de chaîne et le divise en /. Ensuite, il prend l’année, le mois et le jour et il construit une nouvelle date avec l’aide de DateSerial(). DateSerial MSDN .

Dans des cas comme celui-ci, assurez-vous que vous transmettez la date correcte à Excel et que vous pouvez changer le format par quelque chose d'aussi simple que ceci:

Range("A1").NumberFormat = "m/d/yyyy"

Pour vous assurer que vous passez la date correcte, essayez simplement Month(YourDate) sur la date ou Day(YourDate).

2
Vityata

J'utilise plutôt les fonctions VBA intégrées DateSerial (année, mois, jour) et TimeSerial (heure, minute, seconde). 

Dim myDateTime as date
mydateTime = DateSerial(2017, 5, 2) + TimeSerial(16, 30, 0)
ws.Cells(1,1) = myDateTime

Vous pouvez ensuite définir le formatage des chiffres sur la cellule Excel à votre guise.

Je suppose que c'est plus rapide car il n'est pas nécessaire de traduire une chaîne à l'avance. Plus important encore pour moi en tant que programmeur, les paramètres sont explicites. Je n'ai pas à m'inquiéter de différents paramètres régionaux.

1
cbasah

J'ai résolu un problème connexe. Mon classeur est destiné à être utilisé uniquement au Royaume-Uni. Il contient une feuille permettant de saisir les détails de l’argent recueilli à divers endroits. L'utilisateur dispose de deux champs à cellule unique pour identifier chaque site. généralement un lieu et une date, mais parfois le champ "date" contient à la place un nom de lieu étendu. Dates devrait être entré jj/mm/aa, mais presque tout ce qui est reconnaissable est accepté sauf mm/jj/aa. Les détails sont stockés en mémoire, puis copiés ultérieurement dans des feuilles de calcul formatées pour impression. J'ai vérifié le stockage en mémoire. Mais après quelques mois d'utilisation du classeur, j'ai constaté que si l'utilisateur saisissait une date valide dans une cellule au format jj/mm/[aa] aa (par exemple le 05/11/17), et son interprétation comme suit: mm/jj/[aa] aa indique également une date valide, puis la date est imprimée de manière obscure sous la forme 11 mars, au lieu de 05 nov.

Quelques extraits de code:

'Data structure:
Public Type BkItem             'An item of income, for banking.
    ItemName As String         'The first field, just a text name.
    ItemDate As Date           'The second field, interpreted as a date.
    ItemDateNumber As Long     'The date as internally stored as an integer.
    ItemDateString As String   'Re-formatted string, e.g. "05-Nov-17".
'   ...
End Type    'BkItem.

'Input validation:
BankData = Range(.Cells(BankFirstRow, BankFirstCol), _
                 .Cells(BankLastItemLastRow, BankLastCol))

With BankItem(BankTotalItems)
    .ItemName = IName
    .ItemDateString = BankData(<row>, <col>)
    .ItemDateNumber = DateToLong(.ItemDateString)
End With

'Utility routine. "Paper" is a 2-dimensional array of all the data to be printed
'on one or more pages; "Dest" is a global range.:

Sub OutputDataToSheet(ByVal Size As Long, ByRef CurrentSheet As String, _
                      ByRef Paper() As Variant)
    Worksheets(CurrentSheet).Activate
    Set Dest = Worksheets(CurrentSheet).Range((Cells(1, 1)), _
                                              (Cells(Size, LastCol)))
    Dest.Value = Paper 'Copy data to final sheet for printing.                                         
End Sub    'OutputDataToSheet.

'As we build the array "Paper", it helps to format those cells on the final
'printout worksheet which are going to contain dates.

.Range(Cells(CurRow, L15c01), Cells(CurRow, L15c01)).NumberFormat = "dd-Mmm-yyyy"
'For the item date.
.Range(Cells(CurRow, L15c01), Cells(CurRow, L15c01)).HorizontalAlignment = xlCenter

If IsDate(BankItem(item).ItemDateString) Then
    Paper(<row>, <col>) = BankItem(item).ItemDateNumber
    'Date as a number, so OutputDataToSheet preserves UK date format.
Else
    Paper(<row>, <col>) = BankItem(item).ItemDateString
    'Extension of name.
End If  'IsDate(.ItemDateString).
0
OldColdDreamer