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
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òn nếu như thứ tự đảo lộn hoặc bị xen kẽ?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ó 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ỉ?
Cái này đâu cần phải dùng vbaMì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 !
=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ệcCá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ó thể tối ưu hóa hàm trên không bác ?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?
Em cũng ngâm cứu xem thế nào. Cám ơn bác !Phải đợi sau 12 giờ mới viết nha Sơn.
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
Quả thực, em cam ơn bác ptm0412 nhiều nhiều ạ.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.
Call xoadong(A(), n, m, 3)
Call xoacot(A(), n, m, 4)
Call xuat2(A(), n, m)
Call xoadong(A(), n, m, dong)
Call xoacot(A(), n, m, cot)
Call xuat2(A(), n, m)
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?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 !
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)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?
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 1
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 2