Ma trận trong VBA

Liên hệ QC

Phanvuhaiduong

Thành viên chính thức
Tham gia
18/4/17
Bài viết
65
Được thích
2
Kính thưa các bác, các chú và các sư nương
Em có chút vấn đề với VBA cho mấy cái ma trận
Em muốn nhân lặp lại hàng trăm các ma trận sau đó cộng tổng các ma trận đó lại, ở đây em ví dụ là 3 ma trận ạ. Thế nhưng em mới viết code được cho 2 ma trận đầu tiên nhân với nhau, Các bác chỉ lối giúp em với ạ, mới học VBA được mấy ngày mà váng đầu quá.
Chi tiết trong file đính kèm.
 

File đính kèm

  • MT.xlsm
    18.5 KB · Đọc: 18
Gợi ý:
Mã:
Sub ABC()
MaTran = [F1:f4]
MaTran = Application.MMult([A1:D4], [F1:f4])
MaTran = Application.MMult([A8:D11], [F1:f4])
End Sub
Đây là các ma trận khác nhau, nếu chúng giống nhau thì viết thế nào ạ
Ý này là sao bạn?
 
Gợi ý:
Mã:
Sub ABC()
MaTran = [F1:f4]
MaTran = Application.MMult([A1:D4], [F1:f4])
MaTran = Application.MMult([A8:D11], [F1:f4])
End Sub

Ý này là sao bạn?
Là sao ạ bác, F(1:4) là giá trị ban đầu cho trước rồi ạ, em muốn nhân ([A1:D4]x[F1:f4]) cho kết quả ra F(8:11)
sau đó [A8:D11]x[F8:11]) lại cho ra kết quả xuống dưới là F(15:18) ........
Lại tiếp tục kiểu như thế ấy ạ
Bài đã được tự động gộp:

Là sao ạ bác, F(1:4) là giá trị ban đầu cho trước rồi ạ, em muốn nhân ([A1:D4]x[F1:f4]) cho kết quả ra F(8:11)
sau đó [A8:D11]x[F8:11]) lại cho ra kết quả xuống dưới là F(15:18) ........
Lại tiếp tục kiểu như thế ấy ạ
Hàm của bác chạy chả ra kết quả gì cả
 
Là sao ạ bác, F(1:4) là giá trị ban đầu cho trước rồi ạ, em muốn nhân ([A1:D4]x[F1:f4]) cho kết quả ra F(8:11)
sau đó [A8:D11]x[F8:11]) lại cho ra kết quả xuống dưới là F(15:18) ........
Lại tiếp tục kiểu như thế ấy ạ
Vậy thì cần gì VBA?
Chọn F8:F11
Nhập
Mã:
=MMULT(A1:D4,F1:F4)
Nhấn Ctrl + Shift + Enter
Copy F8:F11 dán vào F15:F18
...
 
100 hay 1000 thì cũng chỉ mất vài giây thôi.
Bạn đã nói như vậy thì thôi vậy :))
Hihi , lỡ làm tự ái bác rồi, em đã viết rất rõ và kỹ cái khúc mắc của em trong file cũng như trên web, vậy mà bác trả lời không đúng ý em, để rồi giận dỗi như bây giờ
 
Thử:
Mã:
Sub Matrix()
Dim i&, lr&
    lr = Range("A" & Rows.Count).End(xlUp).Row
    For i = 1 To lr Step 7
        With Range("F" & i).Offset(7, 0).Resize(4, 1)
            .FormulaArray = "=MMULT(" & Range("A" & i).Resize(4, 4).Address & "," & Range("F" & i).Resize(4, 1).Address & ")"
            .Value = .Value
        End With
    Next i
End Sub
 
Hàm của bác chạy chả ra kết quả gì cả
copy dán thì nói làm gì ạ, vậy có cả trăm cái ma trận cứ copy vậy ạ, em đang lấy ví dụ là 3 cái ma trận thôi ạ
Hihi , lỡ làm tự ái bác rồi, em đã viết rất rõ và kỹ cái khúc mắc của em trong file cũng như trên web, vậy mà bác trả lời không đúng ý em, để rồi giận dỗi như bây giờ
Tôi chả dại gì mà giận dỗi cả :D
Có hứng thì tôi giúp, mất hứng thì tôi thôi. Vậy thôi, tôi chả được hay mất cái gì cả.
 
Cả trăm cái ma trận thì dùng Excel là sai rồi.
Đây là công việc chuyên của những thứ có hổ trợ của dân toán như MatLab, Python, ...

Hàng trăm ma trận code chạy không nổi đâu.
Hàng này chỉ có dân chuyên toán người ta dùng kỹ thuật chẻ nó ra tính theo vec tơ mới có thể tối ưu sử dụng bộ nhớ và tốc độ.
Excel cũng có kỹ thuật tối ưu, nhưng nó là đồ chuyên tài chính kế toán nên việc sử dụng bộ nhớ của nó hơi kém.
 
Thử:
Mã:
Sub Matrix()
Dim i&, lr&
    lr = Range("A" & Rows.Count).End(xlUp).Row
    For i = 1 To lr Step 7
        With Range("F" & i).Offset(7, 0).Resize(4, 1)
            .FormulaArray = "=MMULT(" & Range("A" & i).Resize(4, 4).Address & "," & Range("F" & i).Resize(4, 1).Address & ")"
            .Value = .Value
        End With
    Next i
