Nhờ giải quyết bài toán về tổng Matrix (VBA hoặc Hàm(nếu có))

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

nguyenykt01

Thành viên mới
Tham gia
9/3/21
Bài viết
9
Được thích
0
Nhờ các Bác giải quyết bài toán về tổng Matrix (VBA hoặc Hàm(nếu có))
Em vắt óc mấy ngày rồi chưa có hướng giải quyết
Nên nay đăng bài nhờ sự trợ giúp
Em đang gặp vấn đề trong VBA ở bài toán này
Mong các bác chỉ giúp!
Em đính kèm file cho các bác tiện tham khảo
Em xin cảm ơn!
 

File đính kèm

  • Matrix Calc.xlsx
    9.7 KB · Đọc: 9
Nhờ các Bác giải quyết bài toán về tổng Matrix (VBA hoặc Hàm(nếu có))
Em vắt óc mấy ngày rồi chưa có hướng giải quyết
Nên nay đăng bài nhờ sự trợ giúp
Em đang gặp vấn đề trong VBA ở bài toán này
Mong các bác chỉ giúp!
Em đính kèm file cho các bác tiện tham khảo
Em xin cảm ơn!
.
Bài toán vô nghiệm. Hahaha ...

Bạn có biết tại sao nó vô nghiệm không?

.
 
Upvote 0
Dùng công thức , không ngẫu nhiên (như trong file)

Nếu muốn ngẫu nhiên thì dùng VBA nhé, chịu hôn?
 

File đính kèm

  • Matrix Calc_dafix.xlsx
    11.8 KB · Đọc: 7
Upvote 0
Dùng công thức , không ngẫu nhiên (như trong file)

Nếu muốn ngẫu nhiên thì dùng VBA nhé, chịu hôn?
Công thức này không chuẩn.
1676614975372.png
--
@nguyenykt01: Tặng bạn UDF này. Xem thử đúng ý chưa nhé.
Mã:
Function Matrix(aTotalRows As Variant, aTotalCols As Variant, dBase As Double, Optional ByVal lAdjTimes As Long = 100) As Variant
    Dim aResult As Variant
    Dim i As Long, j As Long, i1 As Long, i2 As Long, j1 As Long, j2 As Long, dMin As Double, dAdj As Double
    aTotalRows = aTotalRows
    aTotalCols = aTotalCols
    ReDim aResult(1 To UBound(aTotalRows, 1), 1 To UBound(aTotalCols, 2))
    For i = 1 To UBound(aResult, 1)
        For j = 1 To UBound(aResult, 2)
            aResult(i, j) = Application.Min(aTotalRows(i, 1), aTotalCols(1, j))
            aTotalRows(i, 1) = aTotalRows(i, 1) - aResult(i, j)
            aTotalCols(1, j) = aTotalCols(1, j) - aResult(i, j)
        Next
    Next
    Randomize
    If aTotalRows(UBound(aTotalRows, 1), 1) <> 0 Or aTotalCols(1, UBound(aTotalCols, 2)) <> 0 Then
        Matrix = CVErr(xlErrNA)
    Else
        For i = 1 To lAdjTimes
            GetRnd aResult, i1, j1
            GetRnd aResult, i2, j2
            dMin = Application.Min(aResult(i1, j1), aResult(i2, j2))
            dAdj = Round((Int(Rnd() * Round(dMin / dBase, 0)) + 1) * dBase, 6)
            If dAdj < 0 Then Debug.Print dAdj
            aResult(i1, j1) = Round(aResult(i1, j1) - dAdj, 6)
            aResult(i1, j2) = Round(aResult(i1, j2) + dAdj, 6)
            aResult(i2, j2) = Round(aResult(i2, j2) - dAdj, 6)
            aResult(i2, j1) = Round(aResult(i2, j1) + dAdj, 6)
        Next
        Matrix = aResult
    End If
End Function
Private Sub GetRnd(ByRef aResult As Variant, ByRef i As Long, ByRef j As Long)
    Dim k As Long
    Do
        i = Int(Rnd() * UBound(aResult, 1)) + 1
        j = Int(Rnd() * UBound(aResult, 2)) + 1
        k = k + 1
    Loop Until aResult(i, j) > 0 Or k > 1000
End Sub
 

File đính kèm

  • Matrix Calc_dafix.xlsm
    19.4 KB · Đọc: 19
Upvote 0
Công thức này không chuẩn.
View attachment 286621
--
@nguyenykt01: Tặng bạn UDF này. Xem thử đúng ý chưa nhé.
Mã:
Function Matrix(aTotalRows As Variant, aTotalCols As Variant, dBase As Double, Optional ByVal lAdjTimes As Long = 100) As Variant
    Dim aResult As Variant
    Dim i As Long, j As Long, i1 As Long, i2 As Long, j1 As Long, j2 As Long, dMin As Double, dAdj As Double
    aTotalRows = aTotalRows
    aTotalCols = aTotalCols
    ReDim aResult(1 To UBound(aTotalRows, 1), 1 To UBound(aTotalCols, 2))
    For i = 1 To UBound(aResult, 1)
        For j = 1 To UBound(aResult, 2)
            aResult(i, j) = Application.Min(aTotalRows(i, 1), aTotalCols(1, j))
            aTotalRows(i, 1) = aTotalRows(i, 1) - aResult(i, j)
            aTotalCols(1, j) = aTotalCols(1, j) - aResult(i, j)
        Next
    Next
    Randomize
    If aTotalRows(UBound(aTotalRows, 1), 1) <> 0 Or aTotalCols(1, UBound(aTotalCols, 2)) <> 0 Then
        Matrix = CVErr(xlErrNA)
    Else
        For i = 1 To lAdjTimes
            GetRnd aResult, i1, j1
            GetRnd aResult, i2, j2
            dMin = Application.Min(aResult(i1, j1), aResult(i2, j2))
            dAdj = Round((Int(Rnd() * Round(dMin / dBase, 0)) + 1) * dBase, 6)
            If dAdj < 0 Then Debug.Print dAdj
            aResult(i1, j1) = Round(aResult(i1, j1) - dAdj, 6)
            aResult(i1, j2) = Round(aResult(i1, j2) + dAdj, 6)
            aResult(i2, j2) = Round(aResult(i2, j2) - dAdj, 6)
            aResult(i2, j1) = Round(aResult(i2, j1) + dAdj, 6)
        Next
        Matrix = aResult
    End If
End Function
Private Sub GetRnd(ByRef aResult As Variant, ByRef i As Long, ByRef j As Long)
    Dim k As Long
    Do
        i = Int(Rnd() * UBound(aResult, 1)) + 1
        j = Int(Rnd() * UBound(aResult, 2)) + 1
        k = k + 1
    Loop Until aResult(i, j) > 0 Or k > 1000
End Sub
Rất cảm ơn bác. Vấn đề đã được giải quyết
Thông cảm cho em nay em mới về để xem được
 
Upvote 0
Web KT

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

Back
Top Bottom