Hàm trả về một mảng ?? (1 người xem)

Liên hệ QC

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

Mr Okebab

Ngon Ngất Ngây
Thành viên đã mất
Tham gia
6/8/06
Bài viết
3,260
Được thích
3,790
Như em được biết hàm tự tạo (UFD) thường trả về giá trị cho một ô (hiện hành).
Vậy có cách nào để hàm này trả về là một mảng (có tác dụng với cả ô khác)

VD :
Ta dùng hàm vlookup để trả về một phần tử đầu tiên thỏa mãn. Tuy nhiên trong bảng tham chiếu có 10 phần tử thỏa mãn.

Vậy có cách nào để nhập công thức vào 1 ô thì cả 10 kết quả sẽ hiện ra ở 10 ô hay không (kể từ ô hiện hành)

Các cao thủ giúp nhé.

Thân!
 
Copy nguyên văn trong 100 thủ thuật Excel cho bác Bắp tham khảo

MOÄT HAØM MAÛNG DO NGÖÔØI DUØNG XAÙC LAÄP
Töø tröôùc ñeán giôø chuùng ta quen vôùi vieäc vieát haøm ngöôøi duøng chæ traûveà 1 giaù trò; Nhöng töø Excel 2.000 trôû ñi ta coù theå vieát haøm ngöôøi duøng yeâucaàu Excel ñoàng thôøi traû veà nhieàu giaù trò.
Ñeå tieän ta nhaäp ñoaïn maõ leänhgiaûi phöông trình baäc hai, nhö sau:
PHP:
Function PTBac2(aA As Double, bB As Double, cC As Double)
Dim Temp( 1 To 3): Dim DelTa As Double
DelTa= (bB ^ 2) - (4 * aA * cC)
Select Case DelTa
Case Is < 0
Temp(1) = "Voâ nghieäm"
Temp(2) = " "
Temp(3) = " "
Case 0
Temp(1) = "Moät nghieäm:"
Temp(2) = -bB / ( 2 * aA): Temp(3) = ""
Case Else
Temp(1) = "Hai nghieäm:"
Temp(2) = (-bB + Sqr( DelTa)) / ( 2 * aA)
Temp(3) = (-bB - Sqr( DelTa))/(2 * aA)
End Select
PTBac2 = Temp
End Function
Chuùng ta kieåm tra haøm ñaõ vieát taïi Sheet 'S1', baèng caùch:
Choïn daõy oâ D47:F47 baét ñaàu töø D47 vaø nhaäp =PTBac2( E42 , E43, E44) Vì laø haømmaûng neân ta phaûi keát thuùc baèng toå hôïp 3 phím CTRL+SHIFT+ENTER
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Function PTBac2(aA As Double, bB As Double, cC As Double)
    Dim Temp(1 To 3): Dim DelTa As Double
    DelTa = (bB ^ 2) - (4 * aA * cC)
    Select Case DelTa
        Case Is < 0
            Temp(1) = "Voâ nghieäm"
            Temp(2) = Temp(3) = " "
        Case 0
            Temp(1) = "Moät nghieäm:"
            Temp(2) = -bB / (2 * aA): Temp(3) = ""
        Case Else
            Temp(1) = "Hai nghieäm:"
            Temp(2) = (-bB + Sqr(DelTa)) / (2 * aA)
            Temp(3) = (-bB - Sqr(DelTa)) / (2 * aA)
    End Select
    PTBac2 = Temp
End Function

Cảm ơn bác nhiều.
Cái này của SA tiên sinh đây mà. Bụt gần nhà mà không biết!!

Tuy nhiên bác dàn trang kiểu này làm em . . . choáng quá.

Be be be!!

Thân!
 
Upvote 0
hì hì, "copy nguyên văn" mờ.
Đùa chứ, không ngờ nó ra như thế.
 
Upvote 0
SoiBien đã viết:
Copy nguyên văn trong 100 thủ thuật Excel cho bác Bắp tham khảo

