Hàm VBA thao tác với ma trận

Liên hệ QC

NguyenNgocSon

KEEP WALKING
Tham gia
4/4/08
Bài viết
280
Được thích
832
Nghề nghiệp
Ths. Cầu hầm
Mình có vấn đề thao tác với mảng như file
không biết có cách nào giải quyết vấn đề này ?
Thân !
 

File đính kèm

  • Thao tac mang.xls
    33.5 KB · Đọc: 53
Có ngay 1 hàm, nhưng chưa tối ưu

PHP:
Function Matrix(Rng As Range, ColTitle1 As Range, RwTitle1 As Range, ColTitle2 As Range, RwTitle2 As Range) As Variant
Dim TmpArr(), SArr()
SaR = RwTitle1.Count: SaC = ColTitle1.Count
ReDim SArr(1 To SaR, 1 To SaC)
TmpR = RwTitle2.Count: TmpC = ColTitle2.Count
ReDim TmpArr(1 To TmpR, 1 To TmpC)
SArr = Rng.Value
For i = 1 To TmpC
    For j = 1 To TmpR
        For k = 1 To SaC
            For h = 1 To SaR
                If RwTitle1(h, 1) = RwTitle2(j, 1) And ColTitle1(1, k) = ColTitle2(1, i) Then
                    TmpArr(j, i) = SArr(h, k): GoTo next2
                End If
            Next
        Next
next2:
    Next
Next
Matrix = TmpArr
End Function

Được cái có thể dùng với thứ tự các cột, dòng bất kỳ của kết quả.

ColTitle1, RwTitle1, ColTitle2, RwTitle2 là gì chắc không cần giải thích nhỉ?
 

File đính kèm

  • HamXulyMang.xls
    43.5 KB · Đọc: 56
Lần chỉnh sửa cuối:
Upvote 0
Theo tôi nghĩ bài này nên viết một hàm xoá hàng và 1 hàng xoá cột trong mảng 2 chiều, sau đó gộp chung lại thành hàm xoá, như vậy mỗi lần mình gọi hàm xoá tại vị trí hàng và vị trí cột thì nó sẻ thực thi ngay, hôm nào rảnh tôi sẽ viết một hàm để gởi lên GPE
 
Upvote 0
Theo tôi nghĩ bài này nên viết một hàm xoá hàng và 1 hàng xoá cột trong mảng 2 chiều, sau đó gộp chung lại thành hàm xoá, như vậy mỗi lần mình gọi hàm xoá tại vị trí hàng và vị trí cột thì nó sẻ thực thi ngay, hôm nào rảnh tôi sẽ viết một hàm để gởi lên GPE
Còn nếu như thứ tự đảo lộn hoặc bị xen kẽ?
 
Upvote 0
mình có thể xoá 1 hàng và 1 cột bất kỳ trong ma trận 2 chiều, vì dạng này em làm rất nhiều trong C++
 
Upvote 0
Thứ nhất: Xoá hàng xoá cột, không phải hàm, mà là thủ tục.
Thứ 2: Khi thứ tự đảo lộn thì không phải xoá cột xoá dòng, mà là sắp xếp theo thứ tự mới
Thứ 3: Khi bị dòng cột khác xen kẽ, thì phải chèn dòng, chèn cột, chứ không phải xoá.
Thứ 4: Khi vừa có số cột dòng ít hơn, vừa bị đảo lộn thứ tự, vừa bị dòng cột khác xen kẽ, thì thuật toán này phá sản.
 
Upvote 0
Có ngay 1 hàm, nhưng chưa tối ưu

