Đánh STT theo nhiều điều kiện

  • Thread starter Thread starter Thien
  • Ngày gửi Ngày gửi
Liên hệ QC

Thien

Thành viên thường trực
Tham gia
23/6/06
Bài viết
352
Được thích
113
Chào các bạn.

Mình đang gặp nhiều khó khăn trong việc đánh số thứ tự theo file đính kèm.
Sẽ có nhiều người nói mình sử dụng TK không hợp lý nhưng ở đây xin miễn bàn mà vui lòng giúp Tôi đánh số thứ tự theo quy luật sao:
- TK 5111, 5113, 3388, 331 nếu có số đuôi là 3C, CH, NH, CT thì sẽ đánh STT theo thứ tự từ trên xuống (44GS0607 : phần GS0607 sẽ thay đổi theo tháng).
- Các TK còn lại sẽ được đánh số thứ tự theo từng tài khoản.
(vui lòng xem qua file gửi kèm).

Hiện tại nếu dùng công thức thì Tôi đã phải sử dụng rất nhiều cột phụ để làm (Rất phi khoa học & dở).
Nếu dùng VBA thì đang không biết làm.

Mong các bạn giành ít thời gian giúp tôi, việc này đang rất cần mà khối lượng công việc lớn cần giải quyết gấp.

Chân thành cảm ơn.

Thân chào.
 

File đính kèm

Thien đã viết:
Chào các bạn.

Mình đang gặp nhiều khó khăn trong việc đánh số thứ tự theo file đính kèm.
Sẽ có nhiều người nói mình sử dụng TK không hợp lý nhưng ở đây xin miễn bàn mà vui lòng giúp Tôi đánh số thứ tự theo quy luật sao:
- TK 5111, 5113, 3388, 331 nếu có số đuôi là 3C, CH, NH, CT thì sẽ đánh STT theo thứ tự từ trên xuống (44GS0607 : phần GS0607 sẽ thay đổi theo tháng).
- Các TK còn lại sẽ được đánh số thứ tự theo từng tài khoản.
(vui lòng xem qua file gửi kèm).

Hiện tại nếu dùng công thức thì Tôi đã phải sử dụng rất nhiều cột phụ để làm (Rất phi khoa học & dở).
Nếu dùng VBA thì đang không biết làm.

Mong các bạn giành ít thời gian giúp tôi, việc này đang rất cần mà khối lượng công việc lớn cần giải quyết gấp.

Chân thành cảm ơn.

Thân chào.

Tớ chưa hiểu mục đích cả nó là gì cả ??? Có thể nói rõ hơn hoặc cho một ít VD được không ??

Rồi các cột có ý nghĩa gì, tớ chỉ biết mỗi cột đầu tiên là NGÀY--=0

Có phải là đánh số TT của Chứng từ ghi sổ không ???

Thân!
 
Upvote 0
Thien đã viết:
Chào các bạn.

Mình đang gặp nhiều khó khăn trong việc đánh số thứ tự theo file đính kèm.
Sẽ có nhiều người nói mình sử dụng TK không hợp lý nhưng ở đây xin miễn bàn mà vui lòng giúp Tôi đánh số thứ tự theo quy luật sao:
- TK 5111, 5113, 3388, 331 nếu có số đuôi là 3C, CH, NH, CT thì sẽ đánh STT theo thứ tự từ trên xuống (44GS0607 : phần GS0607 sẽ thay đổi theo tháng).
- Các TK còn lại sẽ được đánh số thứ tự theo từng tài khoản.
(vui lòng xem qua file gửi kèm).
Bạn xem lại yêu cầu đánh số thứ tự mã tài khoản trong File của bạn vì tôi thấy có một vài chỗ khó hiểu như sau:
+Trong dòng đầu tiên: Mã tài khoản 5113MB3C thỏa mãn yêu cầu là TK 511.3 và tận cùng là 3C lẽ ra phải được đánh số thứ tự là 1GS0607 nhưng trong File của bạn lại đánh là 1M ? ...
+ Các tài khoản còn lại bạn nêu quy luật đánh mã chưa rõ nên gây rất nhiều khó khăn cho việc viết Code VBA


 
Upvote 0
Dear All.
Thành thật xin lỗi do gấp quá không nói rõ nên gây khó khăn trong việc viết code. Mình xin bổ sung như sau:
- Cột A là ngày, cột B là cột đánh STT, cột C là cột mã TK.
- Những TK sau sẽ đánh số TT theo từng TK 5113D-3C, 5113D-CH, 5113MB3C, 5113MBCH, 5113QC-3C, 5113QC-CH, 5113TKE3C,5113TKECH, 333113C, 33311CH, 33311CTY.
Lưu ý: khi dòng 1 là 5113MB3C được đánh STT là 1M thì dòng 333113C kế tiếp cũng sẽ đánh STT 1M.
- Các TK còn lại sẽ Đánh STT từ trên xuống dưới với ví dụ: 3GS0607
+ Số 3 là thứ tự thứ 3.
+ 0607 là tháng & năm của Cột A.

