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

Liên hệ QC

Hoàng Nhật Phương

Thành viên gắn bó
Tham gia
5/11/15
Bài viết
1,895
Được thích
1,219
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 ạ.
 

File đính kè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.

Vào lại CP -> chọn lại thiết lập cũ của mình (ngày/tháng/năm)
 
Upvote 0
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.
 
Upvote 0
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!

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 ạ.
Bài đã được tự động gộp:

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.
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 ạ.
 
Upvote 0
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 ạ.
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.
 
Upvote 0
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.
 
Upvote 0
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à.
Ở 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.
 
Upvote 0
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 ạ.
 
Upvote 0
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ý ạ.
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. :D
 
Upvote 0
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 ạ.
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ý
 
Lần chỉnh sửa cuối:
Upvote 0
Thớt thử xem sao
Mã:
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
 
Upvote 0
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. :D

Dạ, cũng gần như là vậy Bác ạ.
Bài đã được tự động gộp:

Thớt thử xem sao
Mã:
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
Xin chào anh huuthang_bd,
Cảm ơn anh đã quan tâm và giúp đỡ.
Hiện OT chưa test được ạ, ngày mai OT sẽ test nếu có vấn đề gì OT sẽ thông tin lại trên này.
Chúc anh sức khỏe.
OT
 
Upvote 0
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

Mã:
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
Mã:
, 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.
 
Lần chỉnh sửa cuối:
Upvote 0
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 ạ.
Dùng code lấy dữ liệu file data.txt
Mã:
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
 
Upvote 0
... đế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.
 
Upvote 0
Hì hì, Pi thân hả, ai kiu tui đó, có ớt không ? :p Tui đang nhậu với nó hằng ngày đây.
 
Upvote 0
KKK, phá rừng gì ở đây bác ơi. Ý tui là ngôn ngữ Python đấy.
Thời buổi 4.0, AI, BigData, Machine Learning, IOT... mà không biết "Con trăn" là không được. Trong lãnh vực ATTT, "Con trăn" dùng chủ yếu.
 
Lần chỉnh sửa cuối:
Upvote 0
Ôi! hơn cả sự mong đợi, OT đã chạy thử tất cả code trong bài ạ.. mỗi code đều có một cách làm khác nhưng cho ra kết quả đúng mong muốn của OT rồi ạ.
Xin trân trọng cảm ơn Anh huuthang_bd, Bác Siwtom, Bác HieuCD nhiều ạ.
Xin cảm ơn Bác VetMini đã góp ý cho con.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom