[trợ giúp] tạo vòng lặp lồng For Next với số vòng lặp phụ thuộc vào người dùng

Liên hệ QC

vanmanhvcu

Thành viên chính thức
Tham gia
27/3/11
Bài viết
85
Được thích
10
Chào tất cả mọi người
tôi có 1 vùng trong bảng Excel như ảnh sau:
1551164152008.png

Range(B3:E10) do người dùng nhấp chuột chọn, số lượng ô trong vùng được chọn hiện tại là 32 ô
và tôi muốn viết code VBA tạo số vòng lặp lồng nhau For Next là số lượng ô trong vùng được chọn là 32 để điền giá trị thay đổi từ 1 đến 3 vào các ô đó
vậy có cách nào tạo vòng lặp lồng mà không phải viết thủ công 32 vòng lặp ra hay không?
nếu có cách nào tốt hơn xin mọi người hãy chỉ dẫn giúp !
PHP:
Sub taoVongLap()
Dim Arr() as integer
Arr()=[B3:E10].value

for Arr(1,1)=1 to 3
    for Arr(1,2)=1 to 3
        for Arr(1,3)=1 to 3
            for Arr(1,4)=1 to 3
                for Arr(2,1)=1 to 3
                    for Arr(2,2)= 1 to 3
                        ..............
                            'tiếp tục đến for Arr(8,4).... thì sẽ rất dài và thủ công
                    next Arr(2,2)
                next Arr(2,1)
            next Arr(1,4)
        next Arr(1,3)
    next Arr(1,2)
next Arr(1,1)

End Sub
 

File đính kèm

  • 1551162367793.png
    1551162367793.png
    7.9 KB · Đọc: 17
Lần chỉnh sửa cuối:
Sorry bác, bài này chỉ chia chiều rộng thôi !
Bài đã được tự động gộp:


các bác @HieuCD @anhtuanle123 @CHAOQUAY có thể giải thích cụ thể từng bước giải thuật để cho mọi người cùng hiểu được không?
tôi và có thể có cả người khác cũng đang chập chững VBA, xem code các bác thì tiêu hóa chưa được tốt lắm, mong thông cảm.
Sorry bác, bài này chỉ chia chiều rộng thôi !
Bài đã được tự động gộp:


các bác @HieuCD @anhtuanle123 @CHAOQUAY có thể giải thích cụ thể từng bước giải thuật để cho mọi người cùng hiểu được không?
tôi và có thể có cả người khác cũng đang chập chững VBA, xem code các bác thì tiêu hóa chưa được tốt lắm, mong thông cảm.
Code phức tạp khó giải thích
Bạn dùng file của mình để dể thêm cột và dòng, vùng màu xanh là dữ liệu nhập vào theo đúng cấu trúc cột dòng, có thể thêm bớt dòng cột, các ô khác xóa cũng được. Địa chỉ vùng màu xanh bạn khai báo lại trong code ở biến DiaChi, kết quả trả về ở sheet KetQua
Chạy không được thì gởi lại file với dữ liệu mới
 

File đính kèm

Upvote 0
Sorry bác, bài này chỉ chia chiều rộng thôi !
Bài đã được tự động gộp:


các bác @HieuCD @anhtuanle123 @CHAOQUAY có thể giải thích cụ thể từng bước giải thuật để cho mọi người cùng hiểu được không?
tôi và có thể có cả người khác cũng đang chập chững VBA, xem code các bác thì tiêu hóa chưa được tốt lắm, mong thông cảm.
Dưới đây là viết giải thuật theo file bài 1, việc khai báo các vùng dữ liệu đơn giản nên ko nêu ra ở đây
Lập luận : Tại mỗi dòng có 4 cột. Mỗi cột có 4 khả năng là 0 - 3 => sẽ có 4^4 = 256 chỉnh hợp cho mỗi dòng, 256 mẫu chỉnh hợp này là không đổi, tuy nhiên mỗi dòng sẽ chỉ khớp với 1 số chỉnh hợp nào đó để đảm bảo kết quả tính tại H5:H11 phù hợp với cận trên & dưới của yêu cầu ( F5:F11 & J5:J11 )
Vì vậy, việc đầu tiên là tìm xem trên mỗi dòng, có các chỉnh hợp nào ăn khớp. Sau khi tìm được, các chỉnh hợp khớp này đã đảm bảo yêu cầu theo dòng!!!
Tiếp theo, nếu đã xác định dược số chỉnh hợp khớp cho mỗi dòng thì từ đó có thể lập tổ hợp chập 7 của các chỉnh hợp của mỗi dòng với nhau. Lúc này sẽ xét điều kiện thứ 2 : Cộng dồn các số cùng cột của chỉnh hợp của mỗi dòng, nếu đạt yêu cầu về số lượng ( >=4 & <=7 ) sẽ được nhặt ra làm kết quả.
Vậy bài này gồm 3 bước chính :
Bước 1 : Lập các mẫu chỉnh hợp chung ( 256 mẫu )
Bước 2 : Trên mỗi dòng, lọc trong 256 ra các mẫu phù hợp đảm bảo kết quả phép tính trên mỗi dòng >= yêu cầu 0.85 & <= yêu cầu 1.2
Bước 3 : Lập tổ hợp chập 7, ghép các mẫu của 7 dòng với nhau, cộng dồn theo cột nếu tất cả các cột đều >=4 & <=7 sẽ lấy làm kết quả
Trong sub BaiToan, các bước thực hiện như sau
Mã:
'Bước 1 : Lập 256 mẫu chỉnh hợp chung, điền vào mảng Tam
ReDim Tam(1 To 4 ^ 4)
ReDim Th(3)
z = 0
For i = 0 To 3
    Th(0) = i
    For j = 0 To 3
        Th(1) = j
        For k = 0 To 3
            Th(2) = k
            For x = 0 To 3
                Th(3) = x
                z = z + 1
                Tam(z) = Th
            Next x
        Next k
    Next j
