2017-12-18 26 views
5

Windows 10 Pro、英国英語への地域設定。 Excel VBAの文字列が「02/05/2017 16:30」 英国では「02 May 2017 16:30」を意味します現在までにvba文字列を変換します

しかし、VBAではこれが何らかの形でセル内で使用されていますVBAコードは、私はこれを回避するためにCDate関数を使用することができ、このよう

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

ですが、CDate関数が、それが日付である細胞を決定するために余分なコードを必要とする「2017年5月2日16時30」

を置き、暗黙の変換はすべてのタイプで有効です。

+0

あなたは多くの選択肢がありません。出力を制御したい場合は、より多くのコードが必要です。本当に面倒ではありません! – Rory

+1

[Excel VBA - テキストを日付に変換しますか?](https://stackoverflow.com/questions/20375233/excel-vba-convert-text-to-date) – eirikdaude

答えて

4

代わりにDate変数を使用し、常にVBAのMDYで日付を指定します。

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

VBAのAFAIKでは、常にアメリカの方法でMDYを使用する必要があります。地域の設定に従わない。異種混合環境で同じコードを実行できるので、良いことです。

+1

application.international(xlMDY)を使用すると、それが 'アメリカの道'であるかどうかを判断する - https://msdn.microsoft.com/en-us/vba/excel-vba/articles/application-international-property-excel – Phil

+0

val = Application.International(xlMDY)これはFALSE val = Application.International(xlDateOrder)これはDMY形式を意味する1です。しかし暗黙のString to Date変換は、米国の日付形式を前提としています。月が12月を過ぎていない場合は、英国形式とみなされます。ひどいデザイン。 – user40966

2

これは、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 

それは文字列として日付を受け取り、それが/ことによってそれを分割します。次に、年、月、日がかかり、DateSerial()の助けを借りて新しい日付を作成します。 DateSerial MSDN。このような場合には

、あなたが優れて正しい日付を渡していると、そこにあなたがこのように簡単な何かによって書式を変更することができていることを確認してください:あなたが渡していることを、確認するには

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

正しい日付を入力してください。Month(YourDate)またはDay(YourDate)を試してみてください。

0

私は関連する問題を解決しました。私のワークブックは英国でのみ使用できます。それは様々な場所で集められた現金の詳細を入力するためのシートを持っています。ユーザは、各会場を識別する2つの単一セルフィールドを有する。通常は場所と日付が表示されますが、「日付」フィールドには拡張ロケーション名が含まれることがあります。 日付はdd/mm/yyと入力する必要がありますが、認識可能なものはほとんどとなり、 mm/dd/yyを除きます。 詳細はメモリに保存され、後で印刷用の書式設定されたワークシートにコピーされます。私はメモリ内のストレージを確認しました。しかし、ワークブックが数ヶ月間使用された後、私は、ユーザーがdd/mm/[yy] yy(例えば05/11/17)の形式でセルに有効な日付を入力し、その解釈をmm/dd/[yy] yyも有効な日付を指定すると、日付は11月11日ではなく11月3日として不明瞭に印刷されます。

いくつかのコードスニペット:

'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

これを行うにはもっとエレガントな方法があるかもしれません。しかし、Excelについては、私は独学でセクトゥーガリア人です。そして、 "それがうまくいくなら、それを修正しないでください!" – OldColdDreamer

+0

あなたと同じように、着信文字列が「日付」であるかどうかを知るためにIsDateを使用してしまいました。はいの場合はCDate(文字列)を使用します。 – user40966

0

私はむしろ内蔵のVBA関数DateSerialの(年、月、日)とTimeSerialない(時間、分、秒)を使用します。

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

Excelセルの数値の書式を自由に設定できます。

文字列をあらかじめ翻訳する必要がないため、これは高速です。さらに重要なのは、私にとってはプログラマとして、パラメータは明示的です。私は、異なる地域の設定について心配する必要はありません。

+0

はい、データは文字列に到着し、数値はプレーンテキストなどです。セルにStringを割り当てるのは簡単です。たとえば、worksheet.cells(1,1)= stringは、Excelが月を除くこの12月を過ぎると、英国の書式を前提としています! – user40966

関連する問題