2017-12-18 127 views
5

Windows 10 Pro, Cài đặt vùng cho tiếng Anh ở Vương quốc Anh. Trong Excel VBA, tôi có một chuỗi "02/05/2017 16:30" Điều đó, ở Anh, có nghĩa là "02/05/2017 16:30"chuỗi excel vba cho đến ngày

Nhưng VBA chuyển định dạng này sang định dạng Hoa Kỳ bằng cách nào đó và trong ô đặt "2017/05/02 16:30"

mã VBA là như thế này

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

tôi có thể sử dụng CDate để làm được việc này nhưng CDate nhưng điều đó đòi hỏi phải có thêm mã để xác định các tế bào đang ngày và không, trong khi chuyển đổi ngầm ẩn hoạt động cho tất cả các loại.

+0

Bạn không có nhiều lựa chọn. Nếu bạn muốn kiểm soát đầu ra, bạn cần thêm mã - nó thực sự không phải là gian khổ! – Rory

+1

Có thể trùng lặp của [Excel VBA - Chuyển đổi văn bản thành ngày?] (Https://stackoverflow.com/questions/20375233/excel-vba-convert-text-to-date) – eirikdaude

Trả lời

4

Sử dụng biến Ngày thay thế và luôn cung cấp ngày của bạn trong MDY trong VBA.

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

AFAIK trong VBA bạn phải luôn làm việc 'Cách của người Mỹ', với ngày MDY. Nó KHÔNG tuân theo các thiết lập khu vực. Đó là tốt, bởi vì điều đó cho phép chạy cùng một mã trên môi trường không đồng nhất.

+1

application.international (xlMDY) có thể được sử dụng để xác định xem nó có hoạt động theo cách của người Mỹ không - https://msdn.microsoft.com/en-us/vba/excel-vba/articles/application-international-property-excel – Phil

+0

val = Application.International (xlMDY) đây là FALSE val = Application.International (xlDateOrder) đây là 1 ngụ ý định dạng DMY. Tuy nhiên, các chuyển đổi String to Date tiềm ẩn giả định định dạng ngày tháng của chúng tôi, KHÔNG BAO GIỜ tháng là quá khứ tháng mười hai trong trường hợp nó giả định định dạng Anh. Thiết kế khủng khiếp. – user40966

2

Đây là một số cách giải quyết trong mã 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 

Phải mất ngày như một chuỗi và nó chia tách nó bằng cách /. Sau đó, phải mất cả năm, tháng và ngày và nó xây dựng một ngày mới với sự giúp đỡ của DateSerial(). DateSerial MSDN.

Trong những trường hợp như thế này, hãy chắc chắn rằng bạn đang đi đúng ngày để nổi trội và ở đó bạn có thể thay đổi định dạng thông qua một cái gì đó dễ dàng như này:

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

Để chắc chắn, rằng bạn đang đi qua các đúng ngày, chỉ cần thử Month(YourDate) qua ngày hoặc Day(YourDate).

0

Tôi đã giải quyết được sự cố liên quan. Sổ làm việc của tôi chỉ được sử dụng ở Vương quốc Anh. Nó có một tờ để nhập chi tiết của tiền mặt thu thập được tại các địa điểm khác nhau. Người dùng có hai ô đơn để xác định từng địa điểm; thường là vị trí và ngày, nhưng đôi khi trường "ngày" sẽ chứa tên vị trí mở rộng thay thế. Ngày nên được nhập là dd/mm/yy, nhưng hầu như mọi thứ có thể nhận dạng được chấp nhận ngoại trừ mm/dd/yy. Chi tiết được lưu trong bộ nhớ, sau đó được sao chép sang các trang tính đã định dạng để in. Tôi đã xác minh bộ nhớ trong bộ nhớ. Nhưng sau khi sổ làm việc đã được sử dụng trong một vài tháng, tôi thấy rằng nếu người dùng đã nhập ngày hợp lệ vào ô theo định dạng dd/mm/[yy] yy (ví dụ: 05/11/17) và cách diễn giải của nó là mm/dd/[yy] yy cũng sẽ cung cấp ngày hợp lệ, sau đó ngày tháng sẽ được in một cách tối nghĩa là ngày 11 tháng 3 thay vì ngày 5 tháng 11.

Một số đoạn mã:

'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

Có thể có nhiều cách thanh lịch hơn để thực hiện việc này; nhưng như xa như Excel là có liên quan, tôi là một tự học septuagenarian. Và "nếu nó hoạt động, đừng sửa nó!" – OldColdDreamer

+0

Giống như bạn, tôi đã kết thúc bằng cách sử dụng IsDate để có thể biết chuỗi đến là "ngày", và nếu có thì sử dụng CDate (chuỗi) – user40966

0

Tôi thà sử dụng được xây dựng trong chức năng VBA DateSerial (năm, tháng, ngày) và TimeSerial (giờ, phút, giây).

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

Sau đó, bạn có thể đặt định dạng số trên ô Excel theo ý thích của mình.

Tôi cho rằng điều này nhanh hơn vì không cần dịch trước bất kỳ chuỗi nào.Quan trọng hơn đối với tôi là một lập trình viên, các tham số là rõ ràng. Tôi không phải lo lắng về bối cảnh khu vực khác nhau.

+0

Có, nhưng dữ liệu đến trong một chuỗi và một số chuỗi là ngày, một số là một số, một số là văn bản thuần túy vv Một phép gán đơn giản của String cho ô, ví dụ: worksheet.cells (1,1) = string, hoạt động cho tất cả các loại, ngoại trừ ngày mà Excel giả định ngày ở định dạng Hoa Kỳ, trừ tháng tháng 12 vừa qua, trong trường hợp này, nó giả định định dạng Anh! – user40966