[Help] Nhờ Pro hướng dẫn làm Code gọn.

Tín97

Thành viên mới
Em là mem mới.
Tình hình là em có mò VBA được vài tuần. Tra google này nọ thì có tự viết được 1 file theo yêu cầu của bản thân và công việc.
Cụ thể như sau:
- Tạo 1 dãy ô liên tiếp trong 1 cột dựa trên 1 vùng dữ liệu cho trước.
- Dãy ô được tạo có số lần lặp lại của dữ liệu gốc và có 2 cách sắp xếp:
1. Giống như việc copy vùng dữ liệu gốc dán liên tiếp vào cuối cột theo n lần cho trước.​
2. 1 ô trong dữ liệu gốc được lặp lại n lần, tiếp theo ô thứ 2 trong dữ liệu gốc cũng n lần, cứ thế tới hết ô trong dữ liệu nguồn. Tất nhiên là vẫn theo 1 cột nối dài.​
Em đã tạo thành công và em phát hiện rằng copy dán n lần thì file chạy khá chậm. Em sử dụng cách cho biến chạy đến ô nhất định thì dữ liệu bằng ô nhất định trong dữ liệu nguồn.
Xong, vì mới nên nhìn lại code khá rối. Với lại mong các anh/chị đóng góp ý kiến về cách viết sao cho trực quang, khi nhìn lại dễ nhớ cách mình đã làm và giúp code gọn hơn, chạy nhanh hơn.
Ps: Sẵn tiện share luôn nếu bạn nào đang cần vụ này

 

Ngày Mới

Thành viên
Bạn có thể thử cách dùng mảng như @haokira đã trình bày.

Dưới dây là một trong các cách dùng mảng bạn có thể thử, tập code trên mảng sẽ giúp bạn cho về tốc độ xử lý nhanh hơn rất nhiều so với trên sheet. Đồng thời khi có lỗi xảy ra, dữ liệu sẽ bị ngắt trên mảng, không ảnh hưởng gì trên sheet nên sẽ đảm bảo tính toàn vẹn cho dữ liệu sheet.

Để code dễ nhớ thì bạn cần cấu trúc cho nó trước khi Code. Giống như việc bạn làm sường bài trước khi viết bài vậy, như vậy đảm bảo bạn không đi lạc. Đồng thời cần có Comment code rõ ràng, càng rõ ràng sẽ càng dễ cho công đoạn sửa code của bạn sau này.

Khi viết code với nội dung lớn, bạn cần tách biệt ra rõ ràng chức năng của các Module. Khi sửa, chỉ cần tập trung vào 1 Module mà sửa, sẽ đỡ tốn thời gian cho bạn rất nhiều.

Để làm sau cho code chạy nhanh hơn, bạn cần tham khảo bài viết Tăng tốc VBA, links

Để tìm hiểu về mảng, bạn cần tham khảo bài viết Array_Mảng, links
Mã:
Sub ThV()
Dim arrThV, arrResult As Variant
Dim n, i, iMod As Long
Dim iTitle As Long

'//SO COT TIEU DE
iTitle = 1

'//NAP LIEU CHO ARR
arrThV = ThisWorkbook.Sheets("Sheet1").Range("A2:A4").Value

'//SO LAN MUON LAP LAI DU LIEU
n = 9

'//KHAI BAO ARR KET QUA
ReDim arrResult(1 To UBound(arrThV, 1) * n)

'//CHAY VONG LAP
For i = LBound(arrResult, 1) To UBound(arrResult, 1)

    '//LAY SO DU
    iMod = i Mod UBound(arrThV, 1)
    If iMod = 0 Then iMod = UBound(arrThV, 1)

    '//NAP LIEU VAO ARR
    arrResult(i) = arrThV(iMod, 1)

Next i

'//XUAT ARR
ThisWorkbook.Sheets("Sheet1").Range("B" & iTitle + 1 & ":B" & UBound(arrResult, 1) + iTitle).Value = WorksheetFunction.Transpose(arrResult)

End Sub
Đây là hình ảnh về dữ liệu trên file

Bạn cần đăng nhập để thấy hình ảnh
 
Sửa lần cuối:

Binana

Thành viên mới
@Tín97 . Em xin gop vui 1 cách dùng mảng anh tham khảo
Mã:
Option Explicit
Sub Abc()
Dim sArr(), Res(), Res1(), i&, iRow&, s&, j&, ii&
iRow = Sheet1.Range("A" & Rows.Count).End(3).Row
sArr = Sheet1.Range("A1:A" & iRow).Value
s = Sheet1.Range("D1").Value
ReDim Res(1 To UBound(sArr, 1) * s, 1 To 1)
ReDim Res1(1 To UBound(Res), 1 To 1)
    For i = 1 To s
        For j = 1 To UBound(sArr, 1)
            ii = ii + 1
            Res(ii, 1) = sArr(j, 1)
        Next
    Next
ii = 0
    For i = 1 To UBound(sArr, 1)
        For j = 1 To s
            ii = ii + 1
            Res1(ii, 1) = sArr(i, 1)
        Next
    Next
Sheet1.Range("B1:C10000").ClearContents
Sheet1.Range("B1").Resize(ii).Value = Res
Sheet1.Range("C1").Resize(ii).Value = Res1
End Sub
 
Sửa lần cuối:
Top