Chuyển ngày tháng từ nhiều định dạng về định dạng ngày tháng năm

Chia sẻ bởi:hands
★★★★★
Quảng cáo

Xin chào các bạn,
Nhờ các bạn giúp đỡ OT trường hợp chuyển dữ liệu ngày tháng trong cột A đưa sang cột B trong file kèm với ạ.

2114

Xin chào befaint,
Cảm ơn bạn đã giúp đỡ, code nhanh & chính xác rồi ạ. 🙂
OT chúc bạn nhiều sức khỏe.

OT cho vòng lặp duyệt hết cột A có giá trị, dùng IsNumeric kiểm tra xem có phải là số không, nếu là số thì dùng Hàm DateOfTime, không thì dùng hàm DateOfString.

Function DateOfString(Text$, Optional FormatType$ = "*/*/* *") As Date
    Dim S$()
    If Not Text Like FormatType Then Exit Function
    S = Split(Split(Text, " ")(0), "/")
    DateOfString = DateSerial(S(2), S(0), S(1))
    Erase S
  End Function
  Function DateOfTime(inDate As Date) As Date
    DateOfTime = DateSerial(Year(inDate), Month(inDate), Day(inDate))
  End Function

www.giaiphapexcel.com/diendan/threads/chuy%E1%BB%83n-ng%C3%A0y-th%C3%A1ng-t%E1%BB%AB-nhi%E1%BB%81u-%C4%91%E1%BB%8Bnh-d%E1%BA%A1ng-v%E1%BB%81-%C4%91%E1%BB%8Bnh-d%E1%BA%A1ng-ng%C3%A0y-th%C3%A1ng-n%C4%83m.143935/

Khóa học Power PI – Ứng dung trong Nhân sự
Khóa học SprinGO phù hợp

Khóa học Power PI – Ứng dung trong Nhân sự

TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...

Xem khóa học
★★★★★ 5 ★ 1 👤 2 ▥ 0
Quảng cáo

Bạn nên đọc

