Các phép tính ma trận trong Excel (6 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Hàm mảng người dùng đã có trên diễn đàn;

Nhưng đó là trả về mảng các giá trị cùng lúc, chứ không như bạn mô tả: trả về lần lượt theo từng đối số nhận được;

Bạn có thể đưa ra ví dụ cụ thể hơn được không? Nãy giờ chúng ta nói suông không à, hơn chán, bạn nhỉ?!

Ví dụ hàm mảng giải phương trình bậc 2, như sau:
Cú pháp hàm : =PTB2(Aa As Double, Bb As Double, Cc As Double) As Variant

Khi đó, bạn chọn 3 ô (ví dụ A1:C1), nhập vô thanh công thức =PTB2(1, -3, 2) & kết thúc bằng tổ hợp fím dành cho hàm mảng ta sẽ thu được nghiệm trên các ô đã chọn.

Còn sau khi đọc iêu cầu của bạn, mình thấy hình như bạn cần là 1 macro thì đúng hơn!

Hãy thảo luận tiếp nha!


Đúng là ý mình thế mà. Mình muốn chỉ viết công thức 1 lần để nó trả về cùng 2 giá trị một lúc. Mình gửi kèm theo đây file ví dụ với nội dung như thế này:
- Mình có một danh sách các trạm (vị trí) có tọa độ (kinh độ và vĩ độ). Đối với mỗi vị trí, mình muốn tìm vị trí gần nó nhất và cự ly giữa các vị trí ấy. Có thể viết 2 hàm khác nhau cho 2 cột để đưa ra 2 yêu cầu khác nhau ấy nhưng như thế sẽ phải chạy hàm chính 2 lần làm cho chương trình chạy chậm lại. Nếu có thể trả về đồng thời 2 giá trị ấy thì sẽ không phải chạy hàm 2 lần.
- Vì mình không thể attack đc file nên mình gửi lên host khác và post link tại đây. Mong bạn down file dùm.
http://rapidshare.com/files/331125593/Khoang_cach.xls.html


P/s: Vì là file ví dụ nên số lượng trạm ít nhưng khi số lượng lên đến vài nghìn thậm chí vài chục nghìn trạm thì việc tính toán sẽ rất tốn thời gian
P/s2: Có ai có thể giúp mình xem tại sao mình không thể attack file lên đc. Toàn báo fail thôi &&&%$R
 
Bạn thử kiểm lại theo cách tính mình đúng chưa nha! Thật ra mình theo cảm tính thôi!

Đúng là ý mình thế mà. Mình muốn chỉ viết công thức 1 lần để nó trả về cùng 2 giá trị một lúc. Mình gửi kèm theo đây file ví dụ với nội dung như thế này:
- Mình có một danh sách các trạm (vị trí) có tọa độ (kinh độ và vĩ độ). Đối với mỗi vị trí, mình muốn tìm vị trí gần nó nhất và cự ly giữa các vị trí ấy.


PHP:
Option Explicit:           Option Base 1
Function TramGanNhat(Tram As Range, LookupRange As Range)
 Dim Long_ As Double, Lat_ As Double, Min_ As Double, Temp As Double
 Dim Xx As Double, yY As Double
 Dim Clls As Range:                          Dim MyAdd As String
 
 Long_ = Tram.Offset(, 1).Value:             Lat_ = Tram.Offset(, 2).Value
 Min_ = 10 ^ 6
 For Each Clls In LookupRange.Cells(1, 1).Resize(LookupRange.Rows.Count)
   If Clls.Value <> Tram.Value Then
      Xx = Clls.Offset(, 1).Value:           yY = Clls.Offset(, 2).Value
      Temp = Abs(((Xx - Long_) ^ 2 + (yY - Lat_) ^ 2) ^ (1 / 2))
      If Temp < Min_ Then
         Min_ = Temp:                        MyAdd = Clls.Address
      End If
   End If
 Next Clls
 ReDim MDL(1, 2) As Variant
 MDL(1, 1) = MyAdd:                          MDL(1, 2) = Min_
 TramGanNhat = MDL
End Function
 

File đính kèm

PHP:
Option Explicit:           Option Base 1
Function TramGanNhat(Tram As Range, LookupRange As Range)
 Dim Long_ As Double, Lat_ As Double, Min_ As Double, Temp As Double
 Dim Xx As Double, yY As Double
 Dim Clls As Range:                          Dim MyAdd As String
 
 Long_ = Tram.Offset(, 1).Value:             Lat_ = Tram.Offset(, 2).Value
 Min_ = 10 ^ 6
 For Each Clls In LookupRange.Cells(1, 1).Resize(LookupRange.Rows.Count)
   If Clls.Value <> Tram.Value Then
      Xx = Clls.Offset(, 1).Value:           yY = Clls.Offset(, 2).Value
      Temp = Abs(((Xx - Long_) ^ 2 + (yY - Lat_) ^ 2) ^ (1 / 2))
      If Temp < Min_ Then
         Min_ = Temp:                        MyAdd = Clls.Address
      End If
   End If
 Next Clls
 ReDim MDL(1, 2) As Variant
 MDL(1, 1) = MyAdd:                          MDL(1, 2) = Min_
 TramGanNhat = MDL
End Function


Thật sự là mình rất rất cảm ơn bạn HYen17 đã cho mình đoạn code thật sự rất đơn giản và đúng là cái mà mình đang cần.
Tuy nhiên bạn có thể cho mình hỏi một số điểm mà thật sự mình chưa hiểu hết về đoạn code này:
1. Câu lệnh "For Each Clls In LookupRange.Cells(1, 1).Resize(LookupRange.Rows.Count)" bản chất của nó là gì hả bạn? Mình có thể hiểu là lặp lại với mỗi một cell trong cái lookuprange nhưng phần sau từ chỗ resize thì mình chịu, chẳng hiểu mô tê gì nữa cả :-=
2. phần ở dưới cùng ReDim MDL(1, 2) As Variant. Tại sao lại dùng Redim hả bạn :-=. vì biến MDL mình đã dùng đến bao h đâu?
3. Trong file bạn gửi kèm theo có thêm cái sub cuối cùng (Sub Mmm(): End Sub) mình không biết nó có ý nghĩa gì không?
4. Còn câu này có lẽ hơi ngớ ngẩn :-=. Mình thấy nhiều khi trên cùng 1 dòng bạn viết 2 câu lệnh ngăn cách nhau bởi dấu ":". Cho mình hỏi nó có khác gì với việc mình viết trên cùng một dòng không hả bạn?

Mình viết code cho excel cũng nhiều nhưng thực sự mình viết thuần VB quá. Hôm nay mới đc mở mang tầm mắt, dùng nhiều cái có sẵn trong excel hỗ trợ cho mình.
Một lần nữa thanks bạn nhiều nhiều.}}}}}

À, còn cái mà bạn nói là tổ hợp phím dành cho mảng có phải là Ctrl+Shift+Enter không hả bạn :-=. Mình không biết tổ hợp phím này, dùng file của bạn mãi mà không trả về 2 giá trị đc, hỏi cụ Google mãi mới biết nhưng không biết liệu đã chuẩn chưa. Mong bạn chỉ giáo thêm
 
Thật ra ban đầu mình không muốn trả lời bài này, vì

Bạn đưa lên tại 2 nơi cùng 1 nội dung
http://giaiphapexcel.com/forum/showthread.php?t=32427
1. Câu lệnh "For Each Clls In LookupRange.Cells(1, 1).Resize(LookupRange.Rows.Count)" bản chất của nó là gì hả bạn? Mình có thể hiểu là lặp lại với mỗi một cell trong cái lookuprange nhưng phần sau từ chỗ resize thì mình chịu, chẳng hiểu mô tê gì nữa cả

Câu này có nghĩa là lặp lại với ô đầu tiên của vùng LookUpRange, nhưng mở rọng với số hàng = với số hàng tính được của LookUpRange
(Thực chất là vùng cột đầu tiên của LookUpRange đó mà.

2. phần ở dưới cùng ReDim MDL(1, 2) As Variant. Tại sao lại dùng Redim hả bạn. vì biến MDL mình đã dùng đến bao h đâu?

Bạn muốn ngâm cứu về mảng thì tự ngâm cứu tìm hiểu thôi; Trên GPE cũng đã đề cập đến; Để sau & tự tìm nha!

3. Trong file bạn gửi kèm theo có thêm cái sub cuối cùng (Sub Mmm(): End Sub) mình không biết nó có ý nghĩa gì không?

Có cái nớ, mình sẽ tìm đấn nội dung hàm nhanh hơn với {F8}; Nếu không thì chỉ {F11} mà thôi

4. Còn câu này: Mình thấy nhiều khi trên cùng 1 dòng bạn viết 2 câu lệnh ngăn cách nhau bởi dấu ":".

Để macro nằm toàn bộ trên trang màn hình mà ta khỏi dùng con trượt biên fải - Lười í mà!

À, còn cái mà bạn nói là tổ hợp phím dành cho mảng có phải là Ctrl+Shift+Enter không hả bạn

Đó cũng là 1 cách nói; Tiếng Việt ta cũng hay & fong fú lắm đó nha.
 
Ma trậ n Excel, cá c bạ n chỉ dùm thêm
 

File đính kèm

Mình thấy vài chổ còn lấn cấn, như

(*) Sao bạn không khai báo kiểu của các biến là Double cho hàm của bạn tổng quát hơn?
(*) . . . . .


Thân ái!
 
Web KT

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

Back
Top Bottom