Viết hàm tự tạo theo kiểu Excel 365

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
246
Giới tính
Nam
Nghiên cứu trên diễn đàn thì phát hiện được cái Application.Caller và sau đây là ý tưởng của mình:
1. Code trên ThisWorkbook
Mã:
Option Explicit

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
    If IsUDF Then
        SetResult
        rCaller.Formula = sFormula
    End If
End Sub

Private Sub SetResult()
    Dim r0&, c0&
    On Error Resume Next
    r0 = UBound(aResult, 1) - LBound(aResult, 1)
    c0 = UBound(aResult, 2) - LBound(aResult, 2)
    On Error GoTo 0
    If c0 = 0 Then
        rCaller.Resize(1, r0 + 1) = aResult
    Else
        rCaller.Resize(r0 + 1, c0 + 1) = aResult
    End If
End Sub

2. Code trên Module
Mã:
Option Explicit

Public IsUDF As Boolean
Public rCaller As Range
Public aResult As Variant
Public sFormula As String

Function MyUDF()
    If IsUDF Then
        MyUDF = aResult
        IsUDF = False
        Set rCaller = Nothing
        If IsArray(aResult) Then Erase aResult Else aResult = Empty
    Else
        IsUDF = True
        Set rCaller = Application.Caller
        sFormula = rCaller.Formula
        
        'Dim tmp As String: tmp = "1 GIA TRI"
        'Dim tmp: tmp = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
        Dim tmp(10, 15) As Long
        aResult = tmp
    End If
End Function

3. Gõ =MyUDF() trên Sheet để test.

Có thể thử với kết quả là 1 giá trị, mảng 1 chiều và mảng 2 chiều. Mong được học hỏi thêm kinh nghiệm từ mọi người.
 
Thử cho vài đối số của hàm vào xem sao ... xong tính tiếp
VD: [A1] = Hàm(value1, value2, value3)
 
Upvote 0
Như này được tính không chủ thớt?

 
Upvote 0
Chắc là chủ thớt chưa bao giờ tham khảo hàm do HeSanbi viết:
Toàn bộ link dưới đây đều là mảng động.


Và nhiều nữa, không copy nổi
(Hôm nào chắc tôi phải viết 1 macro lấy toàn bộ bài viết của chính mình)
Bạn tham khảo để viết hàm sao chép hàm có ở Excel 365.
 
Upvote 0
Nó cứ loanh quanh đâu đó trên VBA thôi ... chưa cần thiết phải dùng tới API
nếu dùng tới API vào chắc còn hay hơn nữa ... mà Mạnh chưa biết xài API của Bill trong trường họp này
 
Upvote 0
Upvote 0
Nó cứ loanh quanh đâu đó trên VBA thôi ... chưa cần thiết phải dùng tới API
nếu dùng tới API vào chắc còn hay hơn nữa ... mà Mạnh chưa biết xài API của Bill trong trường họp này

Kỹ thuật lập trình không phải cứ API là làm được tất cả. Người ta phải tạo ra những thứ mà API chưa có thì mới là độc. Add-in A-Tools tạo ra hàm mảng cơ động từ cách đây hơn 10 năm, từ cái thời Excel 97 thì đương nhiên Bill chưa hề có ý tưởng về hàm mảng, mãi gần đây GoogleSheet và Excel 365 mới có đưa ra cách làm việc hàm mảng. Tuy nhiên các cách hiện nay cả trên Excel 365 và GoogleSheets đều chỉ mới chớm nở, làm giản đơn, thô chứ chưa phải linh hoạt. Còn các hàm mảng viết trên VBA hiện nay đâu đó cũng chưa đạt được yêu cầu sử dụng đâu. Cứ cho vài công thức mảng trên cùng một sheet, chèn, xóa dòng cột xem sẽ thấy ngay. Đến thời điểm này mình vẫn nói, kỹ thuật tạo hàm trả về mảng để đưa vào thực tế là rất rất khó chứ không phải dễ.
 
