Excel UDF không hoạt động: sự cố và giải pháp

  • Chia Sẻ Cái Này
Michael Brown

Trong bài viết này, chúng ta sẽ xem xét các vấn đề mà bạn có thể gặp phải khi sử dụng các hàm tùy chỉnh trong sổ làm việc của mình. Tôi sẽ cố gắng chỉ cho bạn biết nguyên nhân gây ra lỗi và cách khắc phục chúng dễ dàng như thế nào.

Sau đây là nội dung chúng ta sẽ thảo luận:

    Trước đây chúng ta đã nói về nguyên nhân chức năng tùy chỉnh là, cách tạo và sử dụng nó. Nếu bạn cảm thấy mình cần làm mới kiến ​​thức cơ bản về UDF trước, hãy tạm dừng và xem qua bài viết trước của tôi.

    Tại sao Excel UDF không tính toán lại?

    Khi bạn thực hiện bất kỳ thay đổi nào trong sổ làm việc của bạn, Excel sẽ không tính toán lại từng công thức bạn có ở đó. Nó sẽ chỉ cập nhật kết quả cho những công thức được liên kết với các ô đã thay đổi.

    Nhưng điều này liên quan đến các hàm Excel tiêu chuẩn. Đối với các ô tùy chỉnh, Excel không thể xác thực mã VBA và xác định các ô khác cũng có thể ảnh hưởng đến kết quả của hàm tùy chỉnh. Do đó, công thức tùy chỉnh của bạn có thể không thay đổi khi bạn thay đổi sổ làm việc.

    Để khắc phục sự cố, bạn chỉ cần sử dụng câu lệnh Application.Volatile . Hãy xem chương tiếp theo để tìm hiểu hướng dẫn từng bước về cách áp dụng nó.

    Hàm tùy chỉnh dễ thay đổi và không thay đổi

    Theo mặc định, hàm tùy chỉnh trong Excel không ổn định. Điều này có nghĩa là UDF chỉ được tính toán lại nếu giá trị của bất kỳ ô nào mà nó đề cập đến thay đổi. Nhưng nếu định dạng của các ô, tên củatrang tính, tên của tệp thay đổi, thì sẽ không có thay đổi nào xảy ra trong UDF.

    Hãy chuyển từ từ sang ví dụ. Chẳng hạn, bạn cần viết tên sổ làm việc của mình vào một ô. Để làm điều này, bạn tạo một hàm tùy chỉnh:

    Function WorkbookName() As String WorkbookName = ThisWorkbook.Name End Function

    Bây giờ hãy tưởng tượng trường hợp sau. Bạn đã viết công thức tùy chỉnh =WorkbookName() vào ô và có tên tệp ở đó. Sau một thời gian, bạn quyết định đổi tên tệp và lưu nó bằng một tên khác. Nhưng bạn nhìn vào giá trị trong ô và thấy rằng nó không thay đổi. Vẫn còn một tên tệp cũ không còn đúng nữa.

    Vì hàm này không có đối số nên hàm không được tính toán lại (ngay cả khi bạn đổi tên sổ làm việc, đóng nó rồi mở lại nó).

    Lưu ý. Để tính toán lại tất cả các chức năng trong tệp của bạn, bạn có thể sử dụng phím tắt Ctrl + Alt + F9.

    Có cách nào dễ hơn không? Để thực hiện tính toán lại công thức mỗi khi trang tính thay đổi, bạn cần thêm một dòng mã. Dán đoạn mã sau vào đầu hàm của bạn:

    Application.Volatile

    Vì vậy, mã của bạn sẽ trông như thế này:

    Function WorkbookName() As String Application.Volatile WorkbookName = ThisWorkbook.Name End Function

    Bây giờ UDF của bạn không ổn định, do đó nó sẽ tự động được tính toán lại nếu có bất kỳ ô nào trong trang tínhđã được tính toán lại hoặc bất kỳ thay đổi nào đã xảy ra trong sổ làm việc. Ngay sau khi bạn thay đổi tên của tệp, bạn sẽ thấy bản cập nhật đó ngay lập tức.

    Lưu ý. Xin lưu ý rằng quá nhiều hàm biến động có thể làm chậm Excel của bạn. Xét cho cùng, có quá nhiều hàm tùy chỉnh thực hiện các phép tính phức tạp và hoạt động liên tục trên phạm vi dữ liệu lớn.

    Do đó, tôi khuyên bạn chỉ nên sử dụng biến động khi thực sự cần thiết.

    Tại sao chức năng tùy chỉnh không khả dụng

    Khi bạn nhập các chữ cái đầu tiên trong tên của chức năng tùy chỉnh, nó sẽ xuất hiện trong danh sách thả xuống bên cạnh ô nhập liệu, giống như các hàm tiêu chuẩn của Excel.

    Tuy nhiên, điều này không phải lúc nào cũng xảy ra. Lỗi nào có thể gây ra tình trạng này?

    Nếu bạn dùng Excel 2003-2007 thì UDF không bao giờ xuất hiện trong danh sách thả xuống. Ở đó, bạn chỉ có thể thấy các hàm tiêu chuẩn.

    Nhưng ngay cả khi bạn đang sử dụng phiên bản Excel mới hơn, vẫn có một lỗi khác mà bạn có thể vô tình mắc phải.

    Bạn thấy đấy, hàm tùy chỉnh phải có trong một mô-đun VBA tiêu chuẩn được gọi là Mô-đun. Khi bạn thêm một mô-đun mới để viết mã chức năng, thư mục Mô-đun sẽ tự động được tạo trong đó tất cả các mô-đun được ghi.

    Nhưng đôi khi, mô-đun mới không được tạo được tạo ra. Trên ảnh chụp màn hình tiếp theo, bạn có thể thấy mã chức năng tùy chỉnh nằm trong mô-đun “Đối tượng Microsoft Excel” cùng vớiThisWorkbook.

    Vấn đề là bạn không thể đặt một hàm tùy chỉnh trong vùng mã của trang tính hoặc sổ làm việc. Trong trường hợp này, chức năng sẽ không hoạt động. Hơn nữa, nó sẽ không xuất hiện trong danh sách chức năng thả xuống. Do đó, mã phải luôn nằm trong thư mục Mô-đun .

    Văn bản trợ giúp chức năng tùy chỉnh của Excel không được hiển thị

    Một vấn đề khác có thể xảy ra là gợi ý mà bạn nhìn thấy khi dán một chức năng tùy chỉnh. Nếu bạn sử dụng một hàm tiêu chuẩn, bạn sẽ luôn thấy chú giải công cụ cho hàm và các đối số của hàm đó. Nhưng còn UDF thì sao?

    Nếu bạn có nhiều hàm tùy chỉnh, bạn sẽ cực kỳ khó nhớ mỗi hàm thực hiện những phép tính nào. Sẽ còn khó khăn hơn để nhớ những đối số nào sẽ sử dụng. Tôi nghĩ rằng bạn nên có một mô tả về các chức năng tùy chỉnh của mình để nhắc nhở.

    Đối với điều này, tôi khuyên bạn nên sử dụng phương pháp Application.MacroOptions . Nó sẽ giúp bạn hiển thị mô tả không chỉ của hàm mà còn của từng đối số của nó trong cửa sổ Trình hướng dẫn Hàm. Bạn sẽ thấy cửa sổ này khi nhấp vào nút Fx trong thanh công thức.

    Hãy xem cách thêm gợi ý như vậy vào UDF của bạn. Trong bài viết trước, chúng ta đã xem xét chức năng tùy chỉnh GetMaxBetween. Nó tìm số tối đa trong phạm vi đã chỉ định và nhận ba đối số: phạm vi giá trị số và giá trị tối đa và tối thiểu đểtìm kiếm.

    Bây giờ, chúng tôi sẽ thêm mô tả cho chức năng tùy chỉnh này. Để thực hiện việc này, hãy tạo và chạy lệnh Application.MacroOptions . Đối với hàm GetMaxBetween , bạn có thể chạy lệnh sau:

    Sub RegisterUDF () Dim strFuncName As String 'tên hàm bạn muốn đăng ký Dim strDescr As String ' mô tả hàm chính nó Dim strArgs() As String 'mô tả các đối số hàm' Đăng ký hàm GetMaxBetween ReDim strArgs (1 To 3) 'Số lượng đối số trong hàm của bạn strFuncName = "GetMaxBetween" strDescr = "Số lượng tối đa trong phạm vi được chỉ định" strArgs (1) = "Dải giá trị số" strArgs(2) = "Đường viền khoảng dưới " strArgs(3) = " Đường viền khoảng trên " Application.MacroOptions Macro: = strFuncName, _ Mô tả: = strDescr, _ ArgumentDescriptions: = strArgs, _ Danh mục: = " Chức năng tùy chỉnh của tôi " End Sub

    or

    Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Mô tả: = "Số tối đa trong phạm vi được chỉ định", _ Danh mục: = "Của tôi Hàm tùy chỉnh" , _ Mô tả đối số: = Mảng (_ "Phạm vi giá trị số" , _ "Khoảng dưới der" , _ "Đường viền khoảng trên" ) End Sub

    Biến str FuncName là tên của hàm. strDescr - mô tả chức năng. Các biến strArgs chứa gợi ý cho mỗi đối số.

    Bạn có thể thắc mắc đối số thứ tư là gìỨng dụng.MacroOptions. Đối số tùy chọn này được đặt tên là Category và cho biết loại hàm Excel mà hàm GetMaxBetween () tùy chỉnh của chúng ta sẽ được đặt vào. Bạn có thể đặt tên cho nó theo bất kỳ danh mục nào hiện có: Math & ; Trig, Statistical, Logical, v.v. Bạn có thể chỉ định tên cho danh mục mới mà bạn sẽ đặt các chức năng mà bạn tạo. Nếu bạn không sử dụng đối số Danh mục thì chức năng tùy chỉnh sẽ tự động được đặt trong danh mục “Người dùng xác định”.

    Dán mã chức năng vào cửa sổ mô-đun:

    Sau đó nhấp vào nút “Chạy”. Lệnh sẽ thực hiện tất cả cài đặt để sử dụng nút Fx với chức năng GetMaxBetween() của bạn.

    Nếu bạn cố gắng chèn một hàm vào một ô bằng cách sử dụng Chèn hàm , bạn sẽ thấy rằng hàm GetMaxBetween của bạn nằm trong danh mục "Chức năng tùy chỉnh của tôi":

    Bạn có thể chỉ cần bắt đầu nhập tên hàm vào ô và bạn sẽ thấy hàm tùy chỉnh của mình trong danh sách thả xuống gồm các hàm để chọn.

    Sau đó gọi Trình hướng dẫn hàm bằng nút Fx.

    Mẹo. Bạn cũng có thể sử dụng tổ hợp phím CRTL + A để mở Trình hướng dẫn Chức năng.

    Trong cửa sổ Trình hướng dẫn hàm , bạn sẽ thấy mô tả về hàm của mình, cũng như gợi ý cho đối số đầu tiên. Nếu bạn đặt con trỏ chuột lênđối số thứ hai hoặc thứ ba, bạn cũng sẽ thấy gợi ý cho chúng.

    Nếu bạn muốn thay đổi văn bản của những gợi ý này, hãy thay đổi giá trị của strDescr strArgs trong mã RegisterUDF () . Sau đó chạy lại lệnh RegisterUDF () .

    Nếu bạn muốn hoàn tác tất cả các cài đặt đã thực hiện và xóa mô tả chức năng, hãy chạy mã này:

    Sub UnregisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = Empty , ArgumentDescriptions: = Empty , Category: = Empty End Sub

    Có một cách nữa để nhận gợi ý khi bạn nhập một hàm tùy chỉnh. Nhập tên của hàm rồi nhấn Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    Bạn sẽ thấy danh sách tất cả các đối số của hàm:

    Thật không may, ở đây bạn sẽ không thấy phần mô tả hàm và các đối số của nó. Nhưng nếu tên của các đối số có khá nhiều thông tin, thì chúng cũng có thể hữu ích. Tuy nhiên, có còn hơn không :)

    Sẽ mất thêm một chút công sức để tạo cảm giác thông minh cho UDF hoạt động giống như các hàm Excel tiêu chuẩn. Thật không may, Microsoft không cung cấp bất kỳ tùy chọn nào. Giải pháp duy nhất hiện có là phần mở rộng Excel-DNA IntelliSense. Bạn có thể tìm thêm thông tin trên trang web của nhà phát triển.

    Hy vọng rằng những nguyên tắc này sẽ giúp bạn giải quyết vấn đề khi chức năng tùy chỉnh của bạn không hoạt động hoặc không hoạt độnglàm việc như bạn muốn. Tuy nhiên, nếu UDF của bạn vẫn không hoạt động, vui lòng mô tả chính xác vấn đề của bạn trong phần Nhận xét. Chúng tôi sẽ cố gắng tìm hiểu và tìm ra giải pháp cho bạn ;)

    Michael Brown là một người đam mê công nghệ chuyên dụng với niềm đam mê đơn giản hóa các quy trình phức tạp bằng các công cụ phần mềm. Với hơn một thập kỷ kinh nghiệm trong ngành công nghệ, anh ấy đã trau dồi kỹ năng của mình trong Microsoft Excel và Outlook, cũng như Google Trang tính và Tài liệu. Blog của Michael dành để chia sẻ kiến ​​thức và chuyên môn của anh ấy với những người khác, cung cấp các mẹo và hướng dẫn dễ thực hiện để cải thiện năng suất và hiệu quả. Cho dù bạn là một chuyên gia dày dạn kinh nghiệm hay người mới bắt đầu, blog của Michael đều cung cấp những hiểu biết có giá trị và lời khuyên thiết thực để tận dụng tối đa những công cụ phần mềm thiết yếu này.