PHP:
Function Matrix(Rng As Range, ColTitle1 As Range, RwTitle1 As Range, ColTitle2 As Range, RwTitle2 As Range) As Variant
Dim TmpArr(), SArr()
SaR = RwTitle1.Count: SaC = ColTitle1.Count
ReDim SArr(1 To SaR, 1 To SaC)
TmpR = RwTitle2.Count: TmpC = ColTitle2.Count
ReDim TmpArr(1 To TmpR, 1 To TmpC)
SArr = Rng.Value
For i = 1 To TmpC
    For j = 1 To TmpR
        For k = 1 To SaC
            For h = 1 To SaR
                If RwTitle1(h, 1) = RwTitle2(j, 1) And ColTitle1(1, k) = ColTitle2(1, i) Then
                    TmpArr(j, i) = SArr(h, k): GoTo next2
                End If
            Next
        Next
next2:
    Next
Next
Matrix = TmpArr
End Function

Được cái có thể dùng với thứ tự các cột, dòng bất kỳ của kết quả.

ColTitle1, RwTitle1, ColTitle2, RwTitle2 là gì chắc không cần giải thích nhỉ?

Em check thử có vẻ đáp ứng yêu cầu. Em sẽ kiểm tra thêm nhờ các bác giúp đỡ.
 
Upvote 0
Mình có vấn đề thao tác với mảng như file
không biết có cách nào giải quyết vấn đề này ?
Thân !
Cái này đâu cần phải dùng vba
hlookup cũng vẫn giải quyết được mà
PHP:
=IFERROR(HLOOKUP(H$11,$B$11:$F$15,MATCH($L12,$F$11:$F$15,0),0),0)
 

File đính kèm

  • HamXulyMang.rar
    17.8 KB · Đọc: 33
Lần chỉnh sửa cuối:
Upvote 0
Hlookup 1 Match, Index 2 Match đều được cả. Nhưng nếu không có IfError của 2007 thì công thức dài ngoằng.
Vả lại, tác giả post bài box lập trình phải có nguyên do.
Lão chết tiệt viết hàm VBA cũng có nguyên do.
Bây giờ đố mấy trò của lão chết tiệt làm cách nào giảm thiểu số vòng lặp của 4 cái For next?
 
Lần chỉnh sửa cuối:
Upvote 0
Cái này đâu cần phải dùng vba
hlookup cũng vẫn giải quyết được mà
PHP:
=IFERROR(HLOOKUP(H$11,$B$11:$F$15,MATCH($L12,$F$11:$F$15,0),0),0)
Cám ơn Bác. Đúng là Em muốn viết hàm để xử lý trong trường hợp này để ứng dụng cho công việc
Thân !
 
Upvote 0
Hlookup 1 Match, Index 2 Match đều được cả. Nhưng nếu không có IfError của 2007 thì công thức dài ngoằng.
Vả lại, tác giả post bài box lập trình phải có nguyên do.
Lão chết tiệt viết hàm VBA cũng có nguyên do.
Bây giờ đố mấy trò của lão chết tiệt làm cách nào giảm thiểu số vòng lặp của 4 cái For next?
Có thể tối ưu hóa hàm trên không bác ?
Như sau :
+ Vì ColTitle1 =TRANSPOSE(RwTitle1)
+ Vì ColTitle2 =TRANSPOSE(RwTitle2)
Nên mình xử lý luôn chỗ này
+ Mình định trước cấp của ma trận đích (ví dụ cấp 5x5) nên ColTitle2 =TRANSPOSE(RwTitle2) có thể lấy ra được luôn ma trận chỉ số từ điều kiện này ạ
Cám ơn Bác !
 
Upvote 0
Phải đợi sau 12 giờ mới viết nha Sơn.
 
Upvote 0
Chỉ có thể giảm số lượng tham số đầu vào thôi. Tuy vậy đã giảm thiểu số vòng lặp.
PHP:
Function Matrix2(Rng As Range, ColTitle1 As Range, ColTitle2 As Range)
Dim TmpArr(), SArr(), RwTitle1, RwTitle2
SArrSize = ColTitle1.Count
ReDim SArr(1 To SArrSize, 1 To SArrSize)
TmpArrSize = ColTitle2.Count
ReDim TmpArr(1 To TmpArrSize, 1 To TmpArrSize)
SArr = Rng.Value
RwTitle1 = Application.Transpose(ColTitle1)
RwTitle2 = Application.Transpose(ColTitle2)
For i = 1 To TmpArrSize
    For j = 1 To TmpArrSize
        For k = 1 To SArrSize
            If ColTitle1(1, k) = ColTitle2(1, i) Then
                For h = 1 To SArrSize
                    If RwTitle1(h, 1) = RwTitle2(j, 1) Then
                        TmpArr(j, i) = SArr(h, k): Exit For
                    End If
                Next
            Exit For
            End If
        Next
    Next
