Đánh số phiếu nhập xuất theo tháng (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Tham gia
17/9/12
Bài viết
1,351
Được thích
1,575
Giới tính
Nữ
Em có file như đính kèm ạ. E muốn đánh lại số phiếu nhập xuất theo ngày tháng để có thể xem luôn đó là phiếu nhập, xuất thứ mấy trong tháng mấy
VD phiếu nhập đầu của tháng 1 sẽ có dạng PN1 - 001
phiếu nhập đầu của tháng 2 sẽ có dạng PN2 - 001

em có thử viết code nhưng do kiến thức còn hạn hẹp nên e vẫn chưa giải quyết được. Kính mong ACE diễn đàn giúp đỡ ạ. E chân thành cảm ơn ạ
 

File đính kèm

Em có file như đính kèm ạ. E muốn đánh lại số phiếu nhập xuất theo ngày tháng để có thể xem luôn đó là phiếu nhập, xuất thứ mấy trong tháng mấy
VD phiếu nhập đầu của tháng 1 sẽ có dạng PN1 - 001
phiếu nhập đầu của tháng 2 sẽ có dạng PN2 - 001

em có thử viết code nhưng do kiến thức còn hạn hẹp nên e vẫn chưa giải quyết được. Kính mong ACE diễn đàn giúp đỡ ạ. E chân thành cảm ơn ạ
Ngủ sớm thế :)
 

File đính kèm

Upvote 0
Mình góp với chủ bài đăng vài điều trước khi tiếp tục:

(1) Mã số phiếu nên có độ dài như nhau; như vậy thay vì ..2_001, ta nên là ..02001
(2) Trong các mã mà bạn đã, đang & sẽ tạo thành trùng rất nhiều kí tự "P" & "-" không cần thiết;
Ta nên chăng '02N002' sẽ phản ảnh phiếu nhập thứ 2 trong tháng hai;
Như vậy '03X003' sẽ là phiếu xuất thứ 3 trong tháng ba
. . . . .
Có như vậy thì:
Nếu cần biết đó là phiếu xuất hay nhập thay vì như bạn, ta phải đến 2 kí tự đầu của mã phiếu, ta chỉ cần đến kí tự thứ 3 trong mã mà thôi;
(Bạn thấy suy nghĩ này sẽ tiết kiệm công sức của máy của bạn chưa?)

Ngoài ra bạn chưa nêu đến trường hợp sang năm khác sẽ ra sao? Đừng nói với tôi là CSDL này chỉ xài trong năm, năm mới xài cái mới, nha!
Vì trên ví dụ cho thấy cơ sở này không mấy nhiều phiếu trong 1 tháng

Nếu cần thêm kí tự trong mã phiếu để chỉ thị theo năm mình có cách sau:
Ta thêm ngay vô đầu mã phiếu 1 kí tự hay kí số chỉ năm; Ví dụ năm 2017 ta thêm con '7' vô; . . . Đến năm 2020 ta thêm 'A' vô.
Như vậy số phiếu nhập đầu tháng 10/2018 sẽ là '810N001'
Còn nếu là tôi, thì 3 kí tự số đầu của mã này tôi sẽ thay bỡi 2 kí tự thôi, đó là 8A; trong đó con 8 chỉ năm, 'A' ứng với tháng 10
Bạn có thể cho là làm thế phức tạp quá; Tất nhiên những phức tạp này ta chỉ suy nghĩ & tạo ra 1 macro xài 1 lần cho cả cuộc đời "binh nghiệp" của bạn hay hơn nữa, không đáng sao!?!

Chúc ngày làm việc hiệu quả cho toàn thể mọi người!
 
Upvote 0
Mình góp với chủ bài đăng vài điều trước khi tiếp tục:

(1) Mã số phiếu nên có độ dài như nhau; như vậy thay vì ..2_001, ta nên là ..02001
(2) Trong các mã mà bạn đã, đang & sẽ tạo thành trùng rất nhiều kí tự "P" & "-" không cần thiết;
Ta nên chăng '02N002' sẽ phản ảnh phiếu nhập thứ 2 trong tháng hai;
Như vậy '03X003' sẽ là phiếu xuất thứ 3 trong tháng ba
. . . . .
Có như vậy thì:
Nếu cần biết đó là phiếu xuất hay nhập thay vì như bạn, ta phải đến 2 kí tự đầu của mã phiếu, ta chỉ cần đến kí tự thứ 3 trong mã mà thôi;
(Bạn thấy suy nghĩ này sẽ tiết kiệm công sức của máy của bạn chưa?)

Ngoài ra bạn chưa nêu đến trường hợp sang năm khác sẽ ra sao? Đừng nói với tôi là CSDL này chỉ xài trong năm, năm mới xài cái mới, nha!
Vì trên ví dụ cho thấy cơ sở này không mấy nhiều phiếu trong 1 tháng