End Sub
đúng ý em rồi anh Phước ạ
anh có thể giải thích cho em một chút là dạng (Dim i&,Ir& ) nó là cái dạng khai báo gì vậy anh
Bài đã được tự động gộp:

Thử:
Mã:
Sub Matrix()
Dim i&, lr&
    lr = Range("A" & Rows.Count).End(xlUp).Row
    For i = 1 To lr Step 7
        With Range("F" & i).Offset(7, 0).Resize(4, 1)
            .FormulaArray = "=MMULT(" & Range("A" & i).Resize(4, 4).Address & "," & Range("F" & i).Resize(4, 1).Address & ")"
            .Value = .Value
        End With
    Next i
End Sub
Đoạn cốt của anh hơi cao siêu, khả năng em chưa đủ công lực thẩm thấu
 
đúng ý em rồi anh Phước ạ
anh có thể giải thích cho em một chút là dạng (Dim i&,Ir& ) nó là cái dạng khai báo gì vậy anh
Bài đã được tự động gộp:


Đoạn cốt của anh hơi cao siêu, khả năng em chưa đủ công lực thẩm thấu
Em muốn nhân liên tiếp như bên trong file này thì làm thế nào ạ
 

File đính kèm

  • MT.1.xlsm
    18.1 KB · Đọc: 7
Chạy code dưới đây
Mã:
Sub MMULT_()
Dim Arr0
Dim Arr1
Dim Arr01
Dim i, m
m = 2
With Sheet1
    Arr0 = .Range("A1").CurrentRegion
    Arr01 = .Range("F1").CurrentRegion
    For i = 1 To m
        Arr1 = Arr01
        Arr01 = WorksheetFunction.MMult(Arr0, Arr1)
    Next i
    .Range("H1").Resize(UBound(Arr0), 1) = Arr01
End With
End Sub
 
Chạy code dưới đây
Mã:
Sub MMULT_()
Dim Arr0
Dim Arr1
Dim Arr01
Dim i, m
m = 2
With Sheet1
    Arr0 = .Range("A1").CurrentRegion
    Arr01 = .Range("F1").CurrentRegion
    For i = 1 To m
        Arr1 = Arr01
        Arr01 = WorksheetFunction.MMult(Arr0, Arr1)
    Next i
    .Range("H1").Resize(UBound(Arr0), 1) = Arr01
End With
End Sub
Sub ABC()

Dim i, j As Integer
Dim a, d As Double


d1 = 0
d2 = 0
d3 = 0
d4 = 0




For i = 1 To 1

For j = 1 To 4


a1 = Sheets("MT").Cells(1, j)
a2 = Sheets("MT").Cells(2, j)
a3 = Sheets("MT").Cells(3, j)
a4 = Sheets("MT").Cells(4, j)

y = Sheets("MT").Cells(j, 6)


d1 = d1 + a1 * y
d2 = d2 + a2 * y
d3 = d3 + a3 * y
d4 = d4 + a4 * y


Sheets("MT").Cells(1, 8) = d1
Sheets("MT").Cells(2, 8) = d2
Sheets("MT").Cells(3, 8) = d3
Sheets("MT").Cells(4, 8) = d4



Next j
Next i





End Sub
Bác có thể giải thích giúp em , em dùng for next mà tại sao khi cho hiển thị tại cột H thì đúng mà chuyển sang cột F lại sai không ạ
Bài đã được tự động gộp:

Chạy code dưới đây
Mã:
Sub MMULT_()
Dim Arr0
Dim Arr1
Dim Arr01
Dim i, m
m = 2
With Sheet1
    Arr0 = .Range("A1").CurrentRegion
    Arr01 = .Range("F1").CurrentRegion
    For i = 1 To m
        Arr1 = Arr01
        Arr01 = WorksheetFunction.MMult(Arr0, Arr1)
    Next i
    .Range("H1").Resize(UBound(Arr0), 1) = Arr01
End With
End Sub
code này ok rồi ạ, nhưng mà hơi cao siêu, em dùng cái for next đơn thuần có làm được ko ạ
 
Lần chỉnh sửa cuối:
Bác có thể giải thích giúp em , em dùng for next mà tại sao khi cho hiển thị tại cột H thì đúng mà chuyển sang cột F lại sai không ạ
Bài đã được tự động gộp:


code này ok rồi ạ, nhưng mà hơi cao siêu, em dùng cái for next đơn thuần có làm được ko ạ
Bạn chạy thử chưa mà có chắc là cột H đúng hay không?
For Next được thôi
 
em chạy rồi, em test rồi em mới dám hỏi
Bạn chạy thử với 5 lần tính xem kết quả của bạn & của tôi có giống nhau hay không.
Bài đã được tự động gộp:

Code Vòng lặp
Mã:
Sub Super_Mmult()
Dim Arr0
Dim Arr1
Dim Arr01
Dim rws, cls
Dim i, j, k, m
m = 2
With Sheet1
    Arr0 = .Range("A1").CurrentRegion
    Arr01 = .Range("F1").CurrentRegion
    rws = UBound(Arr0)
    cls = UBound(Arr0, 2)
    For k = 1 To m
        Arr1 = Arr01
        For i = 1 To rws
            Arr01(i, 1) = 0
            For j = 1 To cls
                Arr01(i, 1) = Arr01(i, 1) + Arr0(i, j) * Arr1(j, 1)
            Next j
        Next i
    Next k
    .Range("H1").Resize(UBound(Arr0), 1) = Arr01
End With
End Sub
 
Web KT
Back
Top Bottom