PDA

View Full Version : Các phép tính ma trận trong Excel



PhanTuHuong
24-06-06, 03:58 PM
1. Tính tổng ma trận, hiệu ma trận và tích ma trận:

Để tính tổng (hiệu, tích) cho ma trận (VD là 2), bạn cần thực hiện các bước sau:
- Bước 1: Nhập số liệu từng ma trận (ma trận A và B)
- Bước 2: Chọn các khối ô chứa kết quả (bôi đen). Sau đó di chuyển con trỏ đến ô bên trái khối ô.
- Bước 3: Nhập công thức tính, cụ thể như sau
+ Tính tổng: =VùngmatrậnA+VùngmatrậnB
+ Tính hiệu: =VùngmatrậnA-VùngmatrậnB
+ Tính tích: =MMULT(VùngmatrậnA,VùngmatrậnB)
- Bước 4: Nhấn phím Ctrl+Shift+Enter, các phép tính sẽ được thực hiện.


2. Nghịch đảo ma trận:

Để nghịch đảo ma trận, bạn cần thực hiện các bước sau:
- Bước 1: Nhập số liệu cho ma trận trận cần nghịch đảo.
- Bước 2: Chọn các khối ô chứa kết quả (bôi đen). Sau đó di chuyển con trỏ đến ô bên trái khối ô.
- Bước 3: Nhập công thức nghịch đảo ma trận
=MINVERSE(VùngmatrậnA)
- Bước 4: Nhấn phím Ctrl+Shift+Enter, các phép tính sẽ được thực hiện.

Hình ví dụ

http://i63.photobucket.com/albums/h133/tuhuong/baitap1.jpg
(http://i63.photobucket.com/albums/h133/tuhuong/baitap1.jpg)

PhanTuHuong
24-06-06, 10:15 PM
Vấn đề này đã đề cập trong diễn đàn, nhưng được gọi là "mảng". Còn bên khối kỹ thuật gọi là "ma trận", nghe có vẻ "chuyên nghiệp" hơn :)

PhanTuHuong
28-06-06, 03:43 PM
3. Giải hệ phương trình tuyến tính bằng ma trận:

Có hệ phương trình Ax=B. Tính ma trận nghịch đảo của A và tính (A-1).B, đó chính là véc tơ X cần tìm.
Ví dụ: hệ phương trình
ax+by= e, cx+dy= f

Để xác định giá trị x,y thì thực hiện như sau:
- Nhập giá trị a, b, c, d vào khối ô (A5:B6)- ma trận A.
- Nhập giá trị e, f vào khối ô (A8:A9)- ma trận B.
- Chọn vùng chứa ma trận nghịch đảo của A (D5:E6). Sau đó tính ma trận nghịch đảo như mục 2.
- Chọn vùng chứa nghiệm x, y (D8:D9). Nhập công thức =MMULT(VungA-1,VungB), sau đó nhấn phím Ctrl+Shift+Enter. Nghiệm x, y sẽ xuất hiện.
Bạn có thể kiểm tra lại nghiệm bằng cách tính mà trận Ax rồi so sánh với véc tơ B.
Từ ví dụ trên, bạn có thể giải hệ phương trình có nhiều nghiệm.
Chúc thành công! :_
Hình anh minh hoạ kèm theo

hình minh họa
http://i63.photobucket.com/albums/h133/tuhuong/aaa.jpg

HAiNV
29-06-06, 02:52 PM
Bác nào quan tâm đến các phép toán ma trận trong excel thì có thể liên hệ với anh daoduy bên ketcau.com. Anh Duy co 1 file *.xla rất hay, khoảng 120 hàm về ma trận, lại ko có pass bảo vệ. Tha hồ mà cày xới.

SA_DQ
11-07-06, 05:39 AM
. . . . Anh Duy co 1 file *.xla rất hay, khoảng 120 hàm về ma trận, lại ko có pass bảo vệ. Tha hồ mà cày xới.
Rất hay nếu bạn liên hệ giúp; Nghe nó`i đến hơn trăm hàm thì quả là bữa tiệt no nê đây;
Tò mò muốn hỏi trước HAINV là có cách giải hệ loại này không:
2aX + 3(a-b)Y = 4
bX - (a -1 ) Y = a

SA_DQ
21-07-06, 08:03 AM
Nhờ bác tải file lên cho dễ hiểu. :.
Vì là hàm mãng nên hao kinh phí quá!

duongthanh85
28-03-07, 11:01 AM
em không đem theo usb và máy hàng net cũng không cài excel. em hỏi nhanh 1 phát:
em tham khảo các hàm nhưng chưa tìm được phép chuyển vị ma trận.
anh nào hướng dẫn em chút.

em định làm bằng cách chuyển 1 vùng( là matrix) từ dọc sang ngang.

duongthanh85
29-03-07, 05:57 PM
ok. em làm xong hàm này rồi, chuyển vị vô tư, giữ nguyên công thức và tham chiếu đến các ô.
chỉ việc chọn vùng theo chuột và xoay nó là xong.

qmanh
10-12-08, 12:29 AM
cho tui đóng góp, khi chuyển vị ma trận thì copy vùng rồi chọn paste special/transpose
nếu ma trận chuyển vị có công thức thì cho dùng tọa độ tuyệt đối rồi chọn them formulas.
cho tui thấy nó rất hữu ích cho bạn nào chuẩn bị thi môn cơ kết cấu 3 trường dhxd. cám ơn mọi người.

nanabi
28-09-09, 10:28 PM
em đã đọc nhiều bài về nhân ma trận nhưng vẫn không thấy có bài nào viết về cách nhân nhiều ma trận cùng 1 lúc. Em toàn phải nhân 2 matrận rồi nhân tiếp đến matrận khác ...
Có bác nào biết cách nhân nhiều matrận cùng lúc chỉ cho em với. Em cảm ơn

Po_Pikachu
18-10-09, 09:22 PM
File ma trận của anh DaoDuy ở đây. Nếu ai muốn thì đăng ký diễn đàn rồi tải ha.
http://www.ketcau.com/forum/showthread.php?p=12557
Bổ sung thêm 2 phần mềm toán học Maple 13 và Matlab 7 nữa nè!
http://www.mediafire.com/?sharekey=0a6adf0944e19201ab1eab3e9fa335ca81ae225f 8bb4244e
Thân.

Po_Pikachu
23-10-09, 05:15 PM
Có ai có thể rút gọn được hàm này không? Em nhìn vào muốn tẩu hỏa luôn.-+*/
Tác giả: Le Viet Thanh
Nguồn: http://www.ketcau.com/forum/showpost.php?p=9591&postcount=87

'DOAN CHUONG TRINH TINH TOAN CAC GIA TRI RIENG CUA MTRAN
'HOAN THANH NGAY 05/03/2003. Trong ham nay khong xet den phan ao cua cac gia tri rieng
Private Sub Balanc(A() As Double, ByVal n As Integer)
Const RADIX = 2
Dim last As Integer, i As Integer, j As Integer
Dim s As Double, r As Double, g As Double
Dim f As Double, c As Double, sqrdx As Double
DoEvents: If mdl01.tiep_tuc = False Then Exit Sub
frmSTATUS.lblstatus01(1).Caption = mdl01.StrTbao & Chr(10) & "(Transform to Balanc matric)"
frmSTATUS.ProgressBar1.max = n
frmSTATUS.ProgressBar1.Value = 0
frmSTATUS.lblstatus01(1).Refresh
sqrdx = RADIX * RADIX
last = 0
While last = 0
frmSTATUS.ProgressBar1.Value = frmSTATUS.ProgressBar1.Value + 1
last = 1
For i = 1 To n
r = 0
c = 0
For j = 1 To n
If Not (i = j) Then
c = c + Abs(A(j, i))
r = r + Abs(A(i, j))
End If
Next
If (c And r) Then
g = r / RADIX
f = 1
s = c + r
Do While c < g
f = f * RADIX
c = c * sqrdx
Loop
g = r * RADIX
While c > g
f = f / RADIX
c = c / sqrdx
Wend
If ((c + r) / f < 0.95 * s) Then
last = 0
g = 1 / f
For j = 1 To n
A(i, j) = A(i, j) * g
Next
For j = 1 To n
A(j, i) = A(j, i) * f
Next
End If
End If
Next
Wend
frmSTATUS.ProgressBar1.Value = frmSTATUS.ProgressBar1.max
End Sub

Private Sub Hessenberg(A() As Double, ByVal n As Integer)
Dim m As Integer, i As Integer, j As Integer
Dim x As Double, y As Double, tg As Double
frmSTATUS.lblstatus01(1).Caption = mdl01.StrTbao & Chr(10) & "(Transforming to Hessenberg matric form)"
frmSTATUS.ProgressBar1.max = n - 3
frmSTATUS.ProgressBar1.Value = 0
frmSTATUS.lblstatus01(1).Refresh
For m = 2 To n - 1
DoEvents
If mdl01.tiep_tuc = False Then Exit Sub
x = 0
i = m
For j = m To n
If Abs(A(j, m - 1)) > Abs(x) Then
x = A(j, m - 1)
i = j
End If
Next
If Not (i = m) Then
For j = m - 1 To n
tg = A(i, j)
A(i, j) = A(m, j)
A(m, j) = tg
Next
For j = 1 To n
tg = A(j, i)
A(j, i) = A(j, m)
A(j, m) = tg
Next
End If
If Not (x = 0) Then
For i = m + 1 To n
y = A(i, m - 1) / x
For j = m To n
A(i, j) = A(i, j) - y * A(m, j)
Next
For j = 1 To n
A(j, m) = A(j, m) + y * A(j, i)
Next
Next
End If
frmSTATUS.ProgressBar1.Value = m - 2
Next
End Sub

Private Function Sign(ByVal A As Double, ByVal B As Double) As Double
If B > 0 Then
Sign = Abs(A)
Else
Sign = -Abs(A)
End If
End Function

Public Function Eig(A() As Double, ByVal n As Integer) As Double()
Dim nn As Integer, m As Integer, l As Integer
Dim k As Integer, j As Integer, its As Integer
Dim i As Integer, mmin As Integer, status As Integer
Dim z As Double, y As Double, x As Double
Dim w As Double, v As Double, u As Double
Dim t As Double, s As Double, r As Double
Dim p As Double, q As Double, anorm As Double
Dim wr() As Double
'========================================
Balanc A, n
Hessenberg A, n
'========================================
'BAT DAU TINH CAC GIA TRI RIENG:
'========================================
ReDim wr(1 To n) As Double
frmSTATUS.lblstatus01(1).Caption = mdl01.StrTbao & Chr(10) & "(Computing EigValues)"
frmSTATUS.ProgressBar1.max = n
frmSTATUS.ProgressBar1.Value = 0
frmSTATUS.lblstatus01(1).Refresh
anorm = Abs(A(1, 1))
For i = 2 To n
For j = (i - 1) To n
anorm = anorm + Abs(A(i, j))
Next
Next
status = 0
nn = n
t = 0
While nn >= 1
DoEvents
If mdl01.tiep_tuc = False Then Exit Function
its = 0
Do
For l = nn To 2 Step -1
s = Abs(A(l - 1, l - 1)) + Abs(A(l, l))
If s = 0 Then s = anorm
If Abs(A(l, l - 1)) + s = s Then Exit For
Next
x = A(nn, nn)
If l = nn Then
wr(nn) = x + t
nn = nn - 1
status = status + 1
frmSTATUS.ProgressBar1.Value = status
Else
y = A(nn - 1, nn - 1)
w = A(nn, nn - 1) * A(nn - 1, nn)
If l = (nn - 1) Then
p = 0.5 * (y - x)
q = p * p + w
z = Sqr(Abs(q))
x = x + t
If q >= 0 Then
z = p + Sign(z, p)
wr(nn - 1) = x + z
wr(nn) = x + z
If Not (z = 0) Then wr(nn) = x - w / z
Else
wr(nn - 1) = x + p
wr(nn) = x + p
End If
nn = nn - 2
status = status + 2
frmSTATUS.ProgressBar1.Value = status
Else
If (its = 10) Or (its = 20) Then
t = t + x
For i = 1 To nn
A(i, i) = A(i, i) - x
Next
s = Abs(A(nn, nn - 1)) + Abs(A(nn - 1, nn - 2))
y = 0.75 * s
x = 0.75 * s
w = -0.4375 * s * s
End If
its = its + 1
For m = (nn - 2) To l Step -1
z = A(m, m)
r = x - z
s = y - z
p = (r * s - w) / A(m + 1, m) + A(m, m + 1)
q = A(m + 1, m + 1) - z - r - s
r = A(m + 2, m + 1)
s = Abs(p) + Abs(q) + Abs(r)
p = p / s
q = q / s
r = r / s
If m = l Then Exit For
u = Abs(A(m, m - 1)) * (Abs(q) + Abs(r))
v = Abs(p) * (Abs(A(m - 1, m - 1)) + Abs(z) + Abs(A(m + 1, m + 1)))
If u + v = v Then Exit For
Next
For i = m + 2 To nn
A(i, i - 2) = 0
If Not (i = (m + 2)) Then A(i, i - 3) = 0
Next
For k = m To nn - 1
If Not (k = m) Then
p = A(k, k - 1)
q = A(k + 1, k - 1)
r = 0
If Not (k = (nn - 1)) Then r = A(k + 2, k - 1)
x = Abs(p) + Abs(q) + Abs(r)
If Not (x = 0) Then
p = p / x
q = q / x
r = r / x
End If
End If
s = Sign(Sqr(p * p + q * q + r * r), p)
If Not (s = 0) Then
If k = m Then
If Not (l = m) Then
A(k, k - 1) = -A(k, k - 1)
End If
Else
A(k, k - 1) = -s * x
End If
p = p + s
x = p / s
y = q / s
z = r / s
q = q / p
r = r / p
For j = k To nn
p = A(k, j) + q * A(k + 1, j)
If Not (k = (nn - 1)) Then
p = p + r * A(k + 2, j)
A(k + 2, j) = A(k + 2, j) - p * z
End If
A(k + 1, j) = A(k + 1, j) - p * y
A(k, j) = A(k, j) - p * x
Next
If nn < k + 3 Then
mmin = nn
Else
mmin = k + 3
End If
For i = l To mmin
p = x * A(i, k) + y * A(i, k + 1)
If Not (k = (nn - 1)) Then
p = p + z * A(i, k + 2)
A(i, k + 2) = A(i, k + 2) - p * r
End If
A(i, k + 1) = A(i, k + 1) - p * q
A(i, k) = A(i, k) - p
Next
End If
Next
End If
End If
Loop While l < (nn - 1)
Wend
Eig = wr
End Function
Thân.

phhuongthanh
03-11-09, 11:49 AM
mình đang học môn kinh tế lượng nhưng khi nhân một ma trận với một số không biết nhân như thế nào? Xin các anh chị chỉ giúp em với. Xin chân thành cảm ơn

nguyenthuan
11-11-09, 07:30 PM
File ma trận của anh DaoDuy ở đây. Nếu ai muốn thì đăng ký diễn đàn rồi tải ha.
http://www.ketcau.com/forum/showthread.php?p=12557
Bổ sung thêm 2 phần mềm toán học Maple 13 và Matlab 7 nữa nè!
http://www.mediafire.com/?sharekey=0a6adf0944e19201ab1eab3e9fa335ca81ae225f 8bb4244e
Thân.
Rất cảm ơn bạn đã chia sẽ file VBA về các hàm ma trận rất hay.
Cho mình hỏi mình muốn sử dụng những hàm này trong VBE thì làm như thế nào?
http://www.ozgrid.com/forum/showthread.php?t=14530
Trang web đó có 1 cách giải đáp nhưng mình không hiểu tại sao :Mình đã tham chiếu đến VBAmatrix rồi nhưng những hàm tính về ma trận như M_Mult_C mình vẫn chưa tính được.
Khi mở Object Browser ra chọn thư viện VBAmatrix, trong cửa sổ Project Window nếu để chuột vào thành phần nào trong VBAmatrix thì tất cả những đối tượng (bao gồm cả đối tượng matrix chứa hàm M_Mult_C) xuất hiện đầy đủ, nhưng khi để chuột đến VBAProject (Book 1) chẳng hạn thì đối tượng matrix chứa hàm M_Mult_C và nhiều đối tượng khác nữa lại biến mất.
Kính mong các bạn giải đáp giúp mình!
Mình mới biết VBA nên chưa hiểu nhiều!
Chân thành cảm ơn!!!

Po_Pikachu
11-11-09, 07:47 PM
VBAProject(Book 1) là 1 Workbook khác rồi bạn à?!
Khi tham chiếu đến Workbook nào thì nó chỉ thấy dữ liệu trên Workbook đó thôi!
Vậy thì tất nhiên bạn sẽ không thấy rồi. Bạn mở quyển sách nào thì văn bản trên quyển sách đó đâu thể thấy trên quyển sách khác được.
Còn việc thực thi lệnh thì giống như bạn đọc cùng lúc nhiều quyền sách vậy đó. Giữ liệu nằm ngay trong đầu thì có thể thao tác trên nhiều quyển sách được chứ. Nhưng nó không giống như con người, nó chỉ thao tác tức thời ngay trên màn hình những gì mình có thôi.
Còn việc truy xuất sâu hơn đòi hỏi bạn phải chỉ cho nó cơ.
Thân.

nguyenthuan
11-11-09, 09:00 PM
VBAProject(Book 1) là 1 Workbook khác rồi bạn à?!
Khi tham chiếu đến Workbook nào thì nó chỉ thấy dữ liệu trên Workbook đó thôi!
Vậy thì tất nhiên bạn sẽ không thấy rồi. Bạn mở quyển sách nào thì văn bản trên quyển sách đó đâu thể thấy trên quyển sách khác được.
Còn việc thực thi lệnh thì giống như bạn đọc cùng lúc nhiều quyền sách vậy đó. Giữ liệu nằm ngay trong đầu thì có thể thao tác trên nhiều quyển sách được chứ. Nhưng nó không giống như con người, nó chỉ thao tác tức thời ngay trên màn hình những gì mình có thôi.
Còn việc truy xuất sâu hơn đòi hỏi bạn phải chỉ cho nó cơ.
Thân.
Cảm ơn bạn đã trả lời mình


Thật sự là khi mở quyển sách này nhưng mình lại thấy một phần của quyển sách kia bạn ạ, còn mở quyển sách kia thì thấy hoàn chỉnh quyển đó. Cảm tưởng như nó giấu một số đối tượng không cho mình tham chiếu đến đó vậy.Chứ không phải mở quyển nào thì chỉ thấy quyển đó.
Bạn có thể bớt chút thời gian hiếm hoi ví dụ 1 hàm bất kì trong đối tượng matrix ( như hàm M_Mult_C chẳng hạn) cho mình xem cách làm được không. Mình mò mẫm cả ngày hôm nay mà vẫn chưa được. Cái hàm này nếu dùng trong bảng tình thì ko có gì bàn cãi cả, nhưng dùng hàm đó để phát triển việc làm của mình trên VBE thì mình chưa làm được (không biết cách tham chiếu đến hàm đó).Có gì ngớ ngẫn đừng cười mình nhé! Chân thành cảm ơn! Mong nhận được hồi âm sớm!+-+-+-++-+-+-+

Po_Pikachu
11-11-09, 10:13 PM
Thì bạn chỉ cần lấy 2 đoạn code Mat_Complex_Conv(A, ConvType, Optional RetErr) và M_MULT_C(Mat1, Mat2, Optional CFormat) để dùng thôi. Vì trong M_MULT_C nó có tham chiếu đến Mat_Complex_Conv nên bạn phải lấy nó theo thôi.
Còn quá trình sử dụng thì nó chỉ sử lý trên mãng thôi. Bạn phải áp dụng hàm mãng nha!
Bạn xem file nha!
Thân.

nguyenthuan
12-11-09, 09:57 AM
Thì bạn chỉ cần lấy 2 đoạn code Mat_Complex_Conv(A, ConvType, Optional RetErr) và M_MULT_C(Mat1, Mat2, Optional CFormat) để dùng thôi. Vì trong M_MULT_C nó có tham chiếu đến Mat_Complex_Conv nên bạn phải lấy nó theo thôi.
Còn quá trình sử dụng thì nó chỉ sử lý trên mãng thôi. Bạn phải áp dụng hàm mãng nha!
Bạn xem file nha!
Thân.

Một lần nữa cảm ơn bạn nhiệt tình giúp đỡ.
Cách làm này mình cũng biết, đó là chép phần hàm và tham chiếu của code có sẵn trong đó vào trong code của mình để phát triển. Tương tự như tạo một hàm bằng VBA rồi dùng và có vẻ như cách này dùng nhiều hơn nhỉ, có lẽ mình nên nghĩ dùng cách này để làm phần của minh.Coi như tới đây là công việc không bị dừng lại và mình có thể làm tiếp được rồi. Chân thành cảm ơn!
Nếu mình không chép phần code của addins đó vào code mình( trường hợp addins có đặt pass thì không thể dùng code của nó được) khi đó không thể có code mà chép.Trong khi đó mình vẫn muốn dùng hàm trong addins đó ,điều đó có nghĩa là mình phải tham chiếu đến addins đó (tương tự như tham chiếu đến một chương trình khác như VBA cho Autocad chẳng hạn) và dùng những hàm trong đó như hàm của worksheetfunction và đó là cái mà mình chưa làm được.
Khi mình mày mò tham chiếu đến nó rồi (reference tới VBAmatrix) thì lúc đó hàm M_Mult_Cvà tất cả những hàm của đối tượng matrix không thấy nữa trong khi đó một số đối tượng khác vẫn thấy được và tham chiếu được (như là bị giấu mất một số đối tượng mình đã đề cập ở trên.Nếu bạn có thể dùng hàm M_Mult_C mà không cần chép code của nó thì đó chính là cái mình đã hỏi! Chân thành cảm ơn và nếu được bạn giúp thêm cách đó nữa thì mình rất đa tạ.
+-+-+-++-+-+-++-+-+-+

MNThao
06-01-10, 02:29 PM
Các bạn ơi có thể cho mình hỏi.
Mình cũng đang rất cần viết một số addins để phục vụ cho công việc của mình cũng có liên quan đến mảng (ma trận). Mình cũng đã tham khảo nhiều bài viết của các bạn và cũng đã có thể tùy biến đc theo nhu cầu của mình.
Tuy nhiên có một vấn đề mình chưa thể giải quyết đc mong các bạn chỉ giáo. Số là trong cái addins của mình, một quá trình tính toán mình cần yêu cầu trả về tối thiểu 02 giá trị. Có thể thực hiện việc này bằng cách thực hiện lại hàm nhiều lần và mỗi lần cho trả về một giá trị khác nhau theo yêu cầu của mình. Tuy nhiên có một vấn nếu như file của mình quá lớn thì việc lặp lại quá trình tính toán sẽ làm cho chương trình của mình chạy rất lâu và khi cần trả về nhiều giá trị (Chứ không phải 2 hay 3 giá trị) thì sẽ thực hiện lại rất nhiều lần cho cùng 1 câu lệnh sẽ rất phức tạp.
Mình không biết đã có ai thử trả về giá trị là một mảng (ma trận) hay chưa. Mình đang tìm cách để trả về giá trị cho 1 addins là một mảng (ma trận) và display được cái ma trận trả về ấy trên một worksheet (có thể cùng hoặc có thể khác worksheet với nơi cung cấp dữ liệu). Có bạn nào biết cách trả về một mảng (ma trận) cho một addins thì chỉ giúp mình với.
Cảm ơn các bạn nhiều!

HYen17
06-01-10, 03:44 PM
Các bạn ơi có thể cho mình hỏi:
Đã có ai thử trả về giá trị là một mảng (ma trận) hay chưa. Mình đang tìm cách để trả về giá trị cho 1 addins là một mảng (ma trận) và display được cái ma trận trả về ấy trên một worksheet (có thể cùng hoặc có thể khác worksheet với nơi cung cấp dữ liệu). Có bạn nào biết cách trả về một mảng (ma trận) cho một addins thì chỉ giúp mình với.
Cảm ơn các bạn nhiều!

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!

MNThao
06-01-10, 04:55 PM
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

HYen17
06-01-10, 08:32 PM
Đú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.



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

MNThao
07-01-10, 12:58 AM
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

HYen17
07-01-10, 06:26 AM
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.

cavoi54
27-07-11, 09:53 AM
Ma trậ n Excel, cá c bạ n chỉ dùm thêm

ba3ba3
20-10-11, 12:49 AM
Tôi viết code VB6 chèn Excel để (các bạn nào) tiện dụng.

(Các con số lấy từ sách của tác giả Trần Thanh Phong)


Private Sub Command1_Click()' x + 2y + 3z = 25 (1)
' 2x + y + z = 14 (2)
' x + 4y + 2z = 10 (3)
Dim MM As Variant
MM = GiaiHePT(1, 2, 1, 2, 1, 4, 3, 1, 2, 25, 14, 10)
MsgBox "x = " & MM(0) & ", y = " & MM(1) & ", z = " & MM(2)
End Sub


Function GiaiHePT(ByVal a1 As Single, ByVal a2 As Single, ByVal a3 As Single, _
ByVal b1 As Single, ByVal b2 As Single, ByVal b3 As Single, _
ByVal c1 As Single, ByVal c2 As Single, ByVal c3 As Single, _
ByVal A As Single, ByVal B As Single, ByVal C As Single) As Variant
' a1x + b1y + c1z = A
' a2x + b2y + c2z = B
' a3x + b3y + c3z = C
Dim Ex As Object: Set Ex = CreateObject("Excel.Application")
Dim Bk As Object: Set Bk = Ex.Workbooks.Add
' author: truongphu
Bk.Sheets(1).Select
Cells(1, 1) = a1
Cells(2, 1) = a2
Cells(3, 1) = a3
Cells(1, 2) = b1
Cells(2, 2) = b2
Cells(3, 2) = b3
Cells(1, 3) = c1
Cells(2, 3) = c2
Cells(3, 3) = c3
Cells(1, 4) = "x"
Cells(2, 4) = "y"
Cells(3, 4) = "z"
Cells(1, 5) = A
Cells(2, 5) = B
Cells(3, 5) = C
Range(Cells(1, 6), Cells(3, 8)).FormulaArray = "=MINVERSE(A1:C3)"
Range(Cells(1, 9), Cells(3, 9)).FormulaArray = "=MMULT(F1:H3,E1:E3)"
Dim KQ(2) As Single
KQ(0) = Cells(1, 9).Value
KQ(1) = Cells(2, 9).Value
KQ(2) = Cells(3, 9).Value
GiaiHePT = KQ
Bk.Close False: Set Bk = Nothing
Ex.Quit: Set Ex = Nothing
End Function

HYen17
20-10-11, 07:58 AM
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!

ba3ba3
26-10-11, 12:11 PM
Bài viết sau đây không dùng các đối tượng chứa dữ liệu Range và Cells, ứng dụng trực tiếp trên VB6.

1- Vẽ lên Form List1
2- Chọn Sort = True hay False tùy thích
3- Dán code VB6 sau vào Form:


Private Sub Form_Load()
Const uuu = "Max,Min,Average,Sum,Pi"
Const tg = "truongphu"
Dim sss() As String
sss = Split(uuu, ",")
For i = 0 To UBound(sss)
If InStr(sss(i), "Pi") Then
List1.AddItem "Msgbox ee." & sss(i) & "()"
Else
List1.AddItem "Msgbox ee." & sss(i) & "(ra)"
End If
List2.AddItem sss(i)
Next
End Sub

Private Sub List1_Click()
Set VVV = CreateObject("MSScriptControl.ScriptControl")
VVV.Language = "VBScript": VVV.AllowUI = True
Const XXX = "Set yyy = CreateObject(""Excel.Application"")" & vbCrLf & _
"Set ee = yyy.WorksheetFunction" & vbCrLf & "ReDim ra(13)" & vbCrLf & _
"Randomize:For j = 0 to 13" & vbCrLf & "ra(j) = Int(Rnd*100)" & vbCrLf & _
"pp = pp & ra(j) & "", """ & vbCrLf & "Next:Msgbox ""RandomArray= "" & pp" & vbCrLf
VVV.AddCode XXX & List1.Text & ":Set yyy = Nothing: Set ee = Nothing:pp="""""
End Sub



4- Chạy Project, chọn từng mục trên ListBox, sẽ có kết quả ứng dụng hàm Excel.
(ghi chú: code trên trông hơi rối vì sẵn tiện tôi đang viết một App nho nhỏ test code đưa vào. Nếu không thích các bạn cứ xóa ScriptControl, chỉ chạy riêng Excel.Application. Code dùng hàm CreateObject để tiện tương thích bất kể phiên bản của Excel nên máy nào cũng chạy êm, khỏi sửa rắc rối. Các hàm trình bày là hàm dễ viết, gọi là minh họa; hàm khó sẽ tìm hiểu sau..)