Nếu cần thêm kí tự trong mã phiếu để chỉ thị theo năm mình có cách sau:
Ta thêm ngay vô đầu mã phiếu 1 kí tự hay kí số chỉ năm; Ví dụ năm 2017 ta thêm con '7' vô; . . . Đến năm 2020 ta thêm 'A' vô.
Như vậy số phiếu nhập đầu tháng 10/2018 sẽ là '810N001'
Còn nếu là tôi, thì 3 kí tự số đầu của mã này tôi sẽ thay bỡi 2 kí tự thôi, đó là 8A; trong đó con 8 chỉ năm, 'A' ứng với tháng 10
Bạn có thể cho là làm thế phức tạp quá; Tất nhiên những phức tạp này ta chỉ suy nghĩ & tạo ra 1 macro xài 1 lần cho cả cuộc đời "binh nghiệp" của bạn hay hơn nữa, không đáng sao!?!

Chúc ngày làm việc hiệu quả cho toàn thể mọi người!
Cảm ơn những góp ý của anh ạ. Thực ra do yêu cầu của từng đơn vị thì lại có cách đánh số khác nhau ạ, Mã này thực tế vẫn sẽ là PN01-001 nhưng do lúc làm file e quên chưa chèn phần đó vào, dữ liệu này làm mới từng năm, e chỉ cho vài dữ liệu vào để mong tìm đc cách tính ra phần hậu tố đằng sau phiếu nhập xuất ạ. Mong anh chỉ bảo thêm. Cảm ơn anh, chúc anh một ngày vui ạ
 
Upvote 0
Upvote 0
Cảm ơn những góp ý của anh ạ. Thực ra do yêu cầu của từng đơn vị thì lại có cách đánh số khác nhau ạ, Mã này thực tế vẫn sẽ là PN01-001 nhưng do lúc làm file e quên chưa chèn phần đó vào, dữ liệu này làm mới từng năm, e chỉ cho vài dữ liệu vào để mong tìm đc cách tính ra phần hậu tố đằng sau phiếu nhập xuất ạ. Mong anh chỉ bảo thêm. Cảm ơn anh, chúc anh một ngày vui ạ
Nếu không xét đến năm, chỉ còn điều kiện PN/PX, tháng, Số chứng từ thì thử chạy Sub này coi sao, kết quả không giống "Kết quả mong muốn" của bạn.
PHP:
Public Sub GPE()
Dim sArr(), dArr(), I As Long, R As Long, SCT As Long, Tem As String
sArr = Range("A2", Range("C2").End(xlDown)).Value
R = UBound(sArr): ReDim dArr(1 To R, 1 To 1)
With CreateObject("Scripting.Dictionary")
    For I = 1 To R
        Tem = sArr(I, 3) & Format(sArr(I, 1), "mm")
        If Not .Exists(Tem) Then
            .Add Tem, 1: SCT = sArr(I, 2)
        Else
            If sArr(I, 2) <> SCT Then
                .Item(Tem) = .Item(Tem) + 1: SCT = sArr(I, 2)
            End If
        End If
        dArr(I, 1) = Tem & "-" & Format(.Item(Tem), "000")
    Next I
End With
Range("E2").Resize(R) = dArr
End Sub
 
Upvote 0
Cũng bon chen 1 phen; Phương thức FIND() trong VBA thôi:
PHP:
Option Explicit
Sub TaoLaiSoFieu()
 Dim Rng As Range, sRng As Range, Cls As Range
 Dim MCT As String, Tmp As String, MyAdd As String, FCC As String

' Sheets("LeHuong").Select      '
 For Each Cls In Range([A2], [A2].End(xlDown))
    Set Rng = Range([f1], Cells(Cls.Row - 1, "F"))
    MCT = Right(Cls.Offset(, 2).Value, 1)
    Tmp = MCT & Right("0" & CStr(Month(Cls.Value)), 2)
    Set sRng = Rng.Find(Tmp, , xlFormulas, xlPart)
    If sRng Is Nothing Then
        Cells(Cls.Row, "F").Value = Tmp & "001"
    Else
        MyAdd = sRng.Address
        Do
            FCC = sRng.Value
            Set sRng = Rng.FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
        Cells(Cls.Row, "F").Value = Left(FCC, 3) & Right("00" & CStr(CInt(Right(FCC, 3)) + 1), 3)
    End If
 Next Cls
End Sub
 