Next
Matrix2 = TmpArr
End Function

Đọc lẹ copy lẹ, kẻo nghẽn mạng, chưa 12 giờ nhưng bùn ngủ rồi.
 

File đính kèm

  • HamXulyMang.rar
    13.6 KB · Đọc: 26
Lần chỉnh sửa cuối:
Upvote 0
Dạ để trong tuần này em rảnh em làm thử xem có được hay không? dù không được thì mình cũng học hỏi được gì từ thất bại này
 
Upvote 0
Tối ưu hóa hàm Matrix2 ?

Chỉ có thể giảm số lượng tham số đầu vào thôi. Tuy vậy đã giảm thiểu số vòng lặp.
Đọc lẹ copy lẹ, kẻo nghẽn mạng, chưa 12 giờ nhưng bùn ngủ rồi.
Quả thực, em cam ơn bác ptm0412 nhiều nhiều ạ.
Hiện tại có 1 vấn đề nữa phát sinh em muốn giải quyết dựa trên Code trên. Bác thử xem qua giúp em xem thế nào nhé ( File đính kèm )
Chúc bác luôn khỏe, công tác tốt
Thân !
 

File đính kèm

  • HamXulyMang(Cai tien).xls
    50.5 KB · Đọc: 12
Upvote 0
Xin các Mod giải thích dùm hàm xoá dòng xóa cột bị lỗi chỗ nào?
nếu như truyền tham trị trực tiếp như vậy thì chạy OK
Mã:
Call xoadong(A(), n, m, 3)
Call xoacot(A(), n, m, 4)
Call xuat2(A(), n, m)

còn như truyền như vậy thì bào lỗi
Mã:
Call xoadong(A(), n, m, dong)
Call xoacot(A(), n, m, cot)
Call xuat2(A(), n, m)
với dong cot được nhập từ bàn phím
xin chân thành cảm ơn
bài này không có bẫy lỗi gì cả chỉ là bài dạng thô thôi, xin cảm ơn
 

File đính kèm

  • xoahangcot.rar
    21.5 KB · Đọc: 10
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Quả thực, em cam ơn bác ptm0412 nhiều nhiều ạ.
Hiện tại có 1 vấn đề nữa phát sinh em muốn giải quyết dựa trên Code trên. Bác thử xem qua giúp em xem thế nào nhé ( File đính kèm )
Chúc bác luôn khỏe, công tác tốt
Thân !
Sơn muốn gộp thành 1 hàm, hay muốn để riêng hàm trên, muốn cộng thì cộng, muốn trừ thì trừ, muốn nối chuỗi thì nối chuõi?
Hay làmuốn phối hợp: vhuổi thì nối, số thì cộng?
 
Upvote 0
Sơn muốn gộp thành 1 hàm, hay muốn để riêng hàm trên, muốn cộng thì cộng, muốn trừ thì trừ, muốn nối chuỗi thì nối chuõi?
Hay làmuốn phối hợp: vhuổi thì nối, số thì cộng?
Em muốn phối hợp anh ạ; và thao tác trong 1 hàm luôn có được không ạ ? ( Nếu đã viết hàm thì mình có thể viết cho trường hộp gồm n ma trận cộng vào ko)
Em cám ơn
 
Upvote 0
Ủa sao kỳ vậySơn, cộng 2ma trận mà không cộng thứ tự gì hết?
Lẽ ra A(m, n) + B(m, n) = C(m, n)
C(i, j) = A(i, j) + B(i, j) chứ?
 
Upvote 0
Web KT
Back
Top Bottom