Xin giúp đỡ làm gọn code vba

Liên hệ QC

chidung2009

Thành viên hoạt động
Tham gia
12/9/12
Bài viết
123
Được thích
8
Các anh chị cho em hỏi muốn làm gọn code vba bên dưới thì phải làm thế nào? Tại vì em muốn định dạng ngày tháng bằng macro ở nhiều shell, nhiều cột giống nhau
Mong ac gpe giúp đỡ e với/-*+/
PHP:
Sub NgayThangNam()
Sheets("HinhSu").Select
    Range("C6:C500").Select
        Call NgayThang
    Range("H6:H500").Select
        Call NgayThang
Sheets("DanSu").Select
    Range("C6:C500").Select
        Call NgayThang
    Range("H6:H500").Select
        Call NgayThang
Sheets("HonNhan").Select
    Range("C6:C500").Select
        Call NgayThang
    Range("H6:H500").Select
        Call NgayThang
Sheets("AnKhac").Select
    Range("C6:C500").Select
        Call NgayThang
    Range("H6:H500").Select
        Call NgayThang
Sheets("THA").Select
    Range("C6:C500").Select
        Call NgayThang
Sheets("ThongKe").Select
Range("J8:J5000").Select
        Call NgayThang
    Range("O8:O5000").Select
        Call NgayThang
    Sheets("Home").Select
    Range("D9").Select
End Sub
 
Bạn có thể tham khảo:
PHP:
Option Explicit
Sub NgayThangNam()
 Dim Num As Byte
 
 Randomize
Sheets("HinhSu").Select
    Union(Range("C6:C500"), [H6:H500]).Select
    NgayThang Selection, 9 * Rnd() \ 1
Sheets("DanSu").Select
    NgayThang Range("C6:C500"), 2
    NgayThang Range("H6:H500"), 9
Sheets("HonNhan").Select
    NgayThang Union([H6:H500], [c6:c500]), 9 * Rnd() \ 1
Sheets("AnKhac").Select
    Range("C6:C500").Select
    NgayThang Selection, 9
    Range("H6:H500").Select
    NgayThang Selection, 8
   
NgayThang Sheets("THA").[C6:C500], 7

Sheets("ThongKe").Select
    Range("J8:J5000").Select
    NgayThang Selection, 9 * Rnd() \ 1
    NgayThang Range("O8:O5000"), 4
    Sheets("Home").Select
    Range("D9").Select
End Sub
Mã:
[SIZE=3][B]Sub NgayThang(Rng As Range, Optional Num As Byte)
[/B][/SIZE]If Num Mod 2 = 0 Then
    Rng.NumberFormat = "MM/dd/yyyy"
 Else
    Rng.NumberFormat = "MMm/dd/yyyy"
 End If
[SIZE=3][B]End Sub[/B][/SIZE]
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Các anh chị cho em hỏi muốn làm gọn code vba bên dưới thì phải làm thế nào? Tại vì em muốn định dạng ngày tháng bằng macro ở nhiều shell, nhiều cột giống nhau
Mong ac gpe giúp đỡ e với/-*+/
PHP:
Sub NgayThangNam()
Sheets("HinhSu").Select
    Range("C6:C500").Select
        Call NgayThang
    Range("H6:H500").Select
        Call NgayThang
Sheets("DanSu").Select
    Range("C6:C500").Select
        Call NgayThang
    Range("H6:H500").Select
        Call NgayThang
Sheets("HonNhan").Select
    Range("C6:C500").Select
        Call NgayThang
    Range("H6:H500").Select
        Call NgayThang
Sheets("AnKhac").Select
    Range("C6:C500").Select
        Call NgayThang
    Range("H6:H500").Select
        Call NgayThang
Sheets("THA").Select
    Range("C6:C500").Select
        Call NgayThang
Sheets("ThongKe").Select
Range("J8:J5000").Select
        Call NgayThang
    Range("O8:O5000").Select
        Call NgayThang
    Sheets("Home").Select
    Range("D9").Select
End Sub

Đặt các biến rgSheetKhac = "C6:C500", rgSheetTK1 = "J8:J5000", rgSheetTK2 = "O8:O5000", rgSheetTK3 = "D9"
Đặt các tên sheet khác vào 1 array
Vòng lặp duyệt array và gọi sub NgayThang
Gọi NgayThang cho sheet thongke

Mã:
rgSheetKhac1 = "C6:C500" : rgSheetKhac2 = "H6:H500" : rgSheetTK1 : "J8:J5000" : rgSheetTK2 = "O8:O5000"
For Each Sh in [ { "HinhSu", "DanSu", "HonNhan", "AnKhac", "THA" } ]
  Sheets(Sh).Select
  Range(rgSheetKhac1).Select ' tất cả các sheets đều NgayThang cho range này
  Call NgayThang
  If Sh <> "THA" Then
    Range(rgSheetKhac2).Select ' tất cả các sheets, trừ THA đều NgayThang cho range này 
    Call NgayThang
  End If
Next Sh
Sheets("ThongKe").Select
Range(rgSheetTK1).Select
Call NgayThang
Range(rgSheetTK2).Select
Call NgayThang
Sheets("Home").Select
Range("D9").Select

Chỉ có thể giúp cho code dễ kiểm soát hơn thôi, chứ muốn thu gọn thì phải biết code của sub NgayThang ra sao.
 
Lần chỉnh sửa cuối:
Upvote 0
Đặt các biến rgSheetKhac = "C6:C500", rgSheetTK1 = "J8:J5000", rgSheetTK2 = "O8:O5000", rgSheetTK3 = "D9"
Đặt các tên sheet khác vào 1 array
Vòng lặp duyệt array và gọi sub NgayThang
Gọi NgayThang cho sheet thongke

Mã:
rgSheetKhac1 = "C6:C500" : rgSheetKhac2 = "H6:H500" : rgSheetTK1 : "J8:J5000" : rgSheetTK2 = "O8:O5000"
For Each Sh in [ { "HinhSu", "DanSu", "HonNhan", "AnKhac", "THA" } ]
  Sheets(Sh).Select
  Range(rgSheetKhac1).Select ' tất cả các sheets đều NgayThang cho range này
  Call NgayThang
  If Sh <> "THA" Then
    Range(rgSheetKhac2).Select ' tất cả các sheets, trừ THA đều NgayThang cho range này 
    Call NgayThang
  End If
Next Sh
Sheets("ThongKe").Select
Range(rgSheetTK1).Select
Call NgayThang
Range(rgSheetTK2).Select
Call NgayThang
Sheets("Home").Select
Range("D9").Select

Chỉ có thể giúp cho code dễ kiểm soát hơn thôi, chứ muốn thu gọn thì phải biết code của sub NgayThang ra sao.

Code vba sub Ngay Thang đơn giản thôi, do sau này mình muốn định dạng ngày tháng kiểu khác nên mới sử dụng cách gọi Sub NgayThang
Nếu cần bạn có thể viết chung Sub NgayThang vào Sub này luôn cũng đc.
Mình cảm ơn bạn nhiều
Sub NgayThang()
' Dinh dang Ngay Thang Nam
Selection.NumberFormat = "dd/mm/yyyy"
End Sub
 
Upvote 0
Code vba sub Ngay Thang đơn giản thôi, do sau này mình muốn định dạng ngày tháng kiểu khác nên mới sử dụng cách gọi Sub NgayThang
Nếu cần bạn có thể viết chung Sub NgayThang vào Sub này luôn cũng đc.
Mình cảm ơn bạn nhiều
Sub NgayThang()
' Dinh dang Ngay Thang Nam
Selection.NumberFormat = "dd/mm/yyyy"
End Sub

Đơn giản hay phức tạp không quan trọng. Cái tôi cần biết là sub này đòi hỏi những gì trước khi gọi nó, và nó có độc lập với số lần chạy hay không (*)
Theo như code trên thì sub NgayThang của bạn làm việc trên Selected Range. Tức là nó đòi hỏi phải chọn cho đúng range
Tuy nhiên, nếu bạn dùng tham số để xác định range thì có thể bỏ được điều kiện select

Sub NgayThang(rg as range)
' Dinh dang Ngay Thang Nam
rg.NumberFormat = "dd/mm/yyyy"
End Sub

Mã:
For Each Sh in [ { "HinhSu", "DanSu", "HonNhan", "AnKhac", "THA" } ]
  Call NgayThang( Sheets(Sh).Range("C6:C500") ) ' tất cả các sheets đều NgayThang cho range này
  If Sh <> "THA" Then
    Call NgayThang( Sheets(Sh).Range("H6:H500") ) ' tất cả các sheets, trừ THA đều NgayThang cho range này
  End If
Next Sh
Call NgayThang( Sheets("ThongKe").Range("J8:J5000") )
Call NgayThang( Sheets("ThongKe").Range("O8:O5000") )
Sheets("Home").Select
Range("D9").Select
' Lưu ý: Range("O8:O5000") nhiều bạn ở đây thích viết là [O8:O5000]
' nếu bạn cho rằng cách viết ấy gọn hơn thì tuỳ ý. Tôi luôn luôn viết Range(...) vì lý do riêng của tôi

(*) Chú thích cho các bạn muốn tìm hiểu về code: theo ngôn ngữ lập trình, độc lập với số lần chạy có nghĩa là hàm/phương thức có thể lập đi lập lại nhiều lần và vẫn cho giống kết quả.
function doclap(a, b)
c = c + 1
doclap = a + b+ c
end function
hàm trên thoả điều kiện độc lập. Mỗi lần gọi, cứ gặp đúng trị số a,b thì nó trả về đúng trị a+ b + 1

Tuy nhiên, nếu c là biến toàn cục thì hàm không thoả
dim c as integer
function doclap(a, b)
c = c + 1
doclap = a + b+ c
end function
Mõi lần chạy, nó dùng một trị c khác
 
Upvote 0
Mình đã làm được rồi, cảm ơn bạn nhiều lắm
 
Upvote 0
Web KT
Back
Top Bottom