Code đánh số thứ tự có điều kiện

Liên hệ QC

LeHang.93

Thành viên chính thức
Tham gia
20/8/20
Bài viết
53
Được thích
9
Em có file như trên, giờ muốn đánh phiếu tự động thì code thế nào được, giúp em với ạ
 

File đính kèm

  • KToan2.xlsb
    17 KB · Đọc: 32
  • Untitled.jpg
    Untitled.jpg
    110.6 KB · Đọc: 48
Em có file như trên, giờ muốn đánh phiếu tự động thì code thế nào được, giúp em với ạ
1/ Bạn nên sửa tiêu đề thành: Giúp đánh số thứ tự có điều kiện.
2/ Để tôn trọng người giúp thì không nên viết tắt bạn nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
Em có file như trên, giờ muốn đánh phiếu tự động thì code thế nào được, giúp em với ạ
Bạn thử.
Mã:
Sub danhso()
    Dim arr, i As Long, lr As Long, kq, so As Long, dic As Object, dk As String, dks As String
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("data")
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         arr = .Range("D2:J" & lr).Value
         ReDim kq(1 To UBound(arr), 1 To 1)
         For i = 1 To UBound(arr)
             If arr(i, 7) = "chi" Then
                dk = "PC"
             ElseIf arr(i, 7) = "thu" Then
                dk = "PT"
             ElseIf arr(i, 7) = "nhap" Then
                dk = "PN"
             ElseIf arr(i, 7) = Empty Then
                dk = "PKT"
             Else
                dk = Empty
             End If
             If dk <> Empty Then
                   dks = dk & "#" & arr(i, 1) & "#" & arr(i, 2)
                If Not dic.exists(dk) Then
                   dic.Add dk, 1
                   dic.Item(dks) = 1
                   kq(i, 1) = dk & Format(1, "000")
                Else
                   so = dic.Item(dk)
                   If Not dic.exists(dks) Then
                      so = so + 1
                      dic.Add dks, ""
                   End If
                   kq(i, 1) = dk & Format(so, "000")
                   dic.Item(dk) = so
               End If
           End If
      Next i
         .Range("C2:C" & lr).Value = kq
 End With
End Sub
 
Upvote 0
Bạn thử.
Mã:
Sub danhso()
    Dim arr, i As Long, lr As Long, kq, so As Long, dic As Object, dk As String, dks As String
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("data")
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         arr = .Range("D2:J" & lr).Value
         ReDim kq(1 To UBound(arr), 1 To 1)
         For i = 1 To UBound(arr)
             If arr(i, 7) = "chi" Then
                dk = "PC"
             ElseIf arr(i, 7) = "thu" Then
                dk = "PT"
             ElseIf arr(i, 7) = "nhap" Then
                dk = "PN"
             ElseIf arr(i, 7) = Empty Then
                dk = "PKT"
             Else
                dk = Empty
             End If
             If dk <> Empty Then
                   dks = dk & "#" & arr(i, 1) & "#" & arr(i, 2)
                If Not dic.exists(dk) Then
                   dic.Add dk, 1
                   dic.Item(dks) = 1
                   kq(i, 1) = dk & Format(1, "000")
                Else
                   so = dic.Item(dk)
                   If Not dic.exists(dks) Then
                      so = so + 1
                      dic.Add dks, ""
                   End If
                   kq(i, 1) = dk & Format(so, "000")
                   dic.Item(dk) = so
               End If
           End If
      Next i
         .Range("C2:C" & lr).Value = kq
End With
End Sub


Anh ơi cho em hỏi, để dòng ngày tháng =0 thì ko hiện phiếu vào + đánh số dựa theo chỉ tiêu" ngày ghi sổ" thì cần chỉnh code nào ạ
 
Upvote 0
Em có file như trên, giờ muốn đánh phiếu tự động thì code thế nào được, giúp em với ạ
Bài này còn nhiều vấn đề
1/ Data bố trí chưa chuẩn như sau:
- Thực tế nên có định khoản như 111, 152, 153, 154 ... từ đó người ta xác định được nó là phiếu thu - chi- nhập hay xuất, nên việc nhập thêm ở cột J là thừa
- Giả sử một ngày nào đó sẽ có 2 hóa đơn xyz của 2 nhà cung cấp khác nhau mà cùng ra phiếu chi ở cùng 1 thời điểm thì sao? Nên có 1 cột mã khách hàng
...
 
Upvote 0
Bạn thử.
Mã:
Sub danhso()
    Dim arr, i As Long, lr As Long, kq, so As Long, dic As Object, dk As String, dks As String
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("data")
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         arr = .Range("D2:J" & lr).Value
         ReDim kq(1 To UBound(arr), 1 To 1)
         For i = 1 To UBound(arr)
             If arr(i, 7) = "chi" Then
                dk = "PC"
             ElseIf arr(i, 7) = "thu" Then
                dk = "PT"
             ElseIf arr(i, 7) = "nhap" Then
                dk = "PN"
             ElseIf arr(i, 7) = Empty Then
                dk = "PKT"
             Else
                dk = Empty
             End If
             If dk <> Empty Then
                   dks = dk & "#" & arr(i, 1) & "#" & arr(i, 2)
                If Not dic.exists(dk) Then
                   dic.Add dk, 1
                   dic.Item(dks) = 1
                   kq(i, 1) = dk & Format(1, "000")
                Else
                   so = dic.Item(dk)
                   If Not dic.exists(dks) Then
                      so = so + 1
                      dic.Add dks, ""
                   End If
                   kq(i, 1) = dk & Format(so, "000")
                   dic.Item(dk) = so
               End If
           End If
      Next i
         .Range("C2:C" & lr).Value = kq
End With
End Sub
Không hiểu bạn cho ví dụ cụ thể nhé.
 
Upvote 0
Chỗ xác định loại phiếu có thể làm vầy.

PHP:
Sub vidu()
    Const chuoi_ktra = "chithu nhap"
    Const chuoi_kqua = "PCPTPN"
    Dim idex As Long, loai As String
    
    For i = 1 To UBound(arr)
        loai = arr(i, 7)
        If Len(loai) = 0 Then
            dk = "PKT"
        Else
            idex = InStr(1, chuoi_ktra, loai, vbTextCompare)
            If idex > 0 Then dk = Mid(chuoi_kqua, Fix(idex / 2) + 1, 2)
        End If
        If Len(dk) > 0 Then
            'dks=
            '...
        End If
    Next i
End Sub
 
Upvote 0
Chỗ xác định loại phiếu có thể làm vầy.

PHP:
            idex = InStr(1, chuoi_ktra, loai, vbTextCompare)
            If idex > 0 Then dk = Mid(chuoi_kqua, Fix(idex / 2) + 1, 2)
chuoi_ktra thì cần InStr nên để nguyên chuỗi là phải. Nhưng bên kqua thì cứ mỗi lần tính lại làm con toán tách chuỗi?

Const chuoi_ktra = "chi~thu~nhap"
Const chuoi_Span = 4
aKqua = VBA.Array("", "PC", "PT", "PN") ' tiếp đầu VBA bảo đảm array bắt đầu bằng chỉ số 0, không bị ảnh hưởng của Option

dk = aKqua((InStr(1, chuoi_ktra, loai, vbTextCompare)-1+chuoi_Span) \ chuoi_Span)
 
Upvote 0
Bài này còn nhiều vấn đề
1/ Data bố trí chưa chuẩn như sau:
- Thực tế nên có định khoản như 111, 152, 153, 154 ... từ đó người ta xác định được nó là phiếu thu - chi- nhập hay xuất, nên việc nhập thêm ở cột J là thừa
- Giả sử một ngày nào đó sẽ có 2 hóa đơn xyz của 2 nhà cung cấp khác nhau mà cùng ra phiếu chi ở cùng 1 thời điểm thì sao? Nên có 1 cột mã khách hàng
...
Em có công thức tự động nhảy các loại phiếu rồi a
Cái bảng này em chỉ xin code cơ bản để về tự gép thôi a, bản của em vẫn có mục mã KH ạ
Bài đã được tự động gộp:

Không hiểu bạn cho ví dụ cụ thể nhé.
Bản code đang có tình trạng những dòng trống không có dữ liệu thì vẫn bị nhập PKT ạ
Riêng về ngày ghi sổ, nếu ngày ghi sau nhưng dòng lại nằm trước thì số phiếu lại nhỏ hơn ạ. Code em mong muốn là nó sẽ đánh phiếu ko quan tâm vị trí dòng mà quan tâm ngày ghi sổ để đánh số ạ
Bài đã được tự động gộp:

Chỗ xác định loại phiếu có thể làm vầy.

PHP:
Sub vidu()
    Const chuoi_ktra = "chithu nhap"
    Const chuoi_kqua = "PCPTPN"
    Dim idex As Long, loai As String
   
    For i = 1 To UBound(arr)
        loai = arr(i, 7)
        If Len(loai) = 0 Then
            dk = "PKT"
        Else
            idex = InStr(1, chuoi_ktra, loai, vbTextCompare)
            If idex > 0 Then dk = Mid(chuoi_kqua, Fix(idex / 2) + 1, 2)
        End If
        If Len(dk) > 0 Then
            'dks=
            '...
        End If
    Next i
End Sub
code này là cho đoạn nào anh ? em gép vào đâu được
Bài đã được tự động gộp:

Cách làm của bạn không ổn, nên thuê công ty dịch vụ kế toán hướng dẫn toàn bộ quy trình hạch toán
cái này là 1 phần của biểu của em ạ, để e xin code cơ bản thôi ko mất công mọi người ạ
 
Upvote 0
Bài này còn nhiều vấn đề
1/ Data bố trí chưa chuẩn như sau:
- Thực tế nên có định khoản như 111, 152, 153, 154 ... từ đó người ta xác định được nó là phiếu thu - chi- nhập hay xuất, nên việc nhập thêm ở cột J là thừa
Cột J là loại chứng từ và không hề thừa. Vấn đề ở chỗ nó nên là 1 List chọn để không sai sót khi gõ tay. Thêm cột định khoản rồi code nào đọc định khoản ra PC, PT, PN, ...? Người kế toán giỏi còn phải đọc bằng mắt và xác định bằng trí nhớ, chứ excel nào biết kế toán?
 
Upvote 0
Cột J là loại chứng từ và không hề thừa. Vấn đề ở chỗ nó nên là 1 List chọn để không sai sót khi gõ tay. Thêm cột định khoản rồi code nào đọc định khoản ra PC, PT, PN, ...? Người kế toán giỏi còn phải đọc bằng mắt và xác định bằng trí nhớ, chứ excel nào biết kế toán?
đúng bác, nếu căn cứ nợ có để xác định loại phiếu dẫn tới khó phức tạp và tùy biến cho người dùng ko am hiểu code, vì vậy loại phiếu sẽ được tạo list riêng cho kế toán tùy biến ạ
 
Upvote 0
đúng bác, nếu căn cứ nợ có để xác định loại phiếu dẫn tới khó phức tạp và tùy biến cho người dùng ko am hiểu code, vì vậy loại phiếu sẽ được tạo list riêng cho kế toán tùy biến ạ
Vậy nên tạo list bằng đúng với tiền tồ số phiếu luôn (list = PT, PC, PN, PX, ...)
 
Upvote 0
Cột J là loại chứng từ và không hề thừa. Vấn đề ở chỗ nó nên là 1 List chọn để không sai sót khi gõ tay. Thêm cột định khoản rồi code nào đọc định khoản ra PC, PT, PN, ...? Người kế toán giỏi còn phải đọc bằng mắt và xác định bằng trí nhớ, chứ excel nào biết kế toán?
Em vẫn dùng số tài khoản mà đã định khoản ở 2 cột để xác định nó là loại phiếu gì
 
Upvote 0
Em vẫn dùng số tài khoản mà đã định khoản ở 2 cột để xác định nó là loại phiếu gì
Em biết vì em là kế toán giỏi và thuộc định khoản. Nhưng em thử dùng công thức đánh số phiếu có tiếp đầu ngữ PT, PC, ... xem có dễ không? Nếu em không biết VBA và nhờ giúp như chủ đề này, người muốn giúp không biết kế toán họ sẽ nói sao?
 
Upvote 0
Thông thường thì người viết code không biết kế toán nhưng chủ thớt đưa Data thật và mô tả rỏ ràng thì người giúp vẫn nhận biết được
Cái này tôi không tin. Dữ liệu thật chỉ là dữ liệu nhất thời. Người làm việc với code mà không nghĩ đến chuyện lâu dài là người code ẩu.
Trước mắt là tôi biết cả kế toán lẫn code mà cái này tôi nhận biết không nổi:
- cứ mỗi lần chạy code thì các số phiếu lại khởi đầu từ 001.
- sau một thời gian, ta có một đống phiếu PT001's ?

Trước khi code cần phải hỏi: chuyện này xảy ra bao lâu một lần, và cái số phiếu ghi được ấy dùng để làm gì?
 
Upvote 0
Em vẫn dùng số tài khoản mà đã định khoản ở 2 cột để xác định nó là loại phiếu gì
Vẫn được ạ, nhưng trong trường hợp chuyển sang công ty mới, stk khác thì sẽ rất khó khăn cho việc update lại. Thứ 2 là dẫn đến các hàm và báo cáo
Cái này tôi không tin. Dữ liệu thật chỉ là dữ liệu nhất thời. Người làm việc với code mà không nghĩ đến chuyện lâu dài là người code ẩu.
Trước mắt là tôi biết cả kế toán lẫn code mà cái này tôi nhận biết không nổi:
- cứ mỗi lần chạy code thì các số phiếu lại khởi đầu từ 001.
- sau một thời gian, ta có một đống phiếu PT001's ?

Trước khi code cần phải hỏi: chuyện này xảy ra bao lâu một lần, và cái số phiếu ghi được ấy dùng để làm gì?
Dạ cái này dùng cho dịch vụ kế toán ạ, sau cả năm làm cuối năm chạy lại phiếu để in chứng từ ạ
 
Upvote 0
nhưng trong trường hợp chuyển sang công ty mới, stk khác thì sẽ rất khó khăn cho việc update lại. Thứ 2 là dẫn đến các hàm và báo cáo
Cái này tôi chưa hiểu
Không biết là bạn làm dịch vụ như thế nào?
Nhận hồ sơ các cty về làm hay lập file kế toán theo yêu cầu rồi chuyển cho họ tự làm?
 
Upvote 0
Web KT

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

Back
Top Bottom