DMQ
Thành viên dốt
- Tham gia
- 21/3/12
- Bài viết
- 713
- Được thích
- 54
- Giới tính
- Nam
.Mong thầy @VetMini chỉnh lại code dùm em ạ. Ví dụ em có 950 dòng đã chạy code lấy số phiếu xong rồi, sang hôm sau em nhập liệu 5 dòng tiếp, thì code chỉ chạy 5 dòng mới nhập thôi ạ, chư không chạy 955 dòng luôn ạ.
Thử hàm UDF này xem.Mong thầy @VetMini chỉnh lại code dùm em ạ. Ví dụ em có 950 dòng đã chạy code lấy số phiếu xong rồi, sang hôm sau em nhập liệu 5 dòng tiếp, thì code chỉ chạy 5 dòng mới nhập thôi ạ, chư không chạy 955 dòng luôn ạ.
Function DocNo(Rng As Range) As String
Dim Arr2(), d&, Lr&, W&, F&, Ngay, Thang, key
Dim Sh As Worksheet, DicDN As Object
Set Sh = Sheets("Issue")
Lr = Rng.Row
Set DicDN = CreateObject("Scripting.Dictionary")
For W = 2 To Lr
If Sh.Cells(W, 3) <> Empty Then
key = Month(Sh.Cells(W, 3))
If Thang <> key Then F = DicDN.Item(key)
If Ngay = Day(Sh.Cells(W, 3)) Then
F = F
Else
F = 1 + F
End If
Ngay = Day(Sh.Cells(W, 3)): Thang = key
End If
Next W
DocNo = "SP" & Format(key, "0#") & Format(F, "0#") & "VTF6"
End Function
Thử cái này.Chào các bạn trong GPE!!!!
Mình có file này, nhò các bạn viết code để nhảy số phiếu khi cột M là SX6, còn không phải là SX6 thì không nhảy số phiếu ạ.
Trong file mình có ghi chú quy luật của số phiếu.
Mong các bạn giúp đỡ.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long, a As Long
Application.ScreenUpdating = False
Application.EnableEvents = False
If Not Intersect(Target, Range("M2:M1000")) Is Nothing Then
If Target.Value = "SX6" Then
For i = Target.Row - 1 To 2 Step -1
If Range("M" & i).Value = "SX6" Then
a = i
Exit For
End If
Next i
If a Then
If Month(Target.Offset(, -10).Value) > Month(Range("C" & a).Value) Then
Target.Offset(, -9).Value = "SP" & Month(Target.Offset(, -10).Value) & "01" & "SX6"
ElseIf Month(Target.Offset(, -10).Value) = Month(Range("C" & a).Value) Then
If Day(Target.Offset(, -10).Value) > Day(Range("C" & a).Value) Then
Target.Offset(, -9).Value = Left(Range("D" & a).Value, 4) & Format((CLng(Mid(Range("D" & a).Value, 5, 2)) + 1), "00") & "SX6"
Else
Target.Offset(, -9).Value = Range("D" & a).Value
End If
Else
Target.Offset(, -9).Value = "SP" & Month(Target.Offset(, -10).Value) & "01" & "SX6"
End If
End If
End If
End If
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Góp vui cho thêm phần rộn ràng.Mong thầy @VetMini chỉnh lại code dùm em ạ. Ví dụ em có 950 dòng đã chạy code lấy số phiếu xong rồi, sang hôm sau em nhập liệu 5 dòng tiếp, thì code chỉ chạy 5 dòng mới nhập thôi ạ, chư không chạy 955 dòng luôn ạ.
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range) ' code cua HUONGHCKT
Application.ScreenUpdating = False
Application.EnableEvents = False
If Not Intersect(Target, Range("G6:G100000")) Is Nothing Then
Dim Sh As Worksheet
Dim DicDN As Object, Arr2(), R2&
Dim Ngay, Thang
Dim Z&, F&, W&
d = Target.Row
If IsArray(Target) Then
dong = Target.Rows.Count
dArr = Range("E" & d).Resize(dong, 3).Value
R = UBound(dArr)
Else
dong = 1
dArr = Range("E" & d).Resize(dong, 3).Value
R = 1
End If
For i = d To d + dong - 1
Range("D" & i) = DocNo(Range("C" & i))
Next i
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Function DocNo(Rng As Range) As String
Dim Arr2(), d&, Lr&, W&, F&, Ngay, Thang, key
Dim Sh As Worksheet, DicDN As Object
Set Sh = Sheets("Issue")
Lr = Rng.Row
Set DicDN = CreateObject("Scripting.Dictionary")
For W = 2 To Lr
If Sh.Cells(W, 3) <> Empty Then
key = Month(Sh.Cells(W, 3))
If Thang <> key Then F = DicDN.Item(key)
If Ngay = Day(Sh.Cells(W, 3)) Then F = F Else F = 1 + F
Ngay = Day(Sh.Cells(W, 3)): Thang = key
End If
Next W
DocNo = "SP" & Format(key, "0#") & Format(F, "0#") & "VTF6"
End Function
Mong thầy @VetMini chỉnh lại code dùm em ạ. Ví dụ em có 950 dòng đã chạy code lấy số phiếu xong rồi, sang hôm sau em nhập liệu 5 dòng tiếp, thì code chỉ chạy 5 dòng mới nhập thôi ạ, chư không chạy 955 dòng luôn ạ.
Sub t()
Const MAHIEU = "SX6"
Const COLOFFSET = 9 ' offset den cot mahieu
Const SOPHIEU = "SP#SX6"
'Bo sung thong tin xac dinh thoi diem bat dau danh lai so phieu
With Sheets("Sheet1")
lstD = .Range("D" & Rows.Count).End(xlUp).Row
lstM = .Range("M" & Rows.Count).End(xlUp).Row
If lstD = 1 Then
Thang = Ngay = ngayThu = 0
Else
Thang = Month(.Range("D" & lstD).Offset(0, -1))
Ngay = Day(.Range("D" & lstD).Offset(0, -1))
ngayThu = Mid(Replace(.Range("D" & lstD), MAHIEU, ""), 5, 10) * 1
End If
End With
'Kiem tra
If Not lstD < lstM Then: Exit Sub
For Each cll In Range("D" & lstD & ":D" & lstM)
If cll.Offset(0, COLOFFSET) = MAHIEU Then
thangl = Month(cll.Offset(0, -1)) ' doc ngay thang
ngayl = Day(cll.Offset(0, -1))
If thangl <> Thang Then ' xet xem co phai thang moi
Thang = thangl
Ngay = 0
ngayThu = 0
End If
If ngayl <> Ngay Then ' neu khac ngay thi tang so
Ngay = ngayl
ngayThu = ngayThu + 1
End If
cll.Value = Replace(SOPHIEU, "#", _
Right(10000 + Thang * 100 + ngayThu, 4))
End If
Next cll
End Sub
Nhanh hay không chưa biết. Nhưng theo bạn thì cái dòng trên cho ra kết quả gì?PHP:... Thang = Ngay = ngayThu = 0 ...
...
(2) Code mình chạy thấy rất nhanh, chưa rõ sao có thể chậm 15s như bạn mô tả được.
Tôi thử trên file dữ liệu mẫu, 332 dòng, thời gian 0.024 giây. Làm bài toán quy tắc tam suất thì 15 giây phải chạy được 207,500 dòng. Máy yếu, chỉ chạy được 1 nửa là 100 ngàn, yếu hơn nữa được 1/4, cũng phải 50 ngàn dòng. Máy bạn loại nào mà chỉ chạy 1000 dòng?dữ liệu của em 950 dòng mà chạy gần 15s
Máy dùng đồng hồ "Made in PRC (共和人民中華)"... Máy bạn loại nào mà chỉ chạy 1000 dòng?
Nếu từ code anh VetMini, chỉ cần tìm dòng cuối cột D, để nguyên code chạy từ đó trở xuống, sửa code ítTheo mong muốn của bạn, từ code của anh VetMini, chỉ bổ sung thêm điều kiện bắt đầu đánh số phiếu khi có dòng mới.
ngay = 0
thang = 0
ngayt = 0
For Each cll In Range(Cells(2, "D"), Cells(Cells(10000, "C").End(xlUp).Row, "D"))
LastRw = Cells(10000, "D").End(xlUp).Row
ngay = 0
ngayt = Val(Mid(Cells(LastRw, "D"), 5, 2))
thang = Val(Mid(Cells(LastRw, "D"), 3, 2))
For Each cll In Range(Cells(LastRw + 1, "D"), _
Cells(Cells(10000, "C").End(xlUp).Row, "D"))
(1) Bạn nên tham khảo thêm code bài #9 , bài #10, bài #11 để thuận tiện công tác đánh số, vì nó bắt sự kiện bạn nhập vào bảng tính và tự động đánh số phiếu.