Hàm dò tìm và tính phức hợp trên 2 mảng, với điều kiện trên 4 mảng khác.

Liên hệ QC

bangkd

Thành viên chính thức
Tham gia
16/3/08
Bài viết
76
Được thích
85
Chào ACE GPE,

Em đang băn khoăn một vấn đề liên quan đến hai hàm Index, Match (em nghĩ vậy).

Trong yêu cầu bài toán em đưa ra trong file excel đính kèm dưới đây, không biết có ACE nào giải quyết được không ?

Thanks.
 

File đính kèm

  • Complicated How.rar
    111.2 KB · Đọc: 102
Tôi cũng nghĩ sẽ kết hợp các hàm dò tìm (Index, Match, Vlookup,....). Tuy nhiên, bạn có thể giải thích thêm ý nghĩa của các ma trận K1,2. Tôi chưa hiểu 2 ma trận đó nên không biết áp dụng thế nào vào công thức.
 
Upvote 0
Tôi cũng nghĩ sẽ kết hợp các hàm dò tìm (Index, Match, Vlookup,....). Tuy nhiên, bạn có thể giải thích thêm ý nghĩa của các ma trận K1,2. Tôi chưa hiểu 2 ma trận đó nên không biết áp dụng thế nào vào công thức.

Chào bạn,

Ở đây mình muốn tính ra ma trận K. Tất nhiên tại sao có được hai ma trận k1, k2 thì mình bỏ qua vì nó không cần thiết. Điều quan trọng ở đây là cách kí hiệu chỉ số cột và hàng của hai ma trận đó. Đây là thuật toán trong môn phần tử hữu hạn, hơi khó giải thích cho bạn. Tớ chỉ mong mọi người chỉ cần quan tâm đến sự đánh số chỉ số một cách thuần túy, và các bạn giải bài toán đó chỉ dựa vào các chỉ số đó thôi.

Để đơn giản, bạn chỉ cần kích vào một ô bất kì trong ma trận K mà mình đã tính thủ công, bạn sẽ hiểu cách tính.

Thân,

Bangkd
 
Upvote 0
Tôi không thấy chỉ số cột và hàng của K1 và K2. Cụ thể, ô B69 của ma trận K có chỉ số cột là u3 và u3, có thể ký hiệu là K(u3, u3).
Còn bạn thử nói ô G26 của K1 có chỉ số cột là gì và dòng là gì? không có các thông số đó, thì không ai tính được cả.
 
Upvote 0
Tôi không thấy chỉ số cột và hàng của K1 và K2. Cụ thể, ô B69 của ma trận K có chỉ số cột là u3 và u3, có thể ký hiệu là K(u3, u3).
Còn bạn thử nói ô G26 của K1 có chỉ số cột là gì và dòng là gì? không có các thông số đó, thì không ai tính được cả.

cảm ơn mọi người đã quan tâm.

Chỉ số của hai ma trận k1, k2 ở dạng mảng. Mọi người xem tiếp phần giải thích trong file excel đính kèm (trong sheet Giai Thich).
 

File đính kèm

  • Giai Thich-Complicated How.rar
    113.1 KB · Đọc: 57
Lần chỉnh sửa cuối:
Upvote 0
Xem thử file đính kèm. Đúng là điên cái đầu: Tham số dòng không tô màu theo dòng mà tô màu theo cột. Ngược lại tham số cột lại tô màu theo dòng. Ai đọc mà hiểu ngay thì tui chết lền.
Thêm file giải thích thì lại càng làm cho tăm tối thêm

PHP:
Option Base 1
'' ..............
Function Matrix(sRow, sCol, RngK1, RowK1, ColK1, RngK2, RowK2, ColK2)
Dim ArrRngK1, ArrRngK2, ArrRowK1, ArrColK1, ArrRowK2, ArrColK2
Set ArrRngK1 = RngK1: Set ArrRngK2 = RngK2
Set ArrRowK1 = RowK1: Set ArrColK1 = ColK1
Set ArrRowK2 = RowK2: Set ArrColK2 = ColK2
Matrix = 0
For i = 1 To ArrRowK1.Rows.Count
    For j = 1 To ArrRowK1.Columns.Count
        If ArrRowK1(i, j) = sRow Then
            For l = 1 To ArrColK1.Columns.Count
                For k = 1 To ArrColK1.Rows.Count
                    If ArrColK1(k, l) = sCol Then
                        Matrix = Matrix + ArrRngK1(i, l)
                        Exit For
                    End If
                Next
            Next
            Exit For
        End If
    Next
Next
            
For x = 1 To ArrRowK2.Rows.Count
    For y = 1 To ArrRowK2.Columns.Count
        If ArrRowK2(x, y) = sRow Then
            For t = 1 To ArrColK2.Columns.Count
                For z = 1 To ArrColK2.Rows.Count
                    If ArrColK2(z, t) = sCol Then
                        Matrix = Matrix + ArrRngK2(x, t)
                        Exit For
                    End If
                Next
            Next
            Exit For
        End If
    Next
Next
        
End Function
Có 1 vấn đề:
Thí dụ ô K(u3, v3) tức là ô C85, tìm thấy 1 giá trị u3 ở bảng tham số dòng K1 và một giá trị tương ứng v3 ở bảng tham số cột. Nhưng qua bảng K2, tìm thấy 2 u3 ở bảng tham số dòng và 2 v3 ở bảng tham số cột.

Vậy kết quả là 1 ô ở K1 cộng với 4 ô ở K2, chứ không phải 1 ô K1 và 2 ô K2. (công thức ô mẫu C69)