Mong các bạn thông cảm.

Thân chào
 
Upvote 0
Mời bạn dùng thử file sau
 

File đính kèm

Upvote 0
Dear nvson
Thật không biết cảm ơn bạn thế nào. Bạn đã giúp mình giải quyết nhanh công việc.

Anh cho hỏi 1 chút nếu muốn đánh STT ở cột B thì phải chỉnh lại thông số ở Offset(0, 1) phải không?.

Chân thành cảm ơn.
Thân chào.
 
Upvote 0
Đúng rồi đó bạn ạ.
Bạn thay đổi hết Offset(X, 1) = Offset(X, -1)
Mã:
Public Sub DanhSTT_2()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Dim cell_i
Dim dem As Long, demD As Long, demM As Long, demQ As Long, demT As Long, demCTY As Long
Dim dem_i As Long, k As Long
For Each cell_i In Range("C5:C" & Range("C5536").End(xlUp).Row)
    Select Case UCase(cell_i)
        Case "5113D-3C", "5113D-CH"
            demD = demD + 1
            cell_i.Offset(0, -1).Value = demD & "D"
        Case "5113MB3C", "5113MBCH"
            demM = demM + 1
            cell_i.Offset(0, -1).Value = demM & "M"
        Case "5113QC-3C", "5113QC-CH"
            demQ = demQ + 1
            cell_i.Offset(0, -1).Value = demQ & "Q"
        Case "5113TKE3C", "5113TKECH"
            demT = demT + 1
            cell_i.Offset(0, -1).Value = demT & "T"
        Case "5111CTY", "33311CTY"
            demCTY = demCTY + 1
            cell_i.Offset(0, -1).Value = demCTY & "CTY"
            
        Case "333113C", "33311CH", "33311CTY"
            If UCase(cell_i.Offset(-1, 0)) = "5113D-3C" Or UCase(cell_i.Offset(-1, 0)) = "5113D-CH" Or UCase(cell_i.Offset(-1, 0)) = "5113MB3C" Or UCase(cell_i.Offset(-1, 0)) = "5113MBCH" Or UCase(cell_i.Offset(-1, 0)) = "5113QC-3C" Or UCase(cell_i.Offset(-1, 0)) = "5113QC-CH" Or UCase(cell_i.Offset(-1, 0)) = "5113TKE3C" Or UCase(cell_i.Offset(-1, 0)) = "5113TKECH" Then
                k = 1
                Do
                    k = k + 1
                Loop While UCase(cell_i.Offset(-k, 0).Value) = UCase(cell_i.Offset(-1, 0).Value)
                cell_i.Offset(0, -1).Value = cell_i.Offset(-k + 1, -1).Value
            Else
                If UCase(cell_i.Value) = UCase(cell_i.Offset(-1, 0).Value) Then
                    cell_i.Offset(0, -1).Value = Val(cell_i.Offset(-1, -1).Value) + 1 & Right(cell_i.Offset(-1, -1).Value, Len(cell_i.Offset(-1, -1).Value) - Len(CStr(Val(cell_i.Offset(-1, -1).Value))))
                End If
            End If
        Case ""
        Case Else
            dem = dem + 1
            cell_i.Offset(0, -1).Value = dem & "GS" & Format(Month(cell_i.Offset(0, -2).Value), "00") & Right(Year(cell_i.Offset(0, -2).Value), 2)
    End Select
Next cell_i
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Tôi có một file cấu trúc như sau:
Ngay-----LoaiCT---SoCtGoc---SoCT
01/10/07----PT-----A123-----PT07/10/001
------------PT-----A124-----PT07/10/002
Trong đó Ngay---LoaiCT---SoCtGoc là nhập vào.
Tôi muốn SoCT sẽ đánh số như sau: PT07/10/001..."PT" là loại CT, theo như file kèm.
- Nếu lọai CT như nhau, ngày = nhau, SoCtGoc = nhau thì SoCt như nhau.
- Nếu lọai CT như nhau, ngày <> nhau or SoCtGoc <> nhau thì SoCt lấy max
Nếu sang tháng khác thì SoCT trở về 1.
Nhờ các bạn làm 1 Sub, hay tốt hơn là Function. Cám ơn nhiều.
 

File đính kèm

Upvote 0
ThuNghi đã viết:
Nhờ các bạn làm 1 Sub, hay tốt hơn là Function. Cám ơn nhiều.

