Sắp xếp trong Excel

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

Em có file Excel như file đính kèm. Em muốn sắp xếp nó 00.12.09.H32.2021.02.70.pdf rồi lên 00.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

Là như nào bác e chưa hiểu.. vì số cuối nó chạy biến thiên từ 1 đến vài nghìn ạ 🙁

Bạn muốn sắp xếp theo những số cuối cùng à? hay thế nào. Cho vài ví dụ cụ thể coi. Tại thấy chuỗi có những chỗ khác nhau

Bài này khó, ít nhất cũng phải sort 3 cột (năm/thư mục/số). Nếu excel xịn xịn có hàm textsplit thì sort được.

Dòng 351:
G:BHTN_KhanhHoa20211000.12.09.H32.2021.10.433.pdf

Dòng 352
G:BHTN_KhanhHoa202110000.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_KhanhHoa2021001000.12.09.H32.2021.00010.00433.pdf
G:BHTN_KhanhHoa2021010000.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_KhanhHoa2021100.12.09.H32.2021.01.01.pdf
AC2 sẽ là:
G:BHTN_KhanhHoa002021000001000000000012000009H32002021000001000001pdf

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

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

www.giaiphapexcel.com/diendan/threads/s%E1%BA%AFp-x%E1%BA%BFp-trong-excel.163697/

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.

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 ý.

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ó.
1103

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

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ì.

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

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ế

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

www.giaiphapexcel.com/diendan/threads/s%E1%BA%AFp-x%E1%BA%BFp-trong-excel.163697/post-1092107

Học Nhân sự Tổng hợp – Trở thành chiến binh nhân sự vững nghiệp vụ
Khóa học SprinGO phù hợp

Học Nhân sự Tổng hợp – Trở thành chiến binh nhân sự vững nghiệp vụ

Con người là một trong những yếu tố quan trọng của công ty, là tài sản quý giá của doanh nghiệp. Chính vì thế,...

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

Bạn nên đọ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