Upvote 0
bạn chạy thử code
Mã:
Sub GPE()
Dim Darr(), Arr(), Tarr(1 To 12, 1 To 2), i As Long, Thang As Long, Col As Byte
Darr = Range("A1", Range("C" & Rows.Count).End(xlUp)).Value
ReDim Arr(1 To UBound(Darr), 1 To 1)
For i = 2 To UBound(Darr)
  Thang = Month(Darr(i, 1))
  If Darr(i, 1) = Darr(i - 1, 1) And Darr(i, 2) = Darr(i - 1, 2) And Darr(i, 3) = Darr(i - 1, 3) Then
    Arr(i - 1, 1) = Arr(i - 2, 1)
  Else
    If Darr(i, 3) = "PN" Then Col = 1 Else Col = 2
    Tarr(Thang, Col) = Tarr(Thang, Col) + 1
    Arr(i - 1, 1) = Darr(i, 3) & Format(Thang, "00") & "-" & Format(Tarr(Thang, Col), "000")
  End If
Next i
Range("E2").Resize(UBound(Darr)) = Arr
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu không xét đến năm, chỉ còn điều kiện PN/PX, tháng, Số chứng từ thì thử chạy Sub này coi sao, kết quả không giống "Kết quả mong muốn" của bạn.
PHP:
Public Sub GPE()
Dim sArr(), dArr(), I As Long, R As Long, SCT As Long, Tem As String
sArr = Range("A2", Range("C2").End(xlDown)).Value
R = UBound(sArr): ReDim dArr(1 To R, 1 To 1)
With CreateObject("Scripting.Dictionary")
    For I = 1 To R
        Tem = sArr(I, 3) & Format(sArr(I, 1), "mm")
        If Not .Exists(Tem) Then
            .Add Tem, 1: SCT = sArr(I, 2)
        Else
            If sArr(I, 2) <> SCT Then
                .Item(Tem) = .Item(Tem) + 1: SCT = sArr(I, 2)
            End If
        End If
        dArr(I, 1) = Tem & "-" & Format(.Item(Tem), "000")
    Next I
End With
Range("E2").Resize(R) = dArr
End Sub
Cháu cảm ơn chú ạ, code của chú chuẩn rồi ạ, sai là do cháu làm sai kết quả thôi ạ. Cháu sẽ tìm hiểu thêm về code này, có gì mong chú giải đáp thêm ạ.
 
Upvote 0
bạn chạy thử code
Mã:
Sub GPE()
Dim Darr(), Arr(), Tarr(1 To 12, 1 To 2), i As Long, Thang As Long, Col As Byte
Darr = Range("A2", Range("C" & Rows.Count).End(xlUp)).Value
ReDim Arr(1 To UBound(Darr), 1 To 1)
Thang = Month(Darr(1, 1))
If Darr(1, 3) = "PN" Then Col = 1 Else Col = 2
Tarr(Thang, Col) = 1
Arr(1, 1) = Darr(1, 3) & Format(Thang, "00") & "-001"
For i = 2 To UBound(Darr)
  Thang = Month(Darr(i, 1))
  If Darr(i, 1) = Darr(i - 1, 1) And Darr(i, 2) = Darr(i - 1, 2) And Darr(i, 3) = Darr(i - 1, 3) Then
    Arr(i, 1) = Arr(i - 1, 1)
  Else
    If Darr(i, 3) = "PN" Then Col = 1 Else Col = 2
    Tarr(Thang, Col) = Tarr(Thang, Col) + 1
    Arr(i, 1) = Darr(i, 3) & Format(Thang, "00") & "-" & Format(Tarr(Thang, Col), "000")
  End If
Next i
Range("E2").Resize(UBound(Darr)) = Arr
End Sub
Em cảm ơn anh Hiếu ạ, em ra đúng kết quả cần tìm rồi ạ :).
 
Upvote 0
Cũng bon chen 1 phen; Phương thức FIND() trong VBA thôi:
PHP:
Option Explicit
Sub TaoLaiSoFieu()
 Dim Rng As Range, sRng As Range, Cls As Range
 Dim MCT As String, Tmp As String, MyAdd As String, FCC As String

' Sheets("LeHuong").Select      '
 For Each Cls In Range([A2], [A2].End(xlDown))
    Set Rng = Range([f1], Cells(Cls.Row - 1, "F"))
    MCT = Right(Cls.Offset(, 2).Value, 1)
    Tmp = MCT & Right("0" & CStr(Month(Cls.Value)), 2)
    Set sRng = Rng.Find(Tmp, , xlFormulas, xlPart)
    If sRng Is Nothing Then
        Cells(Cls.Row, "F").Value = Tmp & "001"
    Else
        MyAdd = sRng.Address
        Do
            FCC = sRng.Value
            Set sRng = Rng.FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
        Cells(Cls.Row, "F").Value = Left(FCC, 3) & Right("00" & CStr(CInt(Right(FCC, 3)) + 1), 3)
    End If
 Next Cls
End Sub
Cảm ơn anh ạ, còn trường hợp các số chứng từ trùng nhau thì cùng chung số phiếu nữa anh ạ. Cảm ơn anh đã giúp đỡ ạ
 
Upvote 0
Web KT

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

Back
Top Bottom