Xin hỏi cách thay thế 1 đoạn code lặp đi lặp lại nhiều lần

Liên hệ QC

ThangAcc

Thành viên hoạt động
Tham gia
27/11/06
Bài viết
137
Được thích
53
Trong đoạn code của em có nhiều đoạn code nhỏ, lặp đi lặp lại nhiều lần. Em muốn thay đoạn code lặp đi lặp lại đó bằng 1 câu lệnh đơn giản. Có cách nào thay được mà không phải viết 1 hàm hay thủ tục không ạ?

Ví dụ đoạn code sau bị lặp đi lặp lại nhiều lần:

Mã:
With sh3.[A65500].End(xlUp).Offset(1)
 .Value = t_Masp
   .Offset(, 4).Value = sh1.Cells(sRng_Tonghop.Row, "F").Value
 .Offset(, 2).Value = sh1.Cells(sRng_Tonghop.Row, "J").Valu.Offset(, 22).Value = sh1.Cells(sRng_Tonghop.Row, "AB").Value
End With
 
Về nguyên lý, các đoạn code sử dụng nhiều lần thì viết thành 1 sub riêng, và gọi sub đó chạy

Về thực hiện:
- Thực hiện bình thường: Sub đơn giản, chỉ chạy cho 1 vùng tham chiếu nhất định (nếu có tham chiếu đến vùng), hoặc giá trị const nhất định (nếu có sử dụng giá trị số hoặc text cố định)
- Thực hiện tổng quát: Sub có tham số truyền, tuỳ biến hơn cách trên, muốn tác động đến vùng nào, sử dụng giá trị nào, thì truyền tham số vào code, sub sẽ chạy trên tham số đó

Yêu cầu:
Nếu có sử dụng tên biến, biến đó phải khai báo public

Cụ thể:
Tuỳ trường hợp, tuỳ dữ liệu, tuỳ mục đích của sub, ... mà thực hiện tách sub ra riêng, không trường hợp nào giống trường hợp nào.
 
Upvote 0
Cái đoạn lặp của em hơi rắc rối nếu làm thêm 1 sub vì khó khai báo biến bác ạ. Thế nên em muốn tìm cách nào thay thế nó một cách đơn giản hơn
 
Upvote 0
Mã:
With sh3.[A65500].End(xlUp).Offset(1)  .Value = t_Masp [COLOR=#0000cd]'[/COLOR][COLOR=#0000cd]biến t_Masp khai public hoặc truyền tham số[/COLOR]    
.Offset(, 4).Value = sh1.Cells(sRng_Tonghop.Row, "F").Value [COLOR=#0000cd]'câu này lấy tham số truyền được[/COLOR]  
.Offset(, 2).Value = sh1.Cells(sRng_Tonghop.Row, "J").Value [COLOR=#0000cd]'như trên[/COLOR]
.Offset(, 22).Value = sh1.Cells(sRng_Tonghop.Row, "AB").Value [COLOR=#0000cd]'như trên[/COLOR] 
End With

Thí dụ:

PHP:
Sub abc(Masp, RRow)
With sh3.[A65500].End(xlUp).Offset(1) 
  .Value = Masp
  .Offset(, 4).Value = sh1.Cells(RRow, "F")
  .Offset(, 2).Value = sh1.Cells(RRow, "J")
  .Offset(, 22).Value = sh1.Cells(RRow, "AB")
End With
End Sub

Gọi Sub:

PHP:
abc t_Masp, sRng_Tonghop.Row


Xem code của bạn, tôi cho rằng bạn chưa sử dụng mảng, toàn là đánh trực tiếp vào cell và sheet. THậm chí chưa tận dụng các cấu trúc lặp. Như vậy sẽ bị chậm.
 
Lần chỉnh sửa cuối:
Upvote 0
Để tránh phải truyền tham số phức tạp ta để chúng trong 1 sub hay Function và ta áp dụng Goto hay Gosub để thực hiện.
Ví dụ sau mình dùng goto để thực hiện. Biến i và Tm1, Tm2, Tm3 vẫn được sử dụng trong đoạn vòng lặp bằng biến code chính mà không phải truyền. Bạn tham khảo nha:

Mã:
Sub TH2()
Dim Tm1, Tm2, Tm3, i, j
Tm1 = Sheet1.[a2:b21]
Tm2 = Sheet1.[e2:e4]
ReDim Tm3(1 To UBound(Tm2))
For i = 1 To UBound(Tm1, 1)
GoTo Congdon
Tieptuc:
Next
Sheet1.[f2].Resize(UBound(Tm3)) = WorksheetFunction.Transpose(Tm3)
Exit Sub

'Doan code co the lap nhieu lan
Congdon:
For j = 1 To UBound(Tm2)
If Tm2(j, 1) = Tm1(i, 1) Then Tm3(j) = Tm3(j) + Tm1(i, 2)
Next
GoTo Tieptuc
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Xem code của bạn, tôi cho rằng bạn chưa sử dụng mảng, toàn là đánh trực tiếp vào cell và sheet. THậm chí chưa tận dụng các cấu trúc lặp. Như vậy sẽ bị chậm.
Quả thực là em không thạo sử dụng mảng, em sửa sub như bác hướng dẫn mà nó báo lỗi (Nếu không đặt trong sub mà viết đầy đủ ra (copy đoạn sub ấy 4 lần vào 4 chỗ cần copy :=\+) thì nó vẫn chạy tốt không bị lỗi).
Và em cũng thấy nó hạy chậm thật như bác nói, bác xem giúp em đoạn code có thể viết lại cho nó nhanh hơn không ạ.
Cảm ơn bác nhiều.
 

File đính kèm

Upvote 0
1. Những biến sử dụng chưa khai báo public như x_TKX, x_MaFG, x_SLX, x_SHT
2. sh1, sh2 là gì, nó cũng chưa biết
3. Bạn truyền tham số RRow, nhưng không dùng RRow, mà vẫn dùng giá trị cũ là sRng_Tonghop.Row, trong đó biến sRng_Tonghop là gì nó cũng không biết

Đại khái là phải vầy:

PHP:
    Public x_SHT As Integer
    Public x_TKX As Integer
    Public x_SLX As Double
    Public x_MaFG As String

PHP:
Sub ThemDongNXT(Masp, RRow)

Set sh1 = ActiveSheet
With Sheets("NXT").[A65500].End(xlUp).Offset(1)
    .Value = t_Masp
    .Offset(, 4).Value = sh1.Cells(RRow, "F").Value
    .Offset(, 2).Value = sh1.Cells(RRow, "J").Value
    .Offset(, 3).Value = sh1.Cells(RRow, "K").Value
    .Offset(, 5).Value = sh1.Cells(RRow, "E").Value
    .Offset(, 6).Value = sh1.Cells(RRow, "O").Value
    .Offset(, 8).Value = sh1.Cells(RRow, "N").Value
    .Offset(, 9).Value = sh1.Cells(RRow, "P").Value
    .Offset(, 10).FillDown
    .Offset(, 11).FillDown
    .Offset(, 12).Value = sh1.Cells(RRow, "I").Value
    .Offset(, 13).Value = sh1.Cells(RRow, "T").Value
    .Offset(, 14).Value = sh1.Cells(RRow, "U").Value
    .Offset(, 15).Value = x_TKX
    .Offset(, 16).Value = x_MaFG
    .Offset(, 17).FillDown
    .Offset(, 18).FillDown
    .Offset(, 19).Value = x_SLX
    .Offset(, 20).Value = [J10].Value
    .Offset(, 21).Value = Cells(RRow, "I").Value
    .Offset(, 25).FillDown
    .Offset(, 26).FillDown
    .Offset(, 28).FillDown
    .Offset(, 29).FillDown
    .Offset(, 30).Value = x_SHT
End With
End Sub

ghi chú, biến nào khai báo public thì không khai báo trong sub chính nữa.
 
Upvote 0
Cảm ơn bác, có điều nó chạy vẫn hơi chậm. Có cách nào cải thiện tốc độ không bác?
 
Upvote 0
Web KT

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

Back
Top Bottom