Tham số trong User Defined Function

Liên hệ QC

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,951
Tôi có 1 hàm tự tạo có dạng:
PHP:
Function Test(Clls As Range) As String
----------------
----------------
----------------
End Function
Vấn đề tôi muốn hỏi ở đây là làm cách nào để khi tôi gõ:
=Test() (không có tham số Clls)
thì UDF tự động hiểu tôi đang muốn nói đến Clls chính là ActiveCell
gần giống như khi ta sử dụng hàm COLUMN(), không có tham số nghĩa là lấy COLUMN tại ActiveCell
 
Chắc là vầy:
PHP:
Function OptionalCell(Optional Rng As Range) As String
 If Rng Is Nothing Then Set Rng = Selection
 OptionalCell = Rng.Address
End Function
 
Upvote 0
Cảm ơn anh Sa
Em hỏi câu này là để giãi quyết bài toán Get Column letter = VBA
PHP:
Option Explicit
Function Coleter(Optional Clls As Range) As String
  Dim Adr As String
  If Clls Is Nothing Then Set Clls = ActiveCell
  Adr = Cells(1, Clls.Column).Address(0, 0)
  Coleter = Replace(Adr, 1, "")
End Function
Anh xem giúp đã ổn chưa!
 
Upvote 0
Ndu ơi,

Code bác nhìn chung thì đựoc, nhưng nhìn kỹ thì chưa,
Vì bác lấy ActiveCell , nhưng nếu bác gõ =Coleter trên thanh công thức rồi enter thì không vấn đề gì. Nhưng nếu bác EDit cái công thức, mà không Enter, Bằng cách bác click sang 1 cái cột khác, thì kết quả sẽ lấy tên cột mới, vì là ActiveCell mà
 
Lần chỉnh sửa cuối:
Upvote 0
Ndu ơi,

Code bác nhìn chung thì đựoc, nhưng nhìn kỹ thì chưa,
Vì bác lấy ActiveCell , nhưng nếu bác gõ =Coleter trên thanh công thức rồi enter thì không vấn đề gì. Nhưng nếu bác EDit cái công thức, mà không Enter, Bằng cách bác click sang 1 cái cột khác, thì kết quả sẽ lấy tên cột mới, vì là ActiveCell mà
Có lẻ bạn hiểu sai ý tôi về mục đích của hàm này!
Giống như hàm COLUMN() vậy, nếu tôi ghi rỏ tham chiếu vào thì đương nhiên sẽ lấy Column letter của tham chiếu đó, bằng ngược lại tôi chẳng ghi gì thì nó phải tự hiểu là ActiveCell
Chỉ vậy thôi
(Bạn click sang cột khác thì kết quả lấy theo tên cột mới là đúng rồi còn gì)
 
Upvote 0
Nếu vậy thì thay dỗi ký tự sau mỗi lần dổi activeCell có vẻ hợp lý hơn là sau mỗi lần Edit công thức
 
Upvote 0
Nếu vậy thì thay dỗi ký tự sau mỗi lần dổi activeCell có vẻ hợp lý hơn là sau mỗi lần Edit công thức
Không hiểu ý bạn cho lắm!
Tôi dùng hàm này để lấy tên cột tại 1 cell nào đó cơ mà!
Ví dụ bạn gõ =Coleter(H5) thì sẽ cho kết quả là ký tự H
Đâu có Edit công thức gì đâu chứ!
 
Upvote 0
Chú ý:
1*/ Nếu mình chọn vài ô trong hàng, VD B2:C2
Nhập hàm không tham số & {CTRL}+{ENTER} thì tại C2 cũng được trả về 'B';
2*/ =Coleter(C2:D3) :='C'
 
Upvote 0
Chú ý:
1*/ Nếu mình chọn vài ô trong hàng, VD B2:C2
Nhập hàm không tham số & {CTRL}+{ENTER} thì tại C2 cũng được trả về 'B';
2*/ =Coleter(C2:D3) :='C'
Vâng! cái này em đã kiểm tra, nhưng em không có yêu cầu gì về mãng nên chưa nghiên cứu
(mà thật ra cũng không có khả năng để nghiên cứu)
 
