Nhờ các thày giúp cho vài ví dụ về truyền tham số cho thủ tục Sub (hoặc hàm Function)

Liên hệ QC

Dauthivan

Thành viên tiêu biểu
Tham gia
15/8/08
Bài viết
565
Được thích
327
Em đang nghiên cứu về truyền tham số bằng giá trị (byVal tức Byvalue), em có tìm đọc trên diễn đàn thì hầu hết nói rất nhanh vấn đề này, chính vì vậy em nhờ mọi người giúp em:

- Tại sao lại phải cần thiết truyền tham số.

- Giúp em một vài ví dụ để em hiểu về "cách truyền" của nó

Xin đa tạ các thày
 
Hic, spam cái. Công nhận vài hôm nay ndu quá kiên nhẫn.
.
Em cũng.. spam tiếp
Em chỉ có thể kiên nhẫn với những ai chịu học... dù chậm tiêu cũng không sao, miễn là cố mà "nhai" cho kỹ
Và em sẽ rất mất kiên nhẫn với những câu hỏi.. tào lao
Ẹc... Ẹc...
(nhớ ngày xưa sư phụ cũng từng mắng em rằng: "Đã viết ở bài... sao chẳng chịu xem?)
 
Upvote 0
Qua đây em nhận ra thế này Sub phải tạo ra được:
- Hoặc một sản phẩm hoàn chỉnh (thể hiện ra ngoài màn hình),
- Hoặc một sản phẩm chưa phải cuối cùng nhưng phải để cho thằng khác sài chứ không được cất đi (tức phải có thêm Public)

-------------
Em học tuy có chậm hiểu, nhưng tiếp thu bài rất nghiêm túc với mong mỏi học được được kiến thức mới, kính mong các thày giúp đỡ
 
Lần chỉnh sửa cuối:
Upvote 0
- Hoặc một sản phẩm chưa phải cuối cùng nhưng phải để cho thằng khác sài chứ không được cất đi (tức phải có thêm Public)
Nói thêm về hình thức tạo sản phẩm này: Thông thường người ta sẽ viết thành 1 Function thay cho Sub ---> Vì bản thân Function sẽ tạo ra sản phẩm và ta dùng được ngay (trong khi nếu viết thành Sub, buộc phải khai báo biến kết quả thành dạng Public ---> Rắc rối)
 
Upvote 0
Em đang loay hoay thay đổi cách dùng để nhớ lại lý thuyết, em dùng Keys của Dic thì phải sửa cái này thế nào ah
PHP:
Sub Filter(ByVal SrcRng As Range, ByVal Target As Range)
  Dim Arr(), tmpArr, lR As Long, lC As Long, Dic As Object, tmp
  tmpArr = SrcRng
  ReDim Arr(1 To UBound(tmpArr, 1) * UBound(tmpArr, 2), 1 To 1)
  Set Dic = CreateObject("Scripting.Dictionary")
  For lC = 1 To UBound(tmpArr, 2)
    For lR = 1 To UBound(tmpArr, 1)
      If tmpArr(lR, lC) <> "" Then
        tmp = tmpArr(lR, lC)
        If Not Dic.Exists(tmp) Then
          Dic.Add tmp, ""
          Arr = Dic.Keys
        End If
       End If
     Next lR
  Next lC
  If kk Then Target.Resize(, kk).Value = Arr
End Sub

PHP:
Sub Main()
  Dim SrcRng As Range, Target As Range
  Set SrcRng = Sheet1.Range("A1:B1000")
  Set Target = Sheet2.Range("A1")
  Filter SrcRng, Target
End Sub

Hôm nay không nhờ các thày bảo thì làm sao biết được thế nào là Sub, thế nào là Function; thế mà trước cứ ngỡ là biết....mơ quá ...Híc
 
Lần chỉnh sửa cuối:
Upvote 0
Nói thêm về hình thức tạo sản phẩm này: Thông thường người ta sẽ viết thành 1 Function thay cho Sub ---> Vì bản thân Function sẽ tạo ra sản phẩm và ta dùng được ngay (trong khi nếu viết thành Sub, buộc phải khai báo biến kết quả thành dạng Public ---> Rắc rối)

Đúng vậy nhưng Không chỉ như vậy. Biến Public nếu khéo dùng thì còn nhiều cái hay hơn. Thí dụ tôi có 1 Sub:

PHP:
Public abc As Long
Sub ExecutiveA()
Select Case abc
    Case 1
        Code thực thi 1
    Case 2
        Code thực thi 2
    ...

    Case 10
        Code thực thi 10
End Select
End Sub

Code này gán cho sự kiện On Open của 1 form ABC. Rồi để đó.

Trên 1 form khác có 1 số Command Button, nhấn vào đâu cũng đều mở Form ABC nói trên.

Nhưng Form ABC mỗi lần mở có công dụng khác nhau, title khác nhau, dữ liệu nguồn cho listbox, combobox khác nhau... tất cả là căn cứ vào biến Public abc.

Vậy mỗi khi nhấn nút của form 1, tuy theo ý muốn chạy form ABC thế nào, ta gán những giá trị khác nhau cho biến abc.

PHP:
Sub CmbBtn1_Click()
  abc = 1
  ABC.Show
End Sub

Nghĩa là thay vì phải tạo 10 form tương tự nhau, na ná nhau, ta chỉ cần 1 form.
 
Lần chỉnh sửa cuối:
Upvote 0
Em đang loay hoay thay đổi cách dùng để nhớ lại lý thuyết, em dùng Keys của Dic thì phải sửa cái này thế nào ah
PHP:
Sub Filter(ByVal SrcRng As Range, ByVal Target As Range)
  Dim Arr(), tmpArr, lR As Long, lC As Long, Dic As Object, tmp
  tmpArr = SrcRng
  ReDim Arr(1 To UBound(tmpArr, 1) * UBound(tmpArr, 2), 1 To 1)
  Set Dic = CreateObject("Scripting.Dictionary")
  For lC = 1 To UBound(tmpArr, 2)
    For lR = 1 To UBound(tmpArr, 1)
      If tmpArr(lR, lC) <> "" Then
        tmp = tmpArr(lR, lC)
        If Not Dic.Exists(tmp) Then
          Dic.Add tmp, ""
          Arr = Dic.Keys
        End If
       End If
     Next lR
  Next lC
  If kk Then Target.Resize(, kk).Value = Arr
End Sub

PHP:
Sub Main()
  Dim SrcRng As Range, Target As Range
  Set SrcRng = Sheet1.Range("A1:B1000")
  Set Target = Sheet2.Range("A1")
  Filter SrcRng, Target
End Sub

Hôm nay không nhờ các thày bảo thì làm sao biết được thế nào là Sub, thế nào là Function; thế mà trước cứ ngỡ là biết....mơ quá ...Híc
- Arr = Dic.Keys sao đặt trong vòng lập? Hết vòng lập mới lấy chứ
- If kk Then ---> kk là cái gì?
Sửa lại:
Mã:
Sub Filter(ByVal SrcRng As Range, ByVal Target As Range)
  Dim Arr(), tmpArr, lR As Long, lC As Long, Dic As Object, tmp
  tmpArr = SrcRng
  ReDim Arr(1 To UBound(tmpArr, 1) * UBound(tmpArr, 2), 1 To 1)
  Set Dic = CreateObject("Scripting.Dictionary")
  For lC = 1 To UBound(tmpArr, 2)
    For lR = 1 To UBound(tmpArr, 1)
      If tmpArr(lR, lC) <> "" Then
        tmp = tmpArr(lR, lC)
        If Not Dic.Exists(tmp) Then
          Dic.Add tmp, ""
        End If
       End If
     Next lR
  Next lC
  [COLOR=#ff0000]If Dic.Count Then
    Arr = Dic.Keys
    Target.Resize(, Dic.Count).Value = Arr
  End If[/COLOR]
End Sub
Cái Dic.Count này là thay cho kk ở những code lần trước đấy ---> Nó là số lượng phần tử có trong Dic ---> Dic.Count > 0 thì mới gán xuống sheet
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Đếm ngược thời gian

000
Ngày
00
Giờ
00
phút
00
giây
Back
Top Bottom