2 Responses

  1. hands says:

    Xin chào tất cả mọi người,
    Dạ dữ liệu OT gửi lên đúng là xuất ra từ phần mềm ạ, OT cũng không hiểu sao phần mềm lại xuất ra như vậy.
    Phần mềm xuất là dữ liệu file txt sau đó QT copy/pase vào excel ạ.
    Cảm ơn Bác/Anh và các Bạn đã quan tâm ạ.

    Tất nhiên phần mềm nào cũng xuất ra dữ liệu thống nhất. Hoặc toàn ngày/tháng/năm hoặc toàn tháng/ngày/năm hay gì khác nữa. Đã lấy 1 chuẩn thì mọi dòng đều cùng chuẩn ấy.
    Ở đây ta có thể đoán mà không cần tập tin của chủ thớt.
    Nhìn dữ liệu thì có thể đoán là phần mềm xuất theo chuẩn tháng/ngày/năm. Nhưng khi load vào Excel thì Excel sẽ tự "cố" (???) chuyển thành ngày tháng. Vd. 09/02/2019 (chuẩn tháng/ngày/năm). Cái này có thể "thử" chuyển thành ngày tháng được. Thiết lập trên máy thớt là ngày/tháng/năm (???) nên Excel "thử" và cho là 09 là ngày, 02 là tháng. Vì thế chuyển thành 09/02/2019. Tất nhiên 09/02/2019 là ngày tháng sai so với "dụng ý" của phần mềm – phải là ngày 02 tháng 09 (chuẩn tháng/ngày/năm)
    Còn vd. 09/13/2013 theo thiết lập ngày/tháng/năm của system thì không thể cố chuyển thành ngày tháng được nên để nguyên.

    Vấn đề là tại sao phần mềm cứ chọn một chuẩn cứng nhắc tháng/ngày/năm. Lẽ ra nó phải chọn chuẩn dựa theo thiết lập trong system hiện hành mới phải.

    Đúng là đừng Copy qua Excel, nhưng nên đưa dữ liệu file text ý lên, may ra đoán được làm sao để trở thành kiểu dữ liệu Ngày-tháng-năm như mong muốn;
    Mình nghĩ khi Copy, Excel tài lanh biến hóa đủ thứ đi rồi là mệt!

    Định dạng cột trong Excel là Text, rồi sau đó copy/ paste là được thôi mà.

    Tôi nghĩ chắc là khi load dữ liệu vào Excel bạn có thiết lập trong system là ngày/tháng/năm.

    Bạn thử làm như sau: Vào Control Panel -> chọn Mỹ (USA) -> sẽ có dạng tháng/ngày/năm -> đóng CP -> mở Excel -> mở tập tin Date.xlsx -> chọn ô cần dán dữ liệu -> mở tập tin Data.txt -> chọn toàn bộ -> Ctrl + C -> chuyển về Excel -> Ctrl + V.

    Cách tốt nhất, là gõ đầu công ty cung cấp phần mềm kia sửa lại: xuất thẳng ra excel hoặc file text với định dạng ngày tháng mong muốn
    Sao phải vất vả xử lý cái đã rồi.
    Vào lại CP -> chọn lại thiết lập cũ của mình (ngày/tháng/năm)

    Nhưng lúc đó sẽ có y như trong tập tin TXT, vd.

    08/29/2019 22:52:12
    09/02/2019 23:09

    Mà ta đang muốn có

    29/08/2019 22:52:12
    02/09/2019 23:09

    cơ mà.

    Đúng là đừng Copy qua Excel, nhưng nên đưa dữ liệu file text ý lên, may ra đoán được làm sao để trở thành kiểu dữ liệu Ngày-tháng-năm như mong muốn;
    Mình nghĩ khi Copy, Excel tài lanh biến hóa đủ thứ đi rồi là mệt!

    Con chào Bác Siwtom và Bác SA
    Cảm ơn Bác Siwtom và Bác SA đã tham gia chủ đề ạ.
    Đúng là nên xử lý từ gốc để tránh thay đổi muôn hình vạn trạng khi đưa vào Excel ạ.
    Không hẳn người dùng nào cũng biết xử lý hệ thống và cũng không phải lúc nào cũng có thể hướng dẫn được khi thay đổi người.

    Nếu có thể Bác và mọi người giúp OT xử lý bằng code từ file tetx vào Excel với ạ.

    Cách tốt nhất, là gõ đầu công ty cung cấp phần mềm kia sửa lại: xuất thẳng ra excel hoặc file text với định dạng ngày tháng mong muốn

    Dạ phần mềm này chỉ có thể xuất ra file text được thôi ạ.. mà phần mềm của khách hàng nữa chứ.
    Công ty OT chỉ là nhận lại file text khi đã xuất ra ạ.
    Phần mềm xuất là dữ liệu file txt sau đó QT copy/pase vào excel ạ.

    Bạn làm phương pháp của thế kỷ 20. Thời buổi bi giờ không ai copy/paste cả.
    Từ file text thì phải import vào Excel.
    Nếu dữ liệu không đồng bộ thì thử nghiên cứu giải quyết bằng Power Query. MS ra công cụ này với mục đích chính là để import dữ liệu cần xử lý trước khi đưa vào bảng tính.
    Theo tôi thấy thì file text của bạn chưa chắc đã không đồng bộ. Vì bạn copy/paste cho nên những chỗ Excel kết được là ngày thì sẽ là ngày và những chỗ không kết được sẽ tự động cho là text. Nếu muốn copy/paste thì phải format cột là text trước rồi dùng công thức sử lý sau.


    Dạ phần mềm này chỉ có thể xuất ra file text được thôi ạ.. mà phần mềm của khách hàng nữa chứ.
    Công ty OT chỉ là nhận lại file text khi đã xuất ra ạ.

    Import theo text. Sau đó sử lý bằng công thức.

    Không hẳn người dùng nào cũng biết xử lý hệ thống và cũng không phải lúc nào cũng có thể hướng dẫn được khi thay đổi người.

    Thay đổi người? Thế công ty tuyển người thẳng từ "ngoài đường" vào à? Tuyển người mà ngay cả ABC Windows không biết à? Không biết vào CP để thay đổi thiết lập? Nhân viên mở tập tin TEXT mà "nó" bắt phải chọn encoding, nó đưa ra các lựa chọn mà không biết chọn cái gì? Thì hoặc là cho đi học một khóa ngắn hạn hoặc là sa thải. Thế thôi. Nếu công ty tuyển người chưa biết gì thì công ty phải đào tạo họ. Còn nếu tuyển người có "chứng chỉ" tin học mà sau đó lòi ra là nhân viên không biết gì thì gửi cho nhân viên "tối hậu thư". Thế thôi.
    Tuyển người làm việc mà cứ lý luận là nhân viên của tôi không biết gì, ngay cả ABC. Bó tay

    Dạ phần mềm này chỉ có thể xuất ra file text được thôi ạ.. mà phần mềm của khách hàng nữa chứ.
    Công ty OT chỉ là nhận lại file text khi đã xuất ra ạ.

    Thế bạn đã thử làm như tôi hướng dẫn không? Chỉ copy/paste. Nếu được thì dạy ai đó cách thao tác đổi thiết lập trong CP mất bao nhiêu thời gian? 5 phút? Hay theo bạn việc thay đổi thiết lập trong CP quá khó và nhân viên không thể tiếp thu được? Nhân viên "thông minh" ở mức đó thì nếu giữ lại thì cũng chỉ nên ở cương vị gác cổng hoặc quét dọn mà thôi.

    Theo tôi nguyên tắc là nếu tập tin TXT ở dạng tháng/ngày/năm thì trước khi copy/paste phải đổi thiết lập trong CP thành tháng/ngày/năm. Sau khi copy/paste thì đổi lại như cũ. Thế thôi.

    Ở mấy bài trên kêu không nên / dán vào Excel bị nhảy lung tung. Nếu kết quả y chang trong tập tin *.txt ban đầu thì quá tuyệt rồi mà anh.
    Được kết quả giống trong tập tin *.txt rồi Ctrl + H và Text to Columns 1 cái là được.

    Dạ con cảm ơn Bác Siwtom ạ,
    Công ty con nghèo (chế độ thấp) nên việc tuyển người và giữ chân được người lao động cũng là một vấn đề nan giải của đội ngũ quản lý ạ.
    Vâng, đến thời điểm này ngoài cách Bác chỉ thì cách của Bác VetMini và Bạn befaint cũng rất an toàn ạ. Có cái tất cả các cách làm đều mang tính thủ công mà thủ công thì có thể sẽ dẫn đến sai sót ạ, do đó mà con muốn code ạ, ai cũng có thể sử dụng được ạ.

    Tức là không phải nhân viên sợ công ty sa thải mình mà là công ty sợ nhân viên sa thải mình? Hơi lạ.
    Giống như không ít trường hợp ô sin mà như bà chủ. Ô sin ho một tiếng là chủ sợ xanh mặt. 😀

    Thì nhân viên nào làm để nhân viên đó đi hỏi (hỏi ai , hỏi ở đâu … google hay 4rum là chuyện của nhân viên – giờ lớp trẻ vào mạng google veo veo lo chi). Như thế vừa dễ quản lý vừa nâng trình độ nhân viên của mình, thay vì người quản lý lại đi làm chuyện bao đồng.
    Hay cty này muốn làm ngu nhân viên dễ quản lý

    Thớt thử xem sao

    Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long
    Declare Function SetLocaleInfo Lib "kernel32" Alias "SetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String) As Boolean
    Declare Function GetUserDefaultLCID% Lib "kernel32" ()
    Const LOCALE_SSHORTDATE = &H1F
    
    Sub OpenTextFile(sShortDate)
        Dim Locale As Long, sCurrentShortDate As String, i As Long
        Locale = GetUserDefaultLCID()
        i = GetLocaleInfo(Locale, LOCALE_SSHORTDATE, sCurrentShortDate, 0)
        sCurrentShortDate = String(i, 0)
        GetLocaleInfo Locale, LOCALE_SSHORTDATE, sCurrentShortDate, i
        sCurrentShortDate = Left(sCurrentShortDate, InStr(sCurrentShortDate, Chr(0)) - 1)
        SetLocaleInfo Locale, LOCALE_SSHORTDATE, sShortDate
        SaveAsXlsx
        SetLocaleInfo Locale, LOCALE_SSHORTDATE, sCurrentShortDate
    End Sub
    
    Private Sub SaveAsXlsx()
    Dim sFilePath As String, NewExApp As Object, TmpWb As Workbook
    With Application.FileDialog(msoFileDialogFilePicker)
        .Filters.Clear
        .Filters.Add "Text file", "*.txt"
        .AllowMultiSelect = False
        If .Show Then sFilePath = .SelectedItems(1)
    End With
    If sFilePath <> "" Then
        With CreateObject("Excel.Application")
            .EnableEvents = False
            Set TmpWb = .Workbooks.Open(Filename:=sFilePath)
            sFilePath = sFilePath & ".xlsx"
            TmpWb.SaveAs Filename:=sFilePath, FileFormat:=xlOpenXMLWorkbook
            TmpWb.Close False
            .Quit
        End With
        Set TmpWb = Workbooks.Open(sFilePath)
        TmpWb.ChangeFileAccess xlReadOnly
        Kill sFilePath
    End If
    End Sub
    
    Sub OpenTextFileMDY()
    OpenTextFile "MM/dd/yyyy"
    End Sub

    http://www.giaiphapexcel.com/diendan/threads/chuy%E1%BB%83n-ng%C3%A0y-th%C3%A1ng-t%E1%BB%AB-nhi%E1%BB%81u-%C4%91%E1%BB%8Bnh-d%E1%BA%A1ng-v%E1%BB%81-%C4%91%E1%BB%8Bnh-d%E1%BA%A1ng-ng%C3%A0y-th%C3%A1ng-n%C4%83m.143935/post-929600

  2. hands says:

    Dạ, cũng gần như là vậy Bác ạ.

    Thôi được. Nếu công ty nghèo, nhân viên luôn dọa sa thải chủ thì ngoài thay đổi thiết lập trong CP như huuthang_bd làm thì bạn thử test xem

    Sub ImportText()
    Dim filename
        filename = Application.GetOpenFilename("Text Files (*.txt), *.txt")
        If filename = False Then Exit Sub
        Workbooks.OpenText filename, Origin:=65001, StartRow:=2, DataType:=xlDelimited, Tab:=True, Space:=True
    End Sub

    Tôi giả sử là tập tin luôn như tập tin đính kèm.
    ————
    Nếu không muốn tách thời gian sang cột riêng thì đổi thành

    , Space:=False

    Chú ý: không chỉ đơn giản bỏ , Space:=True mà phải chuyển thành , Space:=False. Tại sao? Vì nếu trước đó đã từng thao tác tay với Text to columns và đánh dấu kiểm cạnh Space thì bỏ , Space:=True có nghĩa là lấy thiết lập hiện đang có. Mà đang có chính là Space:=True vì Space đang được đánh dấu kiểm.

    Dùng code lấy dữ liệu file data.txt

    Sub ABC()
      Dim fso As Object, TextSource As Object
      Dim Deli As String, TextFile As String, Res(), S, Arr
      Dim k As Long, j As Integer, i As Long
      Dim tmp As String, Ngay As String
    
    Deli = vbTab
      TextFile = ThisWorkbook.Path & "data.txt" 'Duong dan va Ten file Text
      Set fso = CreateObject("Scripting.FileSystemObject")
      Set TextSource = fso.OpenTextFile(TextFile, 1, False, -2)
    
    S = Split(TextSource.ReadAll, vbCrLf)
      ReDim Res(0 To UBound(S), 0 To 0)
      k = -1
      For i = 0 To UBound(S)
        Arr = Split(S(i), Deli)
        If UBound(Res, 2) < UBound(Arr) Then
          ReDim Preserve Res(0 To UBound(S), 0 To UBound(Arr))
        End If
        k = k + 1
        For j = 0 To UBound(Arr)
          If i > 0 And j < 2 Then 'Du lieu ngay thang
            tmp = Mid(Arr(j), 1, 10)
            Ngay = Mid(tmp, 7, 4) & "/" & Mid(tmp, 1, 2) & "/" & Mid(tmp, 4, 2)
            Res(k, j) = Replace(Arr(j), tmp, Ngay)
          Else
            Res(k, j) = Arr(j)
          End If
        Next
      Next
      Sheet1.Range("A1").Resize(k + 1, UBound(Res, 2) + 1) = Res
    End Sub

    http://www.giaiphapexcel.com/diendan/threads/chuy%E1%BB%83n-ng%C3%A0y-th%C3%A1ng-t%E1%BB%AB-nhi%E1%BB%81u-%C4%91%E1%BB%8Bnh-d%E1%BA%A1ng-v%E1%BB%81-%C4%91%E1%BB%8Bnh-d%E1%BA%A1ng-ng%C3%A0y-th%C3%A1ng-n%C4%83m.143935/post-929660

    … đến thời điểm này ngoài cách Bác chỉ thì cách của Bác *** và Bạn *** cũng rất an toàn ạ. Có cái tất cả các cách làm đều mang tính thủ công mà thủ công thì có thể sẽ dẫn đến sai sót ạ, do đó mà con muốn code ạ, ai cũng có thể sử dụng được ạ.

    Như tôi đã khẳng định, chả có phần mềm nào đưa ra kết quả không đồng bộ cả. Chuyện không đồng bộ xảy ra khi bạn copy dữ liệu, bên đi và bên đến không tương thích nhau. Như vậy, để giải quyết vấn đề từ đầu mối thì bạn nên có thêm một phần mềm hay công cụ trung gian.

    Cơ quan của bạn có người chuyên quản lý máy tính hay không?
    Nếu có thì người này thường biết viết script khá giỏi.
    Cách hữu hiệu nhất trong trường hợp của bạn là dùng một cái script để chuẩn hoá cái file text nhận được. Ví dụ nhận được file meText.txt thì chuẩn hoá thành file meTextA.txt; người làm việc chỉ phải import file *A.txt thôi. Tất cả trách nhiệm thuộc về cái script chuẩn hoá.
    Script thì có thể dùng nhiều dạng: ShellScript (Powershell), VBScript, … Nhưng tôi nghĩ ở bài này thì có lẽ Python script khoẻ (dễ viết) nhất. Ở diễn đàn này có mấy ngừoi làm Python, bạn cứ đưa cái file text mẫu lên người ta sẽ script cho. (nhớ bảo người script chú thích code, Python có cách chú thích rất đẹp của nó)

    Dùng code VBA trong trường hợp của bạn là bất đắc dĩ. Bởi vì cái code VBA phải tự đứng ra làm công việc trung gian nói trên, người dùng phải hiểu code khá rõ để đối phó với bất trắc.

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm