Sắp xếp trong Excel

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

123456it

Thành viên chính thức
Tham gia
5/10/08
Bài viết
78
Được thích
7
Em có file Excel như file đính kèm. Em muốn sắp xếp nó \000.12.09.H32.2021.02.70.pdf rồi lên \000.12.09.H32.2021.03.71.pdf chứ hiện tại đang sắp xếp ngược ạ. Bác nào giúp em với ạ. Em cám ơn .. Chạy cho toàn bộ cột 26 ạ.
 

File đính kèm

  • Excel_Tong2021_2020.xlsx
    1.9 MB · Đọc: 22
Em có file Excel như file đính kèm. Em muốn sắp xếp nó \000.12.09.H32.2021.02.70.pdf rồi lên \000.12.09.H32.2021.03.71.pdf chứ hiện tại đang sắp xếp ngược ạ. Bác nào giúp em với ạ. Em cám ơn .. Chạy cho toàn bộ cột 26 ạ.
Dùng cột phụ tách cái số ở cuối rồi sort theo cột phụ coi
 
bạn tách cột ra chứ,
 

File đính kèm

  • 1672302656686.png
    1672302656686.png
    33 KB · Đọc: 14
Dòng 351:
G:\BHTN_KhanhHoa\2021\10\000.12.09.H32.2021.10.433.pdf

Dòng 352
G:\BHTN_KhanhHoa\2021\100\000.12.09.H32.2021.100.4156.pdf

Có tới 3 chỗ thay đổi

Có lẽ phải quy hết các thành phần bên trong về số ký tự đồng nhất (VD: 5 ký số) rồi sort chăng?
VD:
G:\BHTN_KhanhHoa\2021\00010\000.12.09.H32.2021.00010.00433.pdf
G:\BHTN_KhanhHoa\2021\00100\000.12.09.H32.2021.00100.04156.pdf
 
Dòng 351:
G:\BHTN_KhanhHoa\2021\10\000.12.09.H32.2021.10.433.pdf

Dòng 352
G:\BHTN_KhanhHoa\2021\100\000.12.09.H32.2021.100.4156.pdf

Có tới 3 chỗ thay đổi

Có lẽ phải quy hết các thành phần bên trong về số ký tự đồng nhất (VD: 5 ký số) rồi sort chăng?
VD:
G:\BHTN_KhanhHoa\2021\00010\000.12.09.H32.2021.00010.00433.pdf
G:\BHTN_KhanhHoa\2021\00100\000.12.09.H32.2021.00100.04156.pdf
Nhưng lỡ có phát sinh thư mục hoặc file dài 6, 7 số thì lại dính nữa bác ạ, món sort em dính rồi nên cay cú lắm.
 
Cho nó format 7 số luôn cho hoành tráng
Quy tắc:

1- Tất cả các thành phần có giá trị số tại cột AB sẽ được format thành 7 số tại cột AC
VD: AB2:
G:\BHTN_KhanhHoa\2021\01\000.12.09.H32.2021.01.01.pdf
AC2 sẽ là:
G:\BHTN_KhanhHoa\0002021\0000001\0000000\0000012\0000009\H32\0002021\0000001\0000001\pdf

2- Mượn cột AC để dán kết quả tạm thời, sau đó sort cả bảng theo cột này, sau đó delete nó đi không còn dấu vết