Chuùng ta kieåm tra haøm ñaõ vieát taïi Sheet 'S1', baèng caùch:
Choïn daõy oâ D47:F47 baét ñaàu töø D47 vaø nhaäp =PTBac2( E42 , E43, E44) Vì laø haømmaûng neân ta phaûi keát thuùc baèng toå hôïp 3 phím CTRL+SHIFT+ENTER
Nếu không biết mảng đó có bao nhiêu giá trị thì khi ta chọn số ô ít hơn thì có được không ???
Giả sử ta tìm được 100 giá trị thỏa mãn, lần sau lại là 150, vậy thì ta chỉ cho 2 ô đại diện thì có được không???

Sao lại không ra nhỉ ??
Ai có File VD không??

Thân!
 
Upvote 0
Mr Okebab đã viết:
Nếu không biết mảng đó có bao nhiêu giá trị thì khi ta chọn số ô ít hơn thì có được không ???
Giả sử ta tìm được 100 giá trị thỏa mãn, lần sau lại là 150, vậy thì ta chỉ cho 2 ô đại diện thì có được không???

Sao lại không ra nhỉ ??
Ai có File VD không??

Thân!

VD trên không ra hả, vẫn ra mà.
còn mình chọn bao nhiêu ô thì nó chỉ hiện bấy nhiêu phần tử tính từ phần tử đầu tiên, còn nếu chọn nhiều hơn thì nó sẽ hiện #N/A tại những ô bị chọn dư.

Thân.
 
Upvote 0
Khi viết hàm trả về mảng thì trong trong nó phải kiểm tra sô dòng và số cột trả về. Kiểm tra nếu vùng chọn vừa với số dòng và số cột thì chạy, nếu không thì thông báo cho người dùng biết để chọn lại.
 
Upvote 0
SoiBien đã viết:
VD trên không ra hả, vẫn ra mà.
còn mình chọn bao nhiêu ô thì nó chỉ hiện bấy nhiêu phần tử tính từ phần tử đầu tiên, còn nếu chọn nhiều hơn thì nó sẽ hiện #N/A tại những ô bị chọn dư.

Thân.

Post File VD đi, mình làm hoài mà chỉ thấy báo (ở cả 3 ô) : Hai nghiệm :
(Tức là Temp(1) )
Thanks.
TuanVNUNI đã viết:
Khi viết hàm trả về mảng thì trong trong nó phải kiểm tra sô dòng và số cột trả về. Kiểm tra nếu vùng chọn vừa với số dòng và số cột thì chạy, nếu không thì thông báo cho người dùng biết để chọn lại.

Bác cho em đoạn code VD được không ạ ???
Như VD trên chẳng hạn.
thanks!!

Thân!
 
Upvote 0
SoiBien đã viết:
Bác xem nhé. chắc máy bác cài nhiều qua, nó cứ loạn cào cào.

Be be be!!

Thì ra là chọn hàng ngang, thế mà tớ cứ chọn hàng dọc

Có cách nào để chọn hàng ngang cũng được, hàng dọc cũng được không nhỉ ??

Còn mấy câu hỏi trên nữa, trả lời luôn nhé!

Thân!
 
Upvote 0
Thì ra là chọn hàng ngang, thế mà tớ cứ chọn hàng dọc
Có cách nào để chọn hàng ngang cũng được, hàng dọc cũng được không nhỉ ??
/)/gang hay dọc là do khai báo biến mảng đó bắp à!

VD khai báo Temp ( 1 to 3,1) Sẽ khác với Temp(3) mà Bắp đã thấy rõ sau nhiều lần thử đi thử lại & cai cú chuyện có mỗi đáp án , Xhà, xhà. . .
Tham khảo thêm ở đây: http://giaiphapexcel.com/forum/showthread.php?t=136


& 100 trâu - 100 bó cỏ đây:
http://giaiphapexcel.com/forum/showthread.php?t=512
Còn mấy câu hỏi trên nữa, trả lời luôn nhé!Nếu không biết mảng đó có bao nhiêu giá trị thì khi ta chọn số ô ít hơn thì có được không ???
Giả sử ta tìm được 100 giá trị thỏa mãn, lần sau lại là 150, vậy thì ta chỉ cho 2 ô đại diện thì có được không???
Chọn số ô ít hơn thì thiếu 1 số nghiệm
Chọn dư sẽ phải:
* Thấy 1 số hàng dư hay cột dư báo lỗi (như trên các bạn đã phát hiện)
* Trước khi gán KQ cho biến thì phải dùng vòng lặp gán toàn bộ biến = ""
(Về chổ này giá trị "" khác với Null!)
 
Lần chỉnh sửa cuối:
Upvote 0
SA_DQ đã viết:
Chọn số ô ít hơn thì thiếu 1 số nghiệm
Chọn dư sẽ phải:
* Thấy 1 số hàng dư hay cột dư báo lỗi (như trên các bạn đã phát hiện)
* Trước khi gán KQ cho biến thì phải dùng vòng lặp gán toàn bộ biến = ""
(Về chổ này giá trị "" khác với Null!)

Có cách nào kiểm tra trước rằng số nghiệm trả về phải đúng bằng số ô mình chọn. Nếu không sẽ báo thừa (hoặc thiếu) bao nhiêu ô hoặc tự động điều chỉnh số ô này ???

Như thế mới thuận tiện được.

Cảm ơn bác nhiều!!

Thân!
 
Upvote 0
Mr Okebab đã viết:
Có cách nào kiểm tra trước rằng số nghiệm trả về phải đúng bằng số ô mình chọn. Nếu không sẽ báo thừa (hoặc thiếu) bao nhiêu ô hoặc tự động điều chỉnh số ô này ??? Như thế mới thuận tiện được.
Cảm ơn bác nhiều!! Thân!

1*/ Cách 1 : không cần kiểm tra gì hết, cứ lấy thừa ra số dòng:
(/ô đầu chw trình, ta gán chúng =0 hết (bằng vòng lặp); xong vô Option ẩn các số không đi
(nhược điểm: tốn tài nguyên)
2*/ (mới định hướng thôi, chưa thử) Cung cấp thêm cho hàm 1 biến tùy chọn. theo kiểu
Mã:
[b] Function HMang (Rng As Range, Optional DoiSo As Byte) 
       Dim Temp(3) As Vaỉant
     If DoiSo = 1 Then
          Temp(1)= "Bạn Hãy Chọn 3 Ô hàng dọc"
           Temp(2) =" & 10 Ô Hàng Ngang"
           Temp(3) = "(húc &ui &ẽ!"
      Else
           Temp(1)= "Phw trình có Nghiệm:"
           Temp(2) = (-Bb  + DelTa )/ (2 *Aa)
           Temp(3) = (-Bb  - DelTa )/ (2 *Aa)              
      End If
      HMang = Temp
 [b]End Function[/b]
(òn tự động như Bắp nói thì hàm mảng trong excel hình như cũng chưa làm được mà; (/iệc này Bắp phải đề nghị với B thôi!
 
Upvote 0
Có vấn đề khác như sau:
Chẳng hạn từ hàm người dùng ( giải PT) như trên, kết quả là mảng gồm 3 phần tử, nếu gán cho biến khi viết mã VBA thì cú pháp thế nào ( không dùng cách truyền giá trị ra worksheet và gán trở lại cho biến)
Mong các bro giúp đỡ. Thank.
 
Upvote 0
To: Okebab,

Returning Arrays From VBA User Defined Functions
Em theo đường link này: Trả về một mảng từ VBA UDF

Anh đọc bài này thấy cũng dễ hiểu.

Lê Văn Duyệt
 
Upvote 0
Trong một hàm, nếu triệu gọi Application.Caller thì nó đóng vai trò như một Range.

Mã:
Function ArrayValues() As Variant
    
    Dim MyFormulaCell As Range
    Dim IsArray As Boolean
    
    Set MyFormulaCell = Application.Caller
    
    If MyFormulaCell.HasArray Then
        'Xảy ra khi người dùng thực hiện: bôi đen vùng -> Nhập công thức -> CTRL+ Shift +Enter.
        'Count of Rows, Columns
    Else
        'Single Formula
    End If
    
End Function
 
Upvote 0
Sau khi em đọc xong các topic đầu tiên mà vẫn không làm được
hiện em có một bảng tính. Em đã đưa được hàm Ptbac vào rồi mà vẫn không hiểu các giá trị 3, 1, -4 là gì
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ cho em hỏi, nếu e nhập 1 giá trị ở 1 sheet, ở sheet khác có rất nhiều dữ liệu có chứa giá trị đó, giờ e dùng hàm gì để tìm kiếm tất cả các giá trị như vậy ạ.
em cảm ơn
 
Upvote 0
Web KT

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

Back
Top Bottom