ฉันจะแยกวิเคราะห์รูปแบบวันที่ที่ไม่เป็นมาตรฐานใน Excel ได้อย่างไร


24

ฉันมีคอลัมน์ของวันเช่นค่าสตริงในรูปแบบเช่นyyyy-mm-dd 2011-Sep-13ฉันต้องแปลงตัวเลขเหล่านี้เป็นหมายเลขซีเรียลวันที่ของ Excel เพื่อให้สามารถใช้ในสูตรได้

DATEVALUE ไม่สามารถรับรู้รูปแบบนี้ ฉันเพิ่งได้รับ#VALUE!เมื่อฉันพยายาม นอกจากนี้ยังไม่ใช้รูปแบบวันที่ที่กำหนดเอง (ไม่เหมือนภาษาการเขียนโปรแกรมส่วนใหญ่)

ฉันจะแปลงรูปแบบวันที่ตามอำเภอใจให้เป็นค่าวันที่ของ Excel ได้อย่างไร

คำตอบ:


21

คุณจะต้องทำการวิเคราะห์คำสตริงแล้วส่งค่าที่จัดรูปแบบที่เหมาะสมลงไปDATEVALUE- สิ่งนี้:

=DATEVALUE(RIGHT(A1,2)&"-"&MID(A1,6,3)&"-"&LEFT(A1,4))

(แก้ไข: สูตรที่อัปเดต - ผ่านการทดสอบและใช้งานได้สำหรับฉันในหนึ่งตัวอย่าง - อาจต้องปรับแต่งตามการป้อนข้อมูลของคุณ)


1
+1: ฉันมีสิ่งนี้ในคลิปบอร์ดพร้อมที่จะไปเมื่อคุณโพสต์: = DATEVALUE (ขวา (A1,2) & MID (A1, FIND ("-", A1), 5) & MID (A1,3,2)
Excellll

เฮ้ฉันไม่เคยคิดที่จะจัดเรียงบิตใหม่ ขอบคุณ!
Craig Walker

2
8 ปีและ Excel หลายรุ่นในภายหลังนี่เป็นคำตอบที่เกี่ยวข้องมากที่สุด! ฉันหวังว่า Excel สามารถใช้เป็นฟังก์ชั่นได้PARSEDATE([string_value], [date format])
Manu Manjunath

5

โปรดทราบว่าชื่อเดือนเป็นตัวเลือกภูมิภาคของ Windows ดังนั้นหากตัวเลือกภูมิภาคของ Windows ของคุณถูกตั้งค่าเป็นยูเครนแล้ว DATEVALUE จะส่งกลับ #VALUE! สำหรับ "07-Nov-2012" แต่จะยอมรับ "07-Лис-2012"


1
หมายเหตุสำคัญมาก !! เป็นเรื่องน่าเสียดายที่ excel ไม่รู้จักการตั้งค่าภูมิภาค + ชื่อเดือน / วันภาษาอังกฤษโดยค่าเริ่มต้น
athanassis

1

ฟังก์ชัน Excels DateValue ขึ้นอยู่กับภูมิภาค หากคุณแยกวิเคราะห์สตริงเช่น "04-11-2008" ในยุโรปที่จะแยกวิเคราะห์เป็นวันที่ 4 พฤศจิกายนและในสหรัฐอเมริกาเมื่อวันที่ 11 เมษายน

ในการหลีกเลี่ยงปัญหานี้คุณสามารถใช้ฟังก์ชัน DateSerial และแยกวิเคราะห์ด้วยตัวเอง นอกจากนี้ยังสามารถปรับให้เข้ากับรูปแบบวันที่ที่ไม่ได้มาตรฐานของคุณได้อย่างง่ายดาย

' Region independent date parsing
' Expects a datetimestr in the format  "04-11-2008 21:39:39"
' The function VBA.DateTime.DateValue() mixes up the date and month in different regions
Function parseDateTime(dateTimeStr As String) As Date

    Dim parts As Variant
    parts = VBA.Strings.Split(dateTimeStr, " ")

    Dim datePart As String, timePart As String
    datePart = parts(0)
    timePart = parts(1)

    Dim dateParts As Variant, day As Integer, month As Integer, year As Integer
    dateParts = VBA.Strings.Split(datePart, "-")
    day = dateParts(0)
    month = dateParts(1)
    year = dateParts(2)

    Dim parsed_date As Date, parsed_time As Date
    parsed_date = VBA.DateTime.DateSerial(year, month, day)
    parsed_time = VBA.DateTime.TimeValue(timePart)

    parseDateTime = parsed_date + parsed_time
End Function
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.