Upvote 0
Kỹ thuật lập trình không phải cứ API là làm được tất cả. Người ta phải tạo ra những thứ mà API chưa có thì mới là độc. Add-in A-Tools tạo ra hàm mảng cơ động từ cách đây hơn 10 năm, từ cái thời Excel 97 thì đương nhiên Bill chưa hề có ý tưởng về hàm mảng, mãi gần đây GoogleSheet và Excel 365 mới có đưa ra cách làm việc hàm mảng. Tuy nhiên các cách hiện nay cả trên Excel 365 và GoogleSheets đều chỉ mới chớm nở, làm giản đơn, thô chứ chưa phải linh hoạt. Còn các hàm mảng viết trên VBA hiện nay đâu đó cũng chưa đạt được yêu cầu sử dụng đâu. Cứ cho vài công thức mảng trên cùng một sheet, chèn, xóa dòng cột xem sẽ thấy ngay. Đến thời điểm này mình vẫn nói, kỹ thuật tạo hàm trả về mảng để đưa vào thực tế là rất rất khó chứ không phải dễ.
sau này mạnh mới biết cái Hàm tự tạo gõ 1 Cells trả về dữ liệu 1 bên value nó có từ Office 97 .. có điều ít ai biết mà vận dụng nó
Còn những cái khác mạnh ko có biết
 
Upvote 0
GoogleSheets đều chỉ mới chớm nở, làm giản đơn, thô chứ chưa phải linh hoạt
Google Sheets chứ không phải "GoogleSheets" nhé anh.

Anh viết vậy em tò mò quá. Anh có thể lập 01 bảng đối chiếu các chỗ [ chớm nỏ, giản đơn, thô ] ở trên em tham khảo được không anh, vì em thấy có người ca ngợi Google Sheets hay lắm.
 
Upvote 0
Google Sheets chứ không phải "GoogleSheets" nhé anh.

Anh viết vậy em tò mò quá. Anh có thể lập 01 bảng đối chiếu các chỗ [ chớm nỏ, giản đơn, thô ] ở trên em tham khảo được không anh, vì em thấy có người ca ngợi Google Sheets hay lắm.
Thực ra Google Sheet mới là đồ chơi thêm của hãng Google, không phải trọng tâm của công ty họ, nên còn có những hạt sạn, hoặc chưa hoàn hảo (tất nhiên mọi so sánh đều khập khiễng)
 
Upvote 0
Thực ra Google Sheet mới là đồ chơi thêm của hãng Google, không phải trọng tâm của công ty họ, nên còn có những hạt sạn, hoặc chưa hoàn hảo (tất nhiên mọi so sánh đều khập khiễng)
Em cần cụ thể, chi tiết như nào ấy. Nói khơi khơi, đại khái thế em bị ăn mắng ngay.
 
Upvote 0
Google Sheets chứ không phải "GoogleSheets" nhé anh.

Anh viết vậy em tò mò quá. Anh có thể lập 01 bảng đối chiếu các chỗ [ chớm nỏ, giản đơn, thô ] ở trên em tham khảo được không anh, vì em thấy có người ca ngợi Google Sheets hay lắm.

Đơn giản thôi. Có ai dùng hàm Filter của Google Sheets hay Excel 365 mà không muốn nó từ chèn dòng chèn cột, khi điều kiện lọc thay đổi? Có thể cái yêu cầu này chỉ là chủ quan của một nhóm nhu cầu trên thế giới. Mọi người đều đang phải chấp nhận cái lỗi #N/A hoặc #Spill khi phía dưới hay bên phải vùng công thức bị thiếu không gian để điền dữ liệu của hàm. Tôi cũng không biết đến bao giờ thì họ làm cái điều đó hoặc có thể họ không quan tâm. Chớm nở tôi nói ý ở đây mới chỉ đơn giản là đổ ra cái mảng chứ chưa có các đặc tính hỗ trợ tối thiểu như vừa nói. Chớm nở cũng là mới mẻ thôi. Xét về kỹ thuật còn lắm thứ họ phải hoàn thiện, mà cỗ máy khổng lồ không cẩn thận chỉ vì một chi tiết mà làm lỗi cả hệ thống thì họ không dại dấn vào.
 
