Giúp tối giản code (1 người xem)

Liên hệ QC

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

tueyennhi

Thành viên tích cực
Tham gia
18/10/10
Bài viết
1,192
Được thích
105
Chào anh chị

Đây là file đăng ký mã số thuế cá nhân em sưu tầm trên mạng và tùy biến thêm. Em nhờ mọi người xem qua code xem có thể tối giản ngắn gọn hơn giúp em được không nhé (ở module 1). Em cảm ơn!
Code em xây dựng vì không biết căn bản về VBA, cứ chắt lọc qua từng câu hỏi trên diễn đàn, ví dụ clear một mảng thì làm thế nào để chọn tự động mà không phải chọn tận 20000 dòng để xóa....
 

File đính kèm

Lần chỉnh sửa cuối:
Chào anh chị

Đây là file đăng ký mã số thuế cá nhân em sưu tầm trên mạng và tùy biến thêm. Em nhờ mọi người xem qua code xem có thể tối giản ngắn gọn hơn giúp em được không nhé (ở module 1). Em cảm ơn!
Code em xây dựng vì không biết căn bản về VBA, cứ chắt lọc qua từng câu hỏi trên diễn đàn, ví dụ clear một mảng thì làm thế nào để chọn tự động mà không phải chọn tận 20000 dòng để xóa....
Xin trả lời bạn 1 ý nhỏ, đó là xóa dòng dữ liệu.
Bạn muốn xóa 1 bảng dữ liệu bắt đầu từ A16 đến dòng cuối của cột X, bạn viết :
PHP:
Worksheets("Lay ma").Range("A16:X" & lr).Clearcontents
Với    lr = Sheets("Lay ma").[c65000].End(3).Row

Thay vì viết:
Worksheets("Lay ma").Range("A16:X20000").Clear
 
Upvote 0
Đây là file đăng ký mã số thuế cá nhân em sưu tầm trên mạng và tùy biến thêm.
(2) Em nhờ mọi người xem qua code xem có thể tối giản ngắn gọn hơn giúp em được không nhé (ở module 1).
Code em xây dựng vì không biết căn bản về VBA, cứ chắt lọc qua từng câu hỏi trên diễn đàn,
(1) ví dụ clear một mảng thì làm thế nào để chọn tự động mà không phải chọn tận 20000 dòng để xóa....

(1)
Bạn có câu lệnh:
Mã:
Worksheets("Lay ma").Range("A16:X20000").Clear
Vì CSDL của bạn ở trang tính này đã là chuẩn, nên xài câu này
PHP:
Worksheets("Lay ma").Range("A17").Currentregion.Offset(1).Clearcontents
Về câu lệnh mới này, bạn tìm hiểu fương thức Currentregion có trên diễn đàn

(2) Bạn có macro này ở mudule Main:
Mã:
Sub OpenMyform()
 If Not Intersect(ActiveCell, Sheet1.[L16:O65536]) Is Nothing Then
    UserForm1.Show
 ElseIf Not Intersect(ActiveCell, Sheet1.[Q16:S65536]) Is Nothing Then
    UserForm1.Show
 ElseIf Not Intersect(ActiveCell, Sheet1.[E5]) Is Nothing Then
    UserForm1.Show
 End If
End Sub

Nên chuyển thành macro sự kiện ở trang 'Sheet1' như sau:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Union([E5], [Q16:S65536], [L16:O65536])) Is Nothing Then
    UserForm1.Show
 End If
End Sub

Một vài góp í ngoài lề iêu cầu của bạn:


(*) Bạn dùng câu lệnh
Mã:
Declare Function GetTickCount Lib "kernel32" () As Long
& . . . Để đo đếm thời gian trãi qua của 1 macro là quá xa xĩ!
Chỉ cần xài hàm Timer() là được rồi.

(*) Trong macro LayMaTinh có đoạn code của bạn như sau:
Mã:
 With Sheets("All")
     lr = .[c65000].End(3).Row
'Tach Xa Huyen Tinh
     .Range("bf5:bf" & lr).Value = "=+TRIM(TinhTue(RC[-32]))"
     .Range("bf5:bf" & lr).Value = .Range("bf5:bf" & lr).Value
     .Range("bg5:bg" & lr).Value = "=TRIM(HuyenVan(RC[-33]))"
     .Range("bg5:bg" & lr).Value = .Range("bg5:bg" & lr).Value
     .Range("bh5:bh" & lr).Value = "=TRIM(XaTran(RC[-34]))"
     .Range("bh5:bh" & lr).Value = .Range("bh5:bh" & lr).Value
'Chuyen chu
     .Range("E5:E" & lr).Value = "=+PROPER(RC[-1])"
     .Range("E5:E" & lr).Value = .Range("E5:E" & lr).Value
 End With
Thiết nghĩ không fải lúc nào cũng đem tất cả ra tách tỉnh/huyên/xã làm vậy; Những "cha" nào đã được tách lần trước (do chạy macro này) thì lần sau thôi đi chứ; Chạy như vậy là bạn chưa biết tiết kiệm tiền của của những người
đóng thuế đó nghe!

(*) ID của bạn đang xài tiềm ẩn nguy cơ vì độ dài của chúng không đồng nhất. Sẽ lúc nào đó trở ngại sinh ra bỡi sự tài lanh về kí tự đại diện của Excel gây cho bạn.
Theo mình thì Mã NV nên có độ dài là 5, ví dụ:
Mã:
Nguyễn Đức Ẩn:        NFA00
Nguyễn Đức:           NJF00
Ngô Nguễn Hoàng Đức:  NHF00
Trần Ấu:              TJA00
Nguyễn Hoàng Đô:      NHF01