Theo ý em thì nên dùng Sub, vì dùng Function thì tới đâu có tới đó, nhưng Record nhiều, từ 1000 trở lên là bác đã mệt rồi, vì nó phải quét toàn bộ Data mà.
 
Upvote 0
Thì about 1000 record, tại vì dùng ct mảng thì nặng, hy vọng dùng VBA nhẹ hơn. Dùng Sub cũng được. Có cái Function nào mà khi đánh xong thì tự đưa về giá trị? VD: sum(A1:A2)=3 thì hiện ra luôn là 3 chớ không hiện sum(A1:A2), a1=1; a2=2. Không dùng change.
 
Upvote 0
Bác ThuNghi thử đoạn code sau:
Mã:
Option Explicit
Public Sub DanhSTT()
On Error Resume Next
Dim i As Long, j As Long
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
For i = 2 To Cells(65536, "B").End(xlUp).Row
    If Cells(i, "B").Value <> Cells(i - 1, "B").Value Then
        For j = i - 1 To 2 Step -1
            If Cells(j, "B").Value = Cells(i, "B").Value Then Exit For
        Next j
        Cells(i, "D").Value = Cells(i, "B").Value & Right(Year(Cells(i, "A").Value), 2) & "/" & Month(Cells(i, "A").Value) & "/" & Format(Val(Right(Cells(j, "D").Value, 3)) + 1, "000")
    ElseIf Cells(i, "A").Value = Cells(i - 1, "A").Value And Cells(i, "C").Value = Cells(i - 1, "C").Value Then
        Cells(i, "D").Value = Cells(i - 1, "D").Value
    Else
        Cells(i, "D").Value = Cells(i, "B").Value & Right(Year(Cells(i, "A").Value), 2) & "/" & Month(Cells(i, "A").Value) & "/" & Format(Val(Right(Cells(i - 1, "D").Value, 3)) + 1, "000")
 
    End If
Next i
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
(Nếu OK thì coi đó là quà mừng SN bác nhé!)
 
Upvote 0
Anh nvson oi, cái này chưa đúng trong mấy trường hợp cuối. các sô lớn hơn = 1000

P/S. àh , không phải, sang tháng mới thì phải bắt đầu lại.
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn, bạn bổ sung thêm giúp.
NVSON ơi, sang tháng mới thì TT lại về 1, với lại nên dùng sự kiện gì để khi cột A, B, C có dữ liệu thì D tự động số TT.
Thêm phần này, nếu Di là TxtSoCT trong form thì làm thế nào lấy SoCT max theo điều kiện trên.
 
Lần chỉnh sửa cuối:
Upvote 0
Bác tải file sau nhé!
Khi muốn đánh số chứng từ toàn bộ thì chạy Macro DanhCT_ALL
Khi nhập dữ liệu trong vùng A:C thì sẽ tự đánh số Chứng từ.
 

File đính kèm

Upvote 0
Gấp quá cho sen 1 chút.
Tôi có hàm này
Mã:
Function NgayThangNam(ByVal bDate As Date) As String
Dim Ngay As Byte, Thang As Byte
Dim Nam As Integer
Ngay = Day(Date)
Thang = Month(Date)
Nam = Year(Date)
NgayThangNam = "Ngaøy " & Ngay & " thaùng " & Thang & " naêm " & Nam
End Function
.

Nhưng nó chỉ đọc ngày date thôi. Tôi muốn nó sẽ đọc đúng ngay ô chứa ngày mình chọn. (ví dụ: 10/01/06 sẽ ra Ngày 10 tháng 01 năm 2006).

Bạn giúp nhé.

Thân chào.
 
Upvote 0
To Thien:
Bạn sửa lại chút xíu:
Mã:
....
Ngay = Day(bDate)
Thang = Month(bDate)
Nam = Year(bDate)
....

To ThuNghi:
ThuNghi đã viết:
Còn cái này để làm gì vậy.
Bác đọc bài #14 nhé!
 
Upvote 0
Thiện sửa lại, khai NgayThangNam(ByVal bDate As Date) As String
Ngay = Day(bDate)
Thang = Month(bDate)
Nam = Year(bDate)
 
Upvote 0
Hiểu rồi do DanhSTT khác Public Sub DanhCT(dong1, dong2).
Cám ơn nhiều.
 
Upvote 0
Các bạn cho hỏi thêm một chút.
Ở những dòng đã có số thứ tự thì giữ nguyên còn những dòng không có thì dùng code của nvson.

Loai hoai cải tiến code của nvson hoài không được.

Các bạn giúp nhé.

Thân chào.
 
Upvote 0
Web KT

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

Back
Top Bottom