web-dev-qa-db-ja.com

これまでのvba文字列に優れています

Windows 10 Pro、英国英語への地域設定。 Excel VBAには、「2017年2月5日16:30」という文字列があります。これは、英国では「2017年5月2日16:30」を意味します。

しかし、VBAはこれをどういうわけか米国の形式に変え、セルに「05/02/201716:30」と入れます

VBAコードはこのようなものです

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

CDateを使用してこれを回避できますが、CDateですが、日付であるセルと日付ではないセルを判別するための追加のコードが必要ですが、暗黙的な変換はすべてのタイプで機能します。

6
user40966

代わりにDate変数を使用し、常にVBAのMDYで日付を指定してください。

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

VBAでのAFAIKでは、日付がMDYの「アメリカンウェイ」で常に作業する必要があります。地域の設定には従いません。異種環境で同じコードを実行できるので、これは良いことです。

4
Patrick Honorez

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

このような場合は、Excelに正しい日付を渡していることを確認してください。そこで、次のような簡単な方法で形式を変更できます。

_Range("A1").NumberFormat = "m/d/yyyy"
_

正しい日付を渡していることを確認するには、日付の上にMonth(YourDate)またはDay(YourDate)を試してください。

2
Vityata

むしろ、組み込みのVBA関数DateSerial(年、月、日)とTimeSerial(時、分、秒)を使用します。

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

次に、Excelセルの数値の書式を好みに合わせて設定できます。

事前に文字列を翻訳する必要がないので、これはより速いと思います。プログラマーとしての私にとってより重要なことは、パラメーターが明示的であることです。地域の違いを気にする必要はありません。

1
cbasah

関連する問題を解決しました。私のワークブックは英国でのみ使用できます。さまざまな場所で集められた現金の詳細を入力するためのシートがあります。ユーザーには、各会場を識別するための2つの単一セルフィールドがあります。通常は場所と日付ですが、「日付」フィールドに代わりに拡張された場所の名前が含まれる場合もあります。日付should dd/mm/yyとして入力しますが、認識できるほとんどすべてのものが受け入れられます除く mm/dd/yy。詳細はメモリに保存され、後で印刷用にフォーマットされたワークシートにコピーされます。メモリ内のストレージを確認しました。しかし、ワークブックが数か月使用された後、ユーザーがdd/mm/[yy] yyの形式でセルに有効な日付を入力した場合(例:05/11/17)、その解釈は次のようになります。 mm/dd/[yy] yyも有効な日付を示し、日付は11月5日ではなく3月11日として不明瞭に印刷されます。

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

'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