Cách viết Function (UDF) chạy như Sub

Liên hệ QC

Ngô Hải Đăng

Thành viên hoạt động
Tham gia
31/8/17
Bài viết
183
Được thích
247
Giới tính
Nam
Mình ví dụ tạo Hàm Tô Màu, truyền vô 2 tham số dòng và cột. Nếu viết như vậy thì Excel sẽ báo lỗi
Mã:
Function ToMauBinhThuong(ThamSo1 As Long, ThamSo2 As Long)
  Cells(ThamSo1, ThamSo2).Interior.Color = &HFF
End Function
Nhưng nếu mình viết như vậy thì Excel sẽ không báo lỗi nữa
Mã:
Public ThamSo As Collection

Function ToMauBatThuong(ThamSo1 As Long, ThamSo2 As Long)
  Set ThamSo = New Collection
  ThamSo.Add ThamSo1
  ThamSo.Add ThamSo2
  Application.Caller.Parent.[0+ChaySub("S_ToMauBatThuong")]
End Function

Private Function ChaySub(TenSub As String)
  Application.Run TenSub
  Set ThamSo = Nothing
End Function

Private Sub S_ToMauBatThuong()
  Cells(ThamSo(1), ThamSo(2)).Interior.Color = &HFF
End Sub
Tại ô bất kỳ gõ công thức =ToMauBatThuong(Dòng số, Cột số)
Cách viết kiểu này thì vẫn còn 1 số hạn chế như: không thể dùng lệnh Clear, Delete,...Tuy nhiên nếu biết cách vận dụng thì sẽ tạo ra được 1 số hàm hữu ích cho mình.

Update code https://www.giaiphapexcel.com/diend...function-udf-chạy-như-sub.153245/post-1005047
 
Lần chỉnh sửa cuối:
Theo em nghĩ nó là giá trị trả về dạng stringthôi ạ, nếu bỏ đi thì giá trị trả về mặc định bằng 0
True là True chứ không thể trả về 0 được! True ở sheet tương đương với 1, nhưng VBA lại tương đương với -1. Chú ý về vấn đề này!
 
Upvote 0
nhưng không thấy được kết quả. A có thể chỉ giúp em lỗi được không ạ?
Có một số trường hợp nó không thực hiện được bằng cách này, như trường hợp này là rng.Rowheight = value. Tương tự với rng.ClearContents cũng không được mà dùng rng = Empty thì lại được.
 
Upvote 0
Có một số trường hợp nó không thực hiện được bằng cách này, như trường hợp này là rng.Rowheight = value. Tương tự với rng.ClearContents cũng không được mà dùng rng = Empty thì lại được.
:(( Anh có thể chia sẻ code border của video không ạ?. Còn những thuộc tính nào a đã test qua rồi a?
 
Upvote 0
:(( Anh có thể chia sẻ code border của video không ạ?. Còn những thuộc tính nào a đã test qua rồi a?
PHP:
Sub BorderAll(ByVal BorderRange As Range, Optional ByVal IsBorder As Boolean = True)
    With BorderRange
        If IsBorder Then
            .Borders(xlEdgeLeft).Weight = xlThin
            .Borders(xlEdgeTop).Weight = xlThin
            .Borders(xlEdgeBottom).Weight = xlThin
            .Borders(xlEdgeRight).Weight = xlThin
            .Borders(xlInsideVertical).Weight = xlThin
            .Borders(xlInsideHorizontal).Weight = xlThin
        Else
            .Borders(xlDiagonalDown).LineStyle = xlNone
            .Borders(xlDiagonalUp).LineStyle = xlNone
            .Borders(xlEdgeLeft).LineStyle = xlNone
            .Borders(xlEdgeTop).LineStyle = xlNone
            .Borders(xlEdgeBottom).LineStyle = xlNone
            .Borders(xlEdgeRight).LineStyle = xlNone
            .Borders(xlInsideVertical).LineStyle = xlNone
            .Borders(xlInsideHorizontal).LineStyle = xlNone
        End If
    End With
End Sub

Bạn thử với thủ tục này, nó có 2 chức năng, border và hủy border!

1) Border:

Call BorderAll(Range("B1:F10"))
hoặc Call BorderAll(Range("B1:F10"), True) vì True là mặc định nên không có cũng không sao.
hoặc:
BorderAll Range("B1:F10") hoặc BorderAll Range("B1:F10"), True

2) Hủy Border:

Call BorderAll(Range("B1:F10"), False)
vì False là bắt buộc.
hoặc:
BorderAll Range("B1:F10"), False
 
Upvote 0
Bạn thử với thủ tục này, nó có 2 chức năng, border và hủy border!
Sub thì em nghĩ em có thể làm được. Em đang tò mò cái này ạ. :D
Mình đã tìm ra cách kết nối UFD với Sub thông qua Class Module mà không cần sài EVALUTE hoặc API. UDF chạy xong mới gọi Sub nên sẽ thao tác được mọi thứ trên sheet. Úp video demo trước rồi đi ngủ.
 
Upvote 0

File đính kèm

  • SubFunction.xlsb
    27.9 KB · Đọc: 13
Upvote 0
Thử sài class module với cái hàm của bạn. Bạn có thể dựa theo đó để làm cái tương tự như trong clip mình làm. Cái file cũ trong clip mình tìm không ra.
Hay qúa anh. xem ra đang dịch rã em phải tranh thủ học thêm class module thôi ạ. Em vẫn còn yếu VBA quá. ><<...,
 
Upvote 0
Web KT

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

Back
Top Bottom