Upvote 0
Xin hỏi thêm 1 chút về UDF:
1> Câu hỏi 1:
Tôi có hàm sau:
Mã:
Function JoinIf(VungDK As Range, DK As Variant, VungKQ As Range, Optional PC As Variant) As String
  Dim i, Dem As Long
  Dim Temp As String
  Dem = VungDK.Count
  '[COLOR=Red][B]If PC Is Nothing Then PC = ""[/B][/COLOR]
  For i = 1 To Dem
    If VungDK(i) = DK Then Temp = Temp & PC & VungKQ(i)
  Next
  JoinIf = Mid(Temp, 2, Len(Temp))
End Function
Ý tôi muốn nếu tham số PC ta không ghi gì thì đồng nghĩa là nó = rổng! Thế nhưng cho đoạn code màu đỏ ở trên vào thì hàm không chạy (xóa nó đi lại chạy bình thường)
Cho hỏi tôi sai chổ nào?
2> Câu hỏi 2: Tôi muốn dùng hàm Join để thay đoạn:
Mã:
Temp = Temp & PC & VungKQ(i)
thì phải chỉnh sửa lại code như thế nào (thử hoài không đựoc)
3> Câu hỏi 3:
code này:
Range(...).Cells.CountRange(...).Count Khác nhau ở điểm nào?
 

File đính kèm

Upvote 0
-Bước đầu mình test thấy hàm JoinIf chạy chưa ổn trong 2 trường hợp sau:
=Joinif(A1:A7,"x",B1:B7,"") và =Joinif(A1:A7,"x",B1:B7)
-Câu hỏi 1: Do sai cú pháp nên hàm bị lỗi. PC không phải là biến đối tượng.
 
Upvote 0
-Bước đầu mình test thấy hàm JoinIf chạy chưa ổn trong 2 trường hợp sau:
=Joinif(A1:A7,"x",B1:B7,"") và =Joinif(A1:A7,"x",B1:B7)
-Câu hỏi 1: Do sai cú pháp nên hàm bị lỗi. PC không phải là biến đối tượng.
Trừong hợp =Joinif(A1:A7,"x",B1:B7,"") thì chạy đựoc thầy à!
Ý em muốn nếu không gõ PC vào thì nó tự hiểu là ""
Vậy phải sửa lại như thế nào thầy ơi
(chử PC nghĩa là Phân cách)
 
Lần chỉnh sửa cuối:
Upvote 0
-Trường hợp =Joinif(A1:A7,"x",B1:B7,"") thì chạy được nhưng kết quả sai.
-Có thể chỉnh lại như sau:
Mã:
  Function JoinIf(VungDK As Range, DK As Variant, VungKQ As Range, PC As Variant) As String
  Dim i, Dem As Long
  Dim Temp As String
  Dem = VungDK.Count
        If IsMissing(PC) Then PC = ""
    For i = 1 To Dem
        If VungDK(i) = DK Then
           Temp = Temp & PC & VungKQ(i)
       End If
    Next
       If PC = "" Then
         JoinIf = Temp
      Else
         JoinIf = Mid(Temp, 2, Len(Temp))
      End If
End Function
-Còn một lỗi nhỏ mình chưa khắc phục được là ta phải nhập như sau:
=Joinif(A1:A7,"x",B1:B7,) hàm mới chạy được.
 
Upvote 0
Cảm ơn thầy! Em làm được rồi!
Chổ lổi ấy em cũng sửa được luôn: Vì thầy khai báo PC như 1 thành phần không thể thiếu được của hàm thì tất nhiên thầy không thể bỏ nó đi rồi. Còn em khai báo nó như 1 Opttional nên bỏ được! (Optional PC As Variant)
Em phát hiện ra 1 chổ chưa ổn nữa, đó là đoạn:
PHP:
If PC = "" Then
   JoinIf = Temp
Else 
    JoinIf = Mid(Temp, 2, Len(Temp))
End If
(Thầy gỏ hàm =Joinif(A1:A7,"x",B1:B7,"///") sẽ biết tại sao!)
Em sửa lại:
Mã:
Function JoinIf(VungDK As Range, DK As Variant, VungKQ As Range, Optional PC As Variant) As String
  Dim i, Dem As Long
  Dim Temp As String
  Dem = VungDK.Count
  If IsMissing(PC) Then PC = ""
  For i = 1 To Dem
    If VungDK(i) = DK Then Temp = Temp & PC & VungKQ(i)
  Next
 [COLOR=Red][B] JoinIf = Mid(Temp, Len(PC) + 1, Len(Temp))[/B][/COLOR]