& tất cả các hoạt động của CSDL này chỉ & chỉ xoay quanh mã này mà thôi.

Bạn chịu đó đọc những lời khó nghe này vậy nhé!
 
Upvote 0
(1)
Bạn có câu lệnh:
Mã:
Worksheets("Lay ma").Range("A16:X20000").Clear
Vì CSDL của bạn ở trang tính này đã là chuẩn, nên xài câu này
PHP:
Worksheets("Lay ma").Range("A17").Currentregion.Offset(1).Clearcontents
Về câu lệnh mới này, bạn tìm hiểu fương thức Currentregion có trên diễn đàn

(2) Bạn có macro này ở mudule Main:
Mã:
Sub OpenMyform()
 If Not Intersect(ActiveCell, Sheet1.[L16:O65536]) Is Nothing Then
    UserForm1.Show
 ElseIf Not Intersect(ActiveCell, Sheet1.[Q16:S65536]) Is Nothing Then
    UserForm1.Show
 ElseIf Not Intersect(ActiveCell, Sheet1.[E5]) Is Nothing Then
    UserForm1.Show
 End If
End Sub

Nên chuyển thành macro sự kiện ở trang 'Sheet1' như sau:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Union([E5], [Q16:S65536], [L16:O65536])) Is Nothing Then
    UserForm1.Show
 End If
End Sub

Một vài góp í ngoài lề iêu cầu của bạn:


(*) Bạn dùng câu lệnh
Mã:
Declare Function GetTickCount Lib "kernel32" () As Long
& . . . Để đo đếm thời gian trãi qua của 1 macro là quá xa xĩ!
Chỉ cần xài hàm Timer() là được rồi.

(*) Trong macro LayMaTinh có đoạn code của bạn như sau:
Mã:
 With Sheets("All")
     lr = .[c65000].End(3).Row
'Tach Xa Huyen Tinh
     .Range("bf5:bf" & lr).Value = "=+TRIM(TinhTue(RC[-32]))"
     .Range("bf5:bf" & lr).Value = .Range("bf5:bf" & lr).Value
     .Range("bg5:bg" & lr).Value = "=TRIM(HuyenVan(RC[-33]))"
     .Range("bg5:bg" & lr).Value = .Range("bg5:bg" & lr).Value
     .Range("bh5:bh" & lr).Value = "=TRIM(XaTran(RC[-34]))"
     .Range("bh5:bh" & lr).Value = .Range("bh5:bh" & lr).Value
'Chuyen chu
     .Range("E5:E" & lr).Value = "=+PROPER(RC[-1])"
     .Range("E5:E" & lr).Value = .Range("E5:E" & lr).Value
 End With
Thiết nghĩ không fải lúc nào cũng đem tất cả ra tách tỉnh/huyên/xã làm vậy; Những "cha" nào đã được tách lần trước (do chạy macro này) thì lần sau thôi đi chứ; Chạy như vậy là bạn chưa biết tiết kiệm tiền của của những người
đóng thuế đó nghe!

(*) ID của bạn đang xài tiềm ẩn nguy cơ vì độ dài của chúng không đồng nhất. Sẽ lúc nào đó trở ngại sinh ra bỡi sự tài lanh về kí tự đại diện của Excel gây cho bạn.
Theo mình thì Mã NV nên có độ dài là 5, ví dụ:
Mã:
Nguyễn Đức Ẩn:        NFA00
Nguyễn Đức:           NJF00
Ngô Nguễn Hoàng Đức:  NHF00
Trần Ấu:              TJA00
Nguyễn Hoàng Đô:      NHF01

& tất cả các hoạt động của CSDL này chỉ & chỉ xoay quanh mã này mà thôi.

Bạn chịu đó đọc những lời khó nghe này vậy nhé!

Cái phương thức Currentregion này hay quá. Cảm ơn bạn nhiều nhé. ID thì thực ra đúng là 5 con số nhưng mình thay đổi từ 1 đến... đấy :).
Còn cái đoạn "cha" nào đã lấy, biết là biết vậy nhưng vì mình vừa tìm tòi vừa làm nên chưa biết cách phải làm sao.:(
 
Lần chỉnh sửa cuối:
Upvote 0
. . . Còn cái đoạn "cha" nào đã lấy, biết là biết vậy nhưng vì mình vừa tìm tòi vừa làm nên chưa biết cách phải làm sao.:(
Có vài cách để bạn tiếp cận như sau:

Đơn gian nhất là ghi macro với lệnh Goto

Bạn lấy trang tính trống; Ở 1 cột nào đó chọn làm thí nghiệm, bạn nhập vài ô chứa các kí tự bất kì & vài ô với các kí số bất kì; Nhưng cũng còn vài ô chưa nhập gì;
Sau đó mở bộ thu macro lên & ghi lại các lệnh Goto đến các ô trống (Blank)

Sau khi kết thúc thu macro ta sẽ chỉnh lại cho sáng sửa hơn nếu cần

(Bạn có thể tham khảo thêm tại: http://webketoan.com/threads/51963-tong-quan-ve-phuong-thuc-specialcells-trong-vba/)
 
Lần chỉnh sửa cuối:
Upvote 0
Ở sheet "all" có phần giới tính ở cột 47. Có cách nào để nếu là Nam thì trong sheet "Lay ma" tại cột 3 sẽ là Y, nếu là nữ thì sẽ là N tương ứng không ạ?
 
Upvote 0
Web KT

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

Back
Top Bottom