Upvote 0
Upvote 0
Kỹ thuật lập trình không phải cứ API là làm được tất cả. Người ta phải tạo ra những thứ mà API chưa có thì mới là độc. Add-in A-Tools tạo ra hàm mảng cơ động từ cách đây hơn 10 năm, từ cái thời Excel 97 thì đương nhiên Bill chưa hề có ý tưởng về hàm mảng, mãi gần đây GoogleSheet và Excel 365 mới có đưa ra cách làm việc hàm mảng. Tuy nhiên các cách hiện nay cả trên Excel 365 và GoogleSheets đều chỉ mới chớm nở, làm giản đơn, thô chứ chưa phải linh hoạt. Còn các hàm mảng viết trên VBA hiện nay đâu đó cũng chưa đạt được yêu cầu sử dụng đâu. Cứ cho vài công thức mảng trên cùng một sheet, chèn, xóa dòng cột xem sẽ thấy ngay. Đến thời điểm này mình vẫn nói, kỹ thuật tạo hàm trả về mảng để đưa vào thực tế là rất rất khó chứ không phải dễ.
Excel ngoài hàm và VBA còn có M language và Dax language trên Power query và Power pivot, bạn hãy tìm hiểu cách xử lý dynamic array trên 2 ngôn ngữ đó nó không phải là mới chớm nở, làm giản đơn, thô chứ chưa phải linh hoạt như bạn nói đâu, DAX language có 10 năm rồi
 
Upvote 0
Excel ngoài hàm và VBA còn có M language và Dax language trên Powery và Power pivot, bạn hãy tìm hiểu cách xử lý dynamic array trên 2 ngôn ngữ đó nó không phải là mới chớm nở, làm giản đơn, thô chứ chưa phải linh hoạt như bạn nói đâu, DAX language có 10 năm rồi

Tôi đang nói về kỹ thuật tạo hàm trả về mảng động trên Worksheet mà. Bạn có hiểu có chế của loại hàm này trên worksheet không? Nếu hiểu thì bạn có thể lấy ví dụ mà các công cụ hay ngôn ngữ bạn nói để tạo ra nó, chay trên các phiên bản Excel thấp hơn Excel 365 nhé.
 
Upvote 0
Em cần cụ thể, chi tiết như nào ấy. Nói khơi khơi, đại khái thế em bị ăn mắng ngay.
Mắng là việc của bạn, tìm hiểu là việc của mỗi người, Ai quan tâm thì phải tìm hiểu sâu, đây không phải chủ đề đó , nên viết vậy thôi nhế, thông cảm
 
Lần chỉnh sửa cuối:
Upvote 0
Có ai dùng hàm Filter của Google Sheets hay Excel 365 mà không muốn nó từ chèn dòng chèn cột, khi điều kiện lọc thay đổi?
Chắc chữ "từ" ở trên là chữ "tự" (tự động) phải không anh?
Có thể cái yêu cầu này chỉ là chủ quan của một nhóm nhu cầu trên thế giới.
Anh có thể dẫn chứng một số nước điển hình có nhu cầu như trên được không anh?
 
Upvote 0
Chắc chữ "từ" ở trên là chữ "tự" (tự động) phải không anh?

Anh có thể dẫn chứng một số nước điển hình có nhu cầu như trên được không anh?

Từ -> Tự động nhé. Chúng ta đâu cần thiết để phải dẫn chứng những nội dung lan man ở topic này đâu bạn. Nên tôi chỉ nói là "có thể", "trên thế giới" khi không có tính khẳng định. Ai mà dám nói hay khẳng định có hay không trên cả thế giới chứ :D
 
Upvote 0
Web KT

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

Back
Top Bottom