Đánh số thứ tự theo điều kiện theo nhiều điều kiện

Liên hệ QC

quick87

(/ội...
Tham gia
8/4/08
Bài viết
371
Được thích
351
Giới tính
Nam
Em nhờ mọi người đánh số thứ tự giúp em theo dữ liệu file đính kèm.

1/ Điều kiện theo Nhóm chứng từ (Cột F) và Ngày chứng từ (Cột B).
2/ Kết quả mong muốn như Cột E


1582688292348.png

Do số lượng dòng khá nhiều nên em mong được giúp đỡ bằng VBA thì càng tốt ạ.
Em cảm ơn thật nhiều !
 

File đính kèm

  • Hoi_DanhSoCT.xlsx
    644.6 KB · Đọc: 10
Em nhờ mọi người đánh số thứ tự giúp em theo dữ liệu file đính kèm.

1/ Điều kiện theo Nhóm chứng từ (Cột F) và Ngày chứng từ (Cột B).
2/ Kết quả mong muốn như Cột E


View attachment 232493

Do số lượng dòng khá nhiều nên em mong được giúp đỡ bằng VBA thì càng tốt ạ.
Em cảm ơn thật nhiều !
Cột STT (cột G) xác định cách nào?
 
Cột STT (cột G) xác định cách nào?
Dạ, em cảm ơn anh đã quan tâm.

Cột G là em đánh mẫu thủ công cho từng nhóm chứng từ tại cột F.
Số thứ tự được đánh tăng dần theo ngày cho mỗi nhóm chứng từ, bắt đầu từ số 1 và tăng lên 1 theo điều kiện ngày. Vì dữ liệu có nhiều năm nên mỗi một năm chứng từ sẽ phải đánh lại bắt đầu từ số 1.

Ví dụ:
Tại Cột F, em filter nhóm chứng từ là BC, số chứng từ sẽ được đánh từ số 1:
Ngày 05/01/2016 là số 1
Ngày 05/01/2016 là số 2
Ngày 05/01/2016 là số 3
...

Tới ngày 31/12/2016 là số MAX của năm 2016

Qua năm 2017, số chứng từ lại đánh bắt đầu từ ố 1
Ngày 05/01/2017 là số 1
Ngày 06/01/2017 là số 2
...
Và tiếp tục đánh số tăng như vậy cho đến giá trị cuối cùng của các năm còn lại

1582690706172.png

Các nhóm khác cũng tương tự như vậy !
Em cảm ơn Anh !
 
thấy bạn đã làm được cột E kết quả mon muốn, hiện tại có lẽ khó trong việc đánh stt cột G hả bạn. Đánh STT dựa theo Cột F Nhom_chung_tu, ngày lập thì cùng số, và tiếp theo nếu suất hiện ở nhóm chứng từ và ngày tiếp theo thì sẽ nhẩy sang stt tiếp theo hả bạn, sang năm tiếp theo thì sẽ bắt đầu lại từ 01
 
thấy bạn đã làm được cột E kết quả mon muốn, hiện tại có lẽ khó trong việc đánh stt cột G hả bạn. Đánh STT dựa theo Cột F Nhom_chung_tu, ngày lập thì cùng số, và tiếp theo nếu suất hiện ở nhóm chứng từ và ngày tiếp theo thì sẽ nhẩy sang stt tiếp theo hả bạn, sang năm tiếp theo thì sẽ bắt đầu lại từ 01
Cảm ơn bạn, điều mình mong muốn đúng như bạn nói.
Hi vọng được bạn và mọi người giúp đỡ !
 
Đúng ra không cần cột phụ vẫn ra được số chứng từ, nhưng data lớn quá nên dùng cột phụ cho nhanh hơn:
Insert thêm cột G để lấy số năm:
G2:
Mã:
=YEAR(B3)
H2:
Mã:
=IF(AND(B2=B3,F2=F3),H2,IF(COUNTIFS($F$2:F3,F3,$G$2:G3,G3)=1,1,LOOKUP(2,1/($F$2:F2=F3),$H$2:H2)+1))
Copy xuống.
 

File đính kèm

  • Hoi_DanhSoCT.xlsx
    1.4 MB · Đọc: 14
E
Đúng ra không cần cột phụ vẫn ra được số chứng từ, nhưng data lớn quá nên dùng cột phụ cho nhanh hơn:
Insert thêm cột G để lấy số năm:
G2:
Mã:
=YEAR(B3)
H2:
Mã:
=IF(AND(B2=B3,F2=F3),H2,IF(COUNTIFS($F$2:F3,F3,$G$2:G3,G3)=1,1,LOOKUP(2,1/($F$2:F2=F3),$H$2:H2)+1))
Copy xuống.
Em cảm ơn Anh thật nhiều đã giúp!
Em kiểm tra thử thì thấy kết quả chưa được ổn lắm, ví dụ:
1582709738720.png

Ô H211 kết quả đúng ra sẽ trả về giá trị là 8 mới đúng.

Tương tự với ô H450, kết quả đúng ra sẽ là: 19
1582709960903.png

Mong anh xem thêm giúp, em cảm ơn Anh !
 
Em nhờ mọi người đánh số thứ tự giúp em theo dữ liệu file đính kèm.

1/ Điều kiện theo Nhóm chứng từ (Cột F) và Ngày chứng từ (Cột B).
2/ Kết quả mong muốn như Cột E


View attachment 232493

Do số lượng dòng khá nhiều nên em mong được giúp đỡ bằng VBA thì càng tốt ạ.
Em cảm ơn thật nhiều !
Bài nầy dùng công thức không đơn giản, dùng VBA nhàn hơn
Mã:
Sub SoChungTu()
  Dim sArr(), Res() As String, Dic As Object
  Dim i&, sRow&
  Dim Nam&, Ngay As Date, Nhom$, iKey$
  With Sheets("SCT")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = .Range("B3:F" & i).Value
  End With
  sRow = UBound(sArr)
  ReDim Res(1 To sRow, 1 To 1)
  Set Dic = CreateObject("scripting.dictionary")
  Nam = Year(sArr(1, 1))
  For i = 1 To sRow
    Ngay = sArr(i, 1)
    If Year(Ngay) <> Nam Then Dic.RemoveAll
    Nhom = sArr(i, 5)
    iKey = Nhom & Ngay
    If Dic.exists(Nhom) = False Then
      Dic.Add Nhom, 1
      Dic.Add iKey, ""
    Else
      If Dic.exists(iKey) = False Then
        Dic.Add iKey, ""
        Dic.Item(Nhom) = Dic.Item(Nhom) + 1
      End If
    End If
    Res(i, 1) = Mid(Nam, 3, 2) & Nhom & Format(Dic.Item(Nhom), "000") & "/" & Format(Month(Ngay), "00")
  Next i
  Sheets("SCT").Range("E3").Resize(sRow) = Res
End Sub
 
Bài nầy dùng công thức không đơn giản, dùng VBA nhàn hơn
Mã:
Sub SoChungTu()
  Dim sArr(), Res() As String, Dic As Object
  Dim i&, sRow&
  Dim Nam&, Ngay As Date, Nhom$, iKey$
  With Sheets("SCT")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = .Range("B3:F" & i).Value
  End With
  sRow = UBound(sArr)
  ReDim Res(1 To sRow, 1 To 1)
  Set Dic = CreateObject("scripting.dictionary")
  Nam = Year(sArr(1, 1))
  For i = 1 To sRow
    Ngay = sArr(i, 1)
    If Year(Ngay) <> Nam Then Dic.RemoveAll
    Nhom = sArr(i, 5)
    iKey = Nhom & Ngay
    If Dic.exists(Nhom) = False Then
      Dic.Add Nhom, 1
      Dic.Add iKey, ""
    Else
      If Dic.exists(iKey) = False Then
        Dic.Add iKey, ""
        Dic.Item(Nhom) = Dic.Item(Nhom) + 1
      End If
    End If
    Res(i, 1) = Mid(Nam, 3, 2) & Nhom & Format(Dic.Item(Nhom), "000") & "/" & Format(Month(Ngay), "00")
  Next i
  Sheets("SCT").Range("E3").Resize(sRow) = Res
End Sub
Một lần nữa em cảm ơn anh @HieuCD thật nhiều đã giúp đỡ.
Em có chạy code anh viết kết quả gần như hoàn hảo rồi ạ, chỉ có một lỗi duy nhất là số năm (lấy 2 ký tự năm) chưa được chuẩn cho năm, ví dụ như ở ô J8821 đúng ra phải trả về kết quả là: "17BC001/01" thay vì là "16BC001/01" như hiện tại, tương tự cho các ô còn lại của năm 2017 và các năm còn lại:

1582732482216.png

Mong anh xem thêm giúp. Em cảm ơn Anh !
 

File đính kèm

  • Hoi_DanhSoCT_Test.xlsb
    239.3 KB · Đọc: 9
Một lần nữa em cảm ơn anh @HieuCD thật nhiều đã giúp đỡ.
Em có chạy code anh viết kết quả gần như hoàn hảo rồi ạ, chỉ có một lỗi duy nhất là số năm (lấy 2 ký tự năm) chưa được chuẩn cho năm, ví dụ như ở ô J8821 đúng ra phải trả về kết quả là: "17BC001/01" thay vì là "16BC001/01" như hiện tại, tương tự cho các ô còn lại của năm 2017 và các năm còn lại:

View attachment 232536

Mong anh xem thêm giúp. Em cảm ơn Anh !
Thêm dòng lệnh gán năm mới
Mã:
Sub SoChungTu()
  Dim sArr(), Res() As String, Dic As Object
  Dim i&, sRow&
  Dim Nam&, Ngay As Date, Nhom$, iKey$
  With Sheets("SCT")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = .Range("B3:F" & i).Value
  End With
  sRow = UBound(sArr)
  ReDim Res(1 To sRow, 1 To 1)
  Set Dic = CreateObject("scripting.dictionary")
  Nam = Year(sArr(1, 1))
  For i = 1 To sRow
    Ngay = sArr(i, 1)
    If Year(Ngay) <> Nam Then
      Dic.RemoveAll
      Nam = Year(Ngay)
    End If
    Nhom = sArr(i, 5)
    iKey = Nhom & Ngay
    If Dic.exists(Nhom) = False Then
      Dic.Add Nhom, 1
      Dic.Add iKey, ""
    Else
      If Dic.exists(iKey) = False Then
        Dic.Add iKey, ""
        Dic.Item(Nhom) = Dic.Item(Nhom) + 1
      End If
    End If
    Res(i, 1) = Mid(Nam, 3, 2) & Nhom & Format(Dic.Item(Nhom), "000") & "/" & Format(Month(Ngay), "00")
  Next i
  Sheets("SCT").Range("E3").Resize(sRow) = Res
End Sub
 
Thêm dòng lệnh gán năm mới
Mã:
Sub SoChungTu()
  Dim sArr(), Res() As String, Dic As Object
  Dim i&, sRow&
  Dim Nam&, Ngay As Date, Nhom$, iKey$
  With Sheets("SCT")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 3 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = .Range("B3:F" & i).Value
  End With
  sRow = UBound(sArr)
  ReDim Res(1 To sRow, 1 To 1)
  Set Dic = CreateObject("scripting.dictionary")
  Nam = Year(sArr(1, 1))
  For i = 1 To sRow
    Ngay = sArr(i, 1)
    If Year(Ngay) <> Nam Then
      Dic.RemoveAll
      Nam = Year(Ngay)
    End If
    Nhom = sArr(i, 5)
    iKey = Nhom & Ngay
    If Dic.exists(Nhom) = False Then
      Dic.Add Nhom, 1
      Dic.Add iKey, ""
    Else
      If Dic.exists(iKey) = False Then
        Dic.Add iKey, ""
        Dic.Item(Nhom) = Dic.Item(Nhom) + 1
      End If
    End If
    Res(i, 1) = Mid(Nam, 3, 2) & Nhom & Format(Dic.Item(Nhom), "000") & "/" & Format(Month(Ngay), "00")
  Next i
  Sheets("SCT").Range("E3").Resize(sRow) = Res
End Sub
Dạ, kết quả đúng rồi ạ. Em cảm ơn Anh thật nhiều !
 
Em cảm ơn Anh thật nhiều đã giúp!
Em kiểm tra thử thì thấy kết quả chưa được ổn lắm, ví dụ:
Mong anh xem thêm giúp, em cảm ơn Anh !
Sửa lại chút xíu:
Mã:
=IF(COUNTIFS($B$2:B3,B3,$F$2:F3,F3),H2,IF(COUNTIFS($F$2:F3,F3,$G$2:G3,G3)=1,1,LOOKUP(2,1/($F$2:F2=F3),$H$2:H2)+1))
 
các ac cho e xin tí công thức với ạ
 

File đính kèm

  • Book1.xlsx
    10 KB · Đọc: 3
Web KT
Back
Top Bottom