PHP:
Option Explicit
Sub sort()
Dim lr&, i&, j&, rng, sp, st As String
lr = Cells(Rows.Count, "AB").End(xlUp).Row
rng = Range("AB2:AC" & lr).Value
For i = 1 To UBound(rng)
    rng(i, 2) = Replace(rng(i, 1), ".", "\")
    st = "": sp = Split(rng(i, 2), "\")
    For j = 0 To UBound(sp)
        If IsNumeric(sp(j)) Then sp(j) = Format(sp(j), "0000000")
        st = IIf(st = "", "", st & "\") & sp(j)
    Next
    rng(i, 2) = st
Next
Range("AB2:AC" & lr).Value = rng
Range("B2:AC" & lr).sort Range("AC1")
Columns("AC").EntireColumn.Delete
End Sub
 
Nhưng lỡ có phát sinh thư mục hoặc file dài 6, 7 số thì lại dính nữa bác ạ, món sort em dính rồi nên cay cú lắm.
Tại không biết lường trước. Năm 4 con, tháng 2 con là đương nhiên. Số lượng hợp đồng trong tháng, số lượng chứng từ trong tháng, số lượng khách hàng trong tháng hoàn toàn có thể ước lượng mức tối đa. Công ty xây dựng, công ty dịch vụ, cửa hàng, siêu thị, ... mỗi hình thức kinh doanh đều có con số tối đa riêng của nó. Người đang đi làm phài biết con số tối đa của công ty mình.
Tất cả đều lên 7 con ở bài 9 chỉ là biện pháp tạm thời, phải hỏi mới biết. Nếu tự biết khỏi hỏi thì tốt hơn.
 
Thớt lặn mất tăm rồi.

Theo bài #1 thì thớt chỉ cần xếp cái tên tập tin thôi, còn khúc trước là cây thư mục thì mặc kệ nó.

1672371735642.png
----
Trình bày đề bài kiểu này thì đợi 2 mùa quýt chín nữa.

1672371789580.png
 
Tất cả đều lên 7 con ở bài 9 chỉ là biện pháp tạm thời, phải hỏi mới biết. Nếu tự biết khỏi hỏi thì tốt hơn.
Nếu người dùng chịu khó tìm tòi và hiểu code đang làm gì thì mọi việc quá đơn giản, vì mọi thứ đã phơi bày hết qua hàm format.
Nếu không dùng đến 7 số thì người dùng có thể điều chỉnh xuống 6 hay 5 tùy ý.
Bài đã được tự động gộp:

Trình bày đề bài kiểu này thì đợi 2 mùa quýt chín nữa.
Bình thường thôi bác. Vì số ở cuối nó chạy liên tục qua các tháng luôn chứ không quay về 1. Số 70 nằm trong tháng 2, qua số 71 nó thuộc tháng 3.
Dù sao, chờ ý kiến thớt mới biết kết quả tại bài #9 thế nào
 
Nếu người dùng chịu khó tìm tòi và hiểu code đang làm gì thì mọi việc quá đơn giản, vì mọi thứ đã phơi bày hết qua hàm format.
Nếu không dùng đến 7 số thì người dùng có thể điều chỉnh xuống 6 hay 5 tùy ý.
Là tôi đang nói tác giả bài 1 và người đang "cay cú", còn bé bo là đã "dùng biện pháp tạm thời". Biện pháp tạm thời thì 10 con, 50 con cũng không hề gì.
Bình thường thôi bác. Vì số ở cuối nó chạy liên tục qua các tháng luôn chứ không quay về 1. Số 70 nằm trong tháng 2, qua số 71 nó thuộc tháng 3.
Dù sao, chờ ý kiến thớt mới biết kết quả tại bài #9 thế nào
Số không quay về 1 thì cũng có giới hạn (cho 1 năm, 10 năm chẳng hạn). Sau đó là phá sản vì nhân viên
 
Em có file Excel như file đính kèm. Em muốn sắp xếp nó \000.12.09.H32.2021.02.70.pdf rồi lên \000.12.09.H32.2021.03.71.pdf chứ hiện tại đang sắp xếp ngược ạ. Bác nào giúp em với ạ. Em cám ơn .. Chạy cho toàn bộ cột 26 ạ.
Số các chữ số trong giới hạn của VBA
Chỉ sort 1 cột và gán tạm kết quả vào cột kế
Mã:
Option Explicit
Sub SortStringNum()
  Dim oList As Object, arr(), S(), aLenNum(), aSort, res()
  Dim sRow&, sC&, i&, j&, t&, k&
 
  Set oList = CreateObject("System.Collections.ArrayList")
  With Sheets("Excel_2021")
    arr = Range("AB2", Range("AB1000000").End(xlUp)).Value
  End With
  sRow = UBound(arr)
  ReDim res(1 To sRow, 1 To 1)
  sC = UBound(Split(Replace(arr(1, 1), ".", "\"), "\"))
  ReDim aLenNum(0 To sC)
  ReDim aSort(1 To sRow)
  For i = 1 To sRow
    aSort(i) = Split(Replace(arr(i, 1), ".", "\"), "\")
    For j = 0 To sC
      If IsNumeric(aSort(i)(j)) Then
        t = Len(aSort(i)(j))
        If aLenNum(j) < t Then aLenNum(j) = t
      End If
    Next j
  Next i
  For j = 0 To sC
    If aLenNum(j) <> Empty Then aLenNum(j) = String(aLenNum(j), "0")
  Next j
 
  For i = 1 To sRow
    ReDim S(0 To sC)
    For j = 0 To sC
      If IsNumeric(aSort(i)(j)) Then
        S(j) = Format(CLng(aSort(i)(j)), aLenNum(j))
      Else
        S(j) = aSort(i)(j)
      End If
    Next j
    oList.Add Join(S, "/")
  Next i
  aSort = SortRow(oList)
 
  For i = 0 To UBound(aSort)
    k = k + 1
    res(k, 1) = arr(aSort(i), 1)
  Next i
  Sheets("Excel_2021").Range("AC2").Resize(sRow) = res
  Set oList = Nothing
End Sub

Private Function SortRow(ByVal tList As Object, Optional ByVal bASC As Boolean = True) As Variant
  Dim arr(), sR&, i&, k&, r&, tmp, oList As Object
 
  On Error Resume Next
  sR = tList.Count - 1
  ReDim arr(0 To sR)
  Set oList = tList.Clone
  tList.Sort
  If bASC = False Then tList.Reverse
  For i = 0 To sR
    tmp = tList.Item(i)
    r = oList.IndexOf(tmp, 0)
    If tmp = tList.Item(i + 1) Then oList.Item(r) = Empty
    arr(k) = r + 1
    k = k + 1
  Next i
  SortRow = arr
  Set oList = Nothing
End Function
 
Web KT
Back
Top Bottom