Ma trận trong VBA

Phanvuhaiduong

Thành viên mới
Tham gia ngày
18 Tháng tư 2017
Bài viết
49
Được thích
2
Điểm
165
Tuổi
22
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

Phanvuhaiduong

Thành viên mới
Tham gia ngày
18 Tháng tư 2017
Bài viết
49
Được thích
2
Điểm
165
Tuổi
22
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ả
 

huuthang_bd

Chuyên gia GPE
Tham gia ngày
10 Tháng chín 2008
Bài viết
7,204
Được thích
8,138
Điểm
860
Nơi ở
TP.HCM
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
...
 

Phanvuhaiduong

Thành viên mới
Tham gia ngày
18 Tháng tư 2017
Bài viết
49
Được thích
2
Điểm
165
Tuổi
22
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
...
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 ạ
 

Phanvuhaiduong

Thành viên mới
Tham gia ngày
18 Tháng tư 2017
Bài viết
49
Được thích
2
Điểm
165
Tuổi
22
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ờ
 

phuocam

Thành viên mới
Tham gia ngày
16 Tháng năm 2013
Bài viết
2,330
Được thích
3,069
Điểm
560
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
 

huuthang_bd

Chuyên gia GPE
Tham gia ngày
10 Tháng chín 2008
Bài viết
7,204
Được thích
8,138
Điểm
860
Nơi ở
TP.HCM
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ả.
 

VetMini

Gian hùng bàn phiếm (thành viên trôi nước)
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
7,415
Được thích
8,720
Điểm
560
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.
 

Phanvuhaiduong

Thành viên mới
Tham gia ngày
18 Tháng tư 2017
Bài viết
49
Được thích
2
Điểm
165
Tuổi
22
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
 

buiquangthuan

Quyết tâm học để biết đến VBA
Tham gia ngày
17 Tháng mười hai 2010
Bài viết
235
Được thích
63
Điểm
395
Nơi ở
Bắc Ninh

Phanvuhaiduong

Thành viên mới
Tham gia ngày
18 Tháng tư 2017
Bài viết
49
Được thích
2
Điểm
165
Tuổi
22
đú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

CHAOQUAY

Thành viên tích cực
Tham gia ngày
24 Tháng tám 2018
Bài viết
845
Được thích
812
Điểm
360
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
 

Phanvuhaiduong

Thành viên mới
Tham gia ngày
18 Tháng tư 2017
Bài viết
49
Được thích
2
Điểm
165
Tuổi
22
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:

CHAOQUAY

Thành viên tích cực
Tham gia ngày
24 Tháng tám 2018
Bài viết
845
Được thích
812
Điểm
360
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
 

CHAOQUAY

Thành viên tích cực
Tham gia ngày
24 Tháng tám 2018
Bài viết
845
Được thích
812
Điểm
360
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
 
Top Bottom