Thế thì, giải quyết làm sao?
 
Lần chỉnh sửa cuối:
Upvote 0
Nảy sinh vấn đề là không chỉ 1 điều kiện chỉ số dòng, cột, mà thêm 1 điều kiện là phần tử. Thêm 1 cái muốn điên lên là các chỉ số dòng, cột (u3, u5, ..., v3, v5, ...) không giống nhau giữa các bảng, lúc thì có khoảng trắng, lúc thì không. Hàm ra kết quả sai, tìm muốn khùng.

Tạm thời sửa code cũ, chắc sẽ tìm ra cách giảm số lần lặp sau vậy.

PHP:
Function Matrix(sRow, sCol, RngK1, RowK1, ColK1, RngK2, RowK2, ColK2)
Dim ArrRngK1, ArrRngK2, ArrRowK1, ArrColK1, ArrRowK2, ArrColK2
 ArrRngK1 = RngK1:  ArrRngK2 = RngK2
 ArrRowK1 = RowK1:  ArrColK1 = ColK1
 ArrRowK2 = RowK2:  ArrColK2 = ColK2
Matrix = 0
For i = 1 To RowK1.Rows.Count - 1
    For j = 1 To RowK1.Columns.Count
        If ArrRowK1(i, j) = sRow Then
            phantu = ArrRowK1(RowK1.Rows.Count, j)
            For l = 1 To ColK1.Columns.Count - 1
                For k = 1 To ColK1.Rows.Count
                    If ArrColK1(k, l) = sCol And ArrColK1(k, ColK1.Columns.Count) = phantu Then
                        Matrix = Matrix + ArrRngK1(i, l)
                        phantu = ""
                        Exit For
                    End If
                Next
            Next
            Exit For
        End If
    Next
Next
            
For x = 1 To RowK2.Rows.Count - 1
    For y = 1 To RowK2.Columns.Count
        If ArrRowK2(x, y) = sRow Then
            phantu = ArrRowK2(RowK2.Rows.Count, y)
            For t = 1 To ColK2.Columns.Count - 1
                For z = 1 To ColK2.Rows.Count
                    If ArrColK2(z, t) = sCol And ArrColK2(z, ColK2.Columns.Count) = phantu Then
                        Matrix = Matrix + ArrRngK2(x, t)
                        phantu = ""
                        Exit For
                    End If
                Next
            Next
            Exit For
        End If
    Next
Next
        
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Cải tiến không dùng mảng và For quét từng phần tử của 4 mảng nữa, mà dùng phương thức Find và Match. Vì đã có thêm điều kiện trùng phần tử, chỉ cần tìm thấy tham số dòng là biết vị trí của tham số cột. Tốc độ nhanh gấp 7 lần (test với 20.000 cell)

PHP:
Function Matrix2(sRow, sCol, RngK1, RowK1, ColK1, RngK2, RowK2, ColK2)
Dim ArrRngK1, ArrRngK2, ArrRowK1, ArrColK1, ArrRowK2, ArrColK2
Dim PTD1, PTD2, PTC1, PTC2, vitriPTDong, vitriPTCot, phantu, ColIndex

Set ArrRngK1 = RngK1: Set ArrRngK2 = RngK2
Set ArrRowK1 = RowK1.Resize(1): Set ArrColK1 = ColK1.Resize(1)
Set PTD1 = RowK1.Resize(1).Offset(RowK1.Rows.Count - 1, 0)
Set PTC1 = ColK1.Resize(, 1).Offset(0, ColK1.Columns.Count - 1)
Set ArrRowK2 = RowK2.Resize(1): Set ArrColK2 = ColK2.Resize(1)
Set PTD2 = RowK2.Resize(1).Offset(RowK2.Rows.Count - 1, 0)
Set PTC2 = ColK2.Resize(, 1).Offset(0, ColK2.Columns.Count - 1)

Matrix2 = 0
For i = 0 To RowK1.Rows.Count - 2
    If Not ArrRowK1.Offset(i, 0).Find(sRow) Is Nothing Then
        vitriPTDong = Application.Match(sRow, ArrRowK1.Offset(i, 0), 0)
        phantu = PTD1(1, vitriPTDong)
        vitriPTCot = Application.Match(phantu, PTC1, 0) - 1
        If Not ArrColK1.Offset(vitriPTCot, 0).Find(sCol) Is Nothing Then
            ColIndex = Application.Match(sCol, ArrColK1.Offset(vitriPTCot, 0), 0)
            Matrix2 = Matrix2 + RngK1(i + 1, ColIndex)
        End If
    End If
    vitriPTDong = "": vitriPTCot = "": phantu = "": ColIndex = ""
Next

For i = 0 To RowK2.Rows.Count - 2
    If Not ArrRowK2.Offset(i, 0).Find(sRow) Is Nothing Then
        vitriPTDong = Application.Match(sRow, ArrRowK2.Offset(i, 0), 0)
        phantu = PTD2(1, vitriPTDong)
        vitriPTCot = Application.Match(phantu, PTC2, 0) - 1
        If Not ArrColK2.Offset(vitriPTCot, 0).Find(sCol) Is Nothing Then
            ColIndex = Application.Match(sCol, ArrColK2.Offset(vitriPTCot, 0), 0)
            Matrix2 = Matrix2 + RngK2(i + 1, ColIndex)
        End If
    End If
    vitriPTDong = "": vitriPTCot = "": phantu = "": ColIndex = ""
Next
End Function
 

File đính kèm

  • ComplicatedPtm03.rar
    29 KB · Đọc: 61
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom