quick87
(/ội...
- Tham gia
- 8/4/08
- Bài viết
- 387
- Được thích
- 362
- Giới tính
- Nam
Cột STT (cột G) xác định cách nào?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 !
Dạ, em cảm ơn anh đã quan tâm.Cột STT (cột G) xác định cách nào?
Cảm ơn bạn, điều mình mong muốn đúng như bạn nói.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
=YEAR(B3)
=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))
Em cảm ơn Anh thật nhiều đã 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:
H2:Mã:=YEAR(B3)
Copy xuống.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))
Bài nầy dùng công thức không đơn giản, dùng VBA nhàn hơnEm 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 !
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 đỡ.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
Thêm dòng lệnh gán năm mớiMộ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 !
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 !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
Sửa lại chút xí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 !
=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))