Next i
'Xong Bước 1 : Lập 256 mẫu chỉnh hợp chung, điền vào mảng Tam
'Lập mảng tích, là phép tính Dòng 2 * Dòng 4 / Dòng 3. Tích này dùng chung để tính tổng theo dòng ( Đây chỉ là bước phụ )
ReDim Tich(1 To 4)
For j = 1 To 4
    Tich(j) = BE2(1, j) * BE4(1, j) / BE3(1, j)
Next j
'Xong Lập mảng tích, là phép tính Dòng 2 * Dòng 4 / Dòng 3. Tích này dùng chung để tính tổng theo dòng ( Đây chỉ là bước phụ )
'Bước 2 : Tìm các chỉnh hợp đạt yêu cầu cho mỗi dòng, điền vào mảng ToHop
ReDim ToHop(1 To 7, 1 To 1)
For i = 1 To 7
    DicTT.RemoveAll
    z = 0
    For Each Th In Tam ' Tại dòng thứ I, quét toàn bộ mẫu chỉnh hợp của mảng Tam
        Cong = 0
        For j = 0 To 3 ' Quét các phần tử của chỉnh hợp Th
            Cong = Cong + Tich(j + 1) * Th(j) ' Lấy giá trị của phần tử của chỉnh hợp * với giá trị tương ứng của mảng Tich, rồi cộng dồn lại
        Next j
        Cong = Cong * CotA(i, 1) ' Kết quả cộng dồn * vối cột A = giá trị tại cột H
        If Cong >= YCau085(i, 1) And Cong <= YCau12(i, 1) Then ' Nếu cộng dồn theo dòng đạt yêu cầu, điền vào dictt
            z = z + 1
            DicTT.Add z, Th
        End If
    Next Th
    ToHop(i, 1) = DicTT.Items ' Tất cả các chỉnh hợp đạt yêu cầu của mỗi dòng được nạp vào mảng ToHop tại dòng tương ứng
Next i
'Xong Bước 2 : Tìm các chỉnh hợp đạt yêu cầu cho mỗi dòng, điền vào mảng ToHop
'Bước 3 : Lập tổ hợp chập 7 các mẫu phù hợp của mỗi dòng, cộng dồn & kiểm tra số lượng theo từng cột. 
'Nếu tất cả các cột đều đảm bảo >=4 & <=7 thỉ lưu làm kết quả
DicTT.RemoveAll
ReDim Cong(3)
For Each i In ToHop(1, 1)
    For Each j In ToHop(2, 1)
        For Each k In ToHop(3, 1)
            For Each x In ToHop(4, 1)
                For Each z In ToHop(5, 1)
                    For Each t In ToHop(6, 1)
                        For Each y In ToHop(7, 1)
                            v = 0
                            For w = 0 To 3
                                Cong(w) = 0
                                Cong(w) = i(w) * CotA(1, 1) + j(w) * CotA(2, 1) + k(w) * CotA(3, 1) _
                                + x(w) * CotA(4, 1) + z(w) * CotA(5, 1) + t(w) * CotA(6, 1) + y(w) * CotA(7, 1)
                                
                                Cong(w) = BE3(1, w + 1) - Cong(w)
                                If Cong(w) > MaxSL Or Cong(w) < MinSL Then
                                    Exit For
                                Else
                                    v = v + 1
                                End If
                            Next w
                            If v = 4 Then
                                a = a + 1
                                DicTT.Add a, Array(i, j, k, x, z, t, y)
                            End If
                        Next y
                    Next t
                Next z
            Next x
        Next k
    Next j
Next I
'Xong Bước 3 : Lập tổ hợp chập 7 các mẫu phù hợp của mỗi dòng, cộng dồn & kiểm tra số lượng theo từng cột. 
'Xuất kết quả vào Kq
ReDim kq(1 To 7, 1 To DicTT.Count)
i = 0
For Each Th In DicTT.Items
    i = i + 1
    For j = 0 To 6
        kq(j + 1, i) = Join(Th(j))
    Next j
Next Th
'Xong Xuất kết quả vào Kq
With Sheets("Sheet1")
.UsedRange.ClearContents
.Range("A3") = DicTT.Count
.Range("A6").Resize(UBound(kq), UBound(kq, 2)) = kq
.Range("A1") = Timer - Tm
End With
End Sub
Code trên đây là làm theo trình tự Dòng _ Cột. Làm theo Cột _ Dòng cũng sẽ thu được kết quả tương tự
 
Upvote 0
Web KT

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

Back
Top Bottom