วิธีแก้ไขวันที่ในแผ่นงาน Excel ของคุณด้วย VBA

แบ่งปันเลย:

บ่อยแค่ไหนที่เราได้รับวันที่ในสเปรดชีตที่ส่งมาให้เราเป็นวันที่ 12.26.2016 หรือ 26/12/2016 (รูปแบบสหราชอาณาจักร) เท่านั้นที่จะบอกว่าวันที่นั้นไม่ถูกต้องหรือไม่มีวันที่ 26 ของเดือน บทความนี้จะสำรวจการกำหนดวันที่ด้วย VBA โดยใช้ฟังก์ชัน TRIM, ซ้าย, ขวา และ MID

บทความนี้ถือว่าผู้อ่านมี Ribbon ของนักพัฒนาที่แสดงอยู่และคุ้นเคยกับ VBA Editor มิฉะนั้นโปรดใช้“ แท็บนักพัฒนา Excel” ของ Google หรือ“ หน้าต่างรหัส Excel”

xlsm ในแบบฝึกหัดนี้สามารถดาวน์โหลดได้ Good Farm Animal Welfare Awards.

ไม่ใช่ปัญหาของเรา!

การเพิ่มวันที่ 7 วันสถานที่ที่ดีที่สุดในการแก้ปัญหาอยู่ที่ต้นทาง อย่างไรก็ตาม ไม่มีการโน้มน้าวใจใดๆ ที่สามารถโน้มน้าวแผนกบัญชีเงินเดือนในกรณีนี้ว่า 12.26.1994 ไม่ใช่วันที่ที่ถูกต้อง (เว้นแต่จะมีการกำหนดค่าในแผงควบคุมของคอมพิวเตอร์สำหรับบางประเทศในยุโรปตะวันออก)

ในความเป็นจริงเราสามารถพิสูจน์ได้ว่าไม่สามารถอ่านด้วยเครื่องได้ ตัวอย่างเช่น เพิ่ม 7 วันในวันที่:

"=01.01.2017 + 7" = #VALUE. 

"=2017.01.01 + 7" = #VALUE.

ในทางตรงกันข้าม…

"=2017-01-01 + 7" = 2017/01/08.

ให้เราถือว่าพวกเขาแนะนำว่าไม่ใช่ปัญหาของพวกเขา

รูปแบบวันที่

สิ่งแรกที่เราต้องแน่ใจคือวันที่อยู่ในรูปแบบสหรัฐอเมริกาหรือสากลวันที่ในรูปแบบสหรัฐอเมริกา

ตัวอย่างของเราทำให้ชัดเจนว่าเรากำลังดูการใช้งานในสหรัฐอเมริกา เช่น MDY แทนที่จะเป็นรูปแบบสากล DMY

เมื่อเราสร้างแหล่งข้อมูลแล้ว เราจำเป็นต้องเปลี่ยนรูปแบบข้อมูลเพื่อให้ Excel สามารถเข้าใจได้ ไม่ว่าจะเป็นในต่างประเทศหรือในสหรัฐอเมริกา

วิธีที่ดีที่สุดในการดำเนินการนี้คือเปลี่ยนวันที่เป็น yyyymmdd ซึ่งเป็นรูปแบบที่ไม่ต้องระบุคุณสมบัติ

กระบวนการ

เราจะหมุนเวียนแต่ละแถวในเอกสาร เรียกใช้ฟังก์ชันเพื่อ "แก้ไข" วันที่ตามประเทศต้นทาง เมื่อแก้ไขวันที่แล้ว เราจะคำนวณอายุของพนักงาน

รหัส

คัดลอกรหัสต่อไปนี้ลงในโมดูลใหม่:

Option Explicit

Sub Main()
    Dim strNewFormat As String
    Dim strDate As String
    Sheets("Main").Range("B4").Select
    
    'Cycle through the sheet rows, using IDNumber as an anchor
    'to prevent a premature halt caused by a blank date of birth
    Do While ActiveCell > ""
        If ActiveCell.Offset(0, 2) > "" Then
            strDate = ActiveCell.Offset(0, 2)
            
            'Remove leading or trailing spaces
            strDate = Trim(strDate)
            
            'Call the function
            strNewFormat = ReformatDate(strDate, "USA")
            
            'Write the result from the function ReformatDate to a new column
            ActiveCell.Offset(0, 3) = strNewFormat
            
            'Determine age by subtracting the previous column from today's date
            ActiveCell.Offset(0, 4) = "=(NOW()-RC[-1])/365.25"
            
            'Convert to intger, thus lopping off decimal places
            ActiveCell.Offset(0, 4) = Int(ActiveCell.Offset(0, 4))
        End If
        Range("B" & ActiveCell.Row + 1).Select
    Loop
End Sub

Function ReformatDate(sDate As String, sSource As String)
    Dim yyyy, mm, dd As String
    yyyy = Right(sDate, 4)
    If sSource = "USA" Then
        mm = Left(sDate, 2)
        dd = Mid(sDate, 4, 2)
    Else
        mm = Mid(sDate, 4, 2)
        dd = Left(sDate, 2)
    End If
    ReformatDate = yyyy & "-" & mm & "-" & dd
End Function

เพิ่มปุ่มในแบบฟอร์มของคุณ และกำหนดให้กับ Sub Main

ข้อแม้

ก่อนที่จะเพิ่มโค้ดที่ซับซ้อนมากเกินไปลงในโมดูลของคุณ โปรดทราบว่า Excel นั้นไม่เสถียรเสมอไปในการพัฒนาแอปพลิเคชันหลักๆ และมักจะไม่สามารถกู้คืนโค้ดที่เสียหายได้ ผลลัพธ์อาจเป็นความเสียหายของสำเนาเดียวของคุณเนื่องจากความเสียหายเกิดขึ้นใน "บันทึก"

สำรองข้อมูลบ่อยครั้งและใช้เครื่องมือเพื่อแก้ไข ไฟล์ Excel เสียหาย.

บทนำผู้เขียน:

Felix Hooker เป็นผู้เชี่ยวชาญด้านการกู้คืนข้อมูลใน DataNumen, Inc. ซึ่งเป็นผู้นำระดับโลกด้านเทคโนโลยีการกู้คืนข้อมูล ได้แก่ ซ่อมแซม rar ไฟล์เสียหาย และผลิตภัณฑ์ซอฟต์แวร์กู้คืน sql ดูข้อมูลเพิ่มเติมได้ที่ wwwdatanumenด้วย.

แบ่งปันเลย:

ความเห็นถูกปิด