End Function
Không biết còn chổ nào chưa ổn nữa không? Thầy kiểm tra giúp em với!
 

File đính kèm

Upvote 0
Ah... thầy ơi, còn 2 câu hỏi nữa em đang thắc mắc mà chưa thấy ai trả lời giúp:
2> Câu hỏi 2:
Em muốn dùng hàm Join để thay đoạn: Temp = Temp & PC & VungKQ(i) thì phải chỉnh sửa lại code như thế nào?
3> Câu hỏi 3:
2 đoạn:
Range(...).Cells.Count

Range(...).Count
Khác nhau ở điểm nào?
 
Upvote 0
ndu96081631 Có thể cho biết hàm dùng làm việc gì không?

Thêm nữa bạn nên tận dụng các cú pháp bẫy lỗi trong VBA, ví dụ:

PHP:
Function JoinIf(VungDK As Range, DK As Variant, VungKQ As Range, _
      Optional PC As Variant) As String
 On Error Goto Loi_Fn
  Dim i, Dem As Long:                    Dim Temp As String
1  Dem = VungDK.Count
2  'If PC Is Nothing Then PC = "" '
3  For i = 1 To Dem
4    If VungDK(i) = DK Then Temp = Temp & PC & VungKQ(i)
5  Next
6  JoinIf = Mid(Temp, 2, Len(Temp))

Err_Fn:        Exĩt Function
Loi_Fn:
     Msgbox Error$, , Erl
     Resume Err_Fn
End Function
 
Upvote 0
: ndu96081631 Có thể cho biết hàm dùng làm việc gì không?
Ah, nhân em xem bài ở chổ này:
http://www.giaiphapexcel.com/forum/showthread.php?t=11953
Bài toán về gộp dử liệu!
Ở đó đã có mấy giãi pháp:
-Dùng công thức thường
-Dùng sự kiện Worksheet_Change
Giờ em muốn dùng hàm tự tạo xem thế nào thôi ạ!
Chủ yếu là "luyện tay nghề" (cho giống anh) chứ không ứng dụng gì cả
 
Upvote 0
Mã:
Function JoinIf(VungDK As Range, DK As Variant, VungKQ As Range, _ 
      [COLOR="Red"]Optional [/COLOR]PC As Variant) As String
Đúng là mình quên kiểm tra phần khai báo nên không tìm ra lỗi.
Mã:
JoinIf = Mid(Temp, Len(PC) + 1, Len(Temp))
Sửa như thế này là chính xác vì hàm Mid tùy thuộc vào số ký tự của PC.
-Câu 2 của bạn đây. Bạn xem thử có vấn đề gì không:
Mã:
Function JoinIf(VungDK As Range, DK As Variant, VungKQ As Range, Optional PC As Variant) As String
  Dim i As Long, Dem As Long, SoDK As Long, j As Long
  Dim Temp As String
  j = 1
  Dem = VungDK.Count
  SoDK = Application.WorksheetFunction.CountIf(VungDK, DK)
  ReDim Arr(SoDK)
  If IsMissing(PC) Then PC = ""
  For i = 1 To Dem
      If VungDK(i) = DK Then
      Arr(j) = VungKQ(i)
      j = j + 1
    End If
    Next
      Temp = Join(Arr(), PC)
  JoinIf = Mid(Temp, Len(PC) + 1, Len(Temp))
End Function
 
Upvote 0
-Câu 2 của bạn đây. Bạn xem thử có vấn đề gì không:
Ai chà, hèn nào em làm hoài hỏng ra, em viết
Arr(i) = VungKQ(i)
Sao nó không thể dùng số chạy i đựoc nhỉ?
---------------
Còn câu hỏi số 3 của em thì sao thầy ơi!
(em thí nghiệm mà không phát hiện chổ nào khác nhau cả)
 
Lần chỉnh sửa cuối:
Upvote 0
Nguyên văn bởi ndu96081631
Arr(i) = VungKQ(i)
Sao nó không thể dùng số chạy i đựoc nhỉ?
Bạn kiểm tra xem, nếu dùng Arr(i) thì các phần tử mảng có liên tục không?
 
Upvote 0
Web KT

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

Back
Top Bottom