Chức năng người dùng tùy chỉnh mà không cần sử dụng VBA


10

Có thể tạo chức năng người dùng tùy chỉnh trong Excel mà không cần sử dụng VBA không?
Vấn đề của tôi là tôi có một chuỗi dài các hàm excel tiêu chuẩn được xâu chuỗi lại với nhau để tạo thành một hàm rất dài. Hàm này được sử dụng trên 25 bảng tính khác nhau trong sổ làm việc của tôi. Nếu tôi cần thay đổi nó, tôi chỉ muốn thực hiện ở một nơi và tự động thay đổi trên tất cả các trang tính.

Ví dụ, một trường hợp đơn giản và tầm thường sẽ là thêm một vào kết quả của SUM (), tức là. SUM (mySeries) +1 và gọi nó là hàm mới MYSUM ().

Tôi ngần ngại dịch công thức dài sang VBA do các lỗi tiềm ẩn có thể phát sinh và sự phức tạp thêm vào.


Câu hỏi hay, mặc dù tôi nghi ngờ bạn sẽ tìm thấy câu trả lời. Tôi nghĩ rằng một khóa học tốt hơn sẽ là yêu cầu trợ giúp xây dựng chức năng cần thiết trong VBA.
EliadTech

Câu trả lời:


11

Có, điều đó là có thể nếu bạn sử dụng Công thức có tên Excel .

Ví dụ: giả sử bạn cần tính chênh lệch giữa các tổng của hai cột liên tiếp ( A5: Ax - B5: Bx ) ở các vị trí khác nhau trong sổ làm việc của bạn ( x là hàng cuối cùng của mỗi cột):

Vì vậy, bạn xác định trong A11 một tên gọi là diff (bất kỳ tên nào cũng có thể được sử dụng) là = Sum (A $ 5: A10) -Sum (B $ 5: B10) , giả sử rằng dữ liệu bắt đầu ở hàng 5 cho đến hàng trước. Nó có thể là bất kỳ ô nào, không chỉ A11 , mà định nghĩa thay đổi theo cùng một cách.

Thật không may, Excel 2010 chèn các tiền tố tuyệt đối ( $ ) và tiền tố trang tính, vì vậy bạn cần xóa các tiền tố, nhưng vẫn giữ các dấu chấm than và xóa hầu hết các ký tự $ .

Khi bạn di chuyển các công thức, hầu hết các tài liệu tham khảo là tương đối. Vì vậy, nó luôn tính toán sự khác biệt giữa cột hiện tại và sau đây, bắt đầu từ hàng 5 cho đến dòng trước dòng tổng.

Vì vậy, nếu bạn có dữ liệu giữa C5D100, bạn đặt just = Diff trong C101 và nó tính Sum (C5: C100) - Sum (D5: D100) .

Rõ ràng, bạn có thể sử dụng tên địa phương hoặc toàn cầu trong các công thức được đặt tên, như bạn đã đề cập trong câu hỏi của mình.

Bạn có thể đọc thêm chi tiết trong Công thức được đặt tên .


2

Tôi biết bạn nói không có VBA, nhưng làm như sau KHÔNG yêu cầu bạn thực sự viết lại công thức của mình, biết nhiều về VBA, cũng như không duy trì công thức của bạn trong VBA. Bạn có thể viết nó một lần và quên nó đi.

Tạo Hàm do người dùng xác định để trích xuất công thức từ một ô dưới dạng chuỗi:

Function GetFormula(Target As Range) As String
    GetFormula = Target.Formula
End Function

Tạo một chuỗi khác để đánh giá một chuỗi như một công thức:

Function Eval(Ref As String)
    Application.Volatile
    Eval = Evaluate(Ref)
End Function

Nếu bạn đã có công thức chính của mình trong sheet1! A1, thì bạn sẽ đặt công thức này vào mọi ô cần sử dụng nó:

=eval(getformula(sheet1!a1))

Lợi thế của việc sử dụng phương pháp này so với Công thức có tên Excel là gì?
DakotaD

Điều này thực sự định nghĩa một hàm, trong khi "Công thức được đặt tên" chỉ định nghĩa một tham chiếu đến kết quả. Ví dụ: nếu tôi muốn tạo một hàm sẽ kiểm tra xem một ô có trống hay chỉ là khoảng trắng, tôi muốn gọi nó như thế nào =IF(BlankOrWhitespace(A5),true,false). Đối với Công thức được đặt tên là không thể bởi vì bạn đang tham khảo nội dung công thức của một ô và không xác định hàm mới
mtalexan

1
Có một vấn đề khác phát sinh từ việc sử dụng VBA. Bảo vệ. Sổ làm việc của bạn sẽ bị coi là không an toàn vì VBA có thể bị lạm dụng. Sổ làm việc của bạn sẽ bị nhầm là có virus.
Akangka

@A Khangkedit lý do tại sao tôi tránh VBA. Thật đáng tiếc.
Pedro77

0

Chủ đề này hơi cũ, nhưng tôi tình cờ tìm thấy một thứ khác và nghĩ rằng tôi sẽ chia sẻ một cuốn sách mà tôi đã tạo ra một thời gian để cố gắng thực hiện điều chính xác này: https://www.dropbox.com/s/gf5qrjj5q81tpke/ Tiêu đề_Case_Named_Range_Function.xlsx? Dl = 1

Nói tóm lại, bạn CÓ THỂ tạo UDF mà không cần VBA (sắp xếp) bằng cách chiếm quyền điều khiển một trong các công thức có sẵn của Excel với đầu ra chuỗi có độ dài 0 và đưa ra một phương pháp để diễn giải dữ liệu được chèn thông qua thao tác chuỗi Tên được đặt tên, nhưng đó là vượt quá không hiệu quả để làm như vậy. MÀY ĐÃ ĐƯỢC CẢNH BÁO! :)

PHƯƠNG PHÁP:

  1. Trong ví dụ này, tôi đã sử dụng cả = REPT ([tham chiếu ô hoặc một số văn bản giữa các trích dẫn ở đây], 0)= TEXT ([tham chiếu ô hoặc một số văn bản giữa các trích dẫn ở đây], ";;;") làm điểm bắt đầu có thể có một số dạng đầu vào của người dùng vào một công thức tích hợp sẽ không tạo ra bất kỳ kết quả văn bản hiển thị nào trong chính ô.

  2. Sau đó, tôi đã tạo Phạm vi được đặt tên tương đương với tên UDF của bạn ( TCase là ví dụ chính trong trang tính, nhưng cũng có một số biến thể khác trong đó). Phạm vi được đặt tên này thực sự tham chiếu một loạt các tên ẩn khác trong sổ làm việc để trích xuất Công thức từ ô mà nó được sử dụng bên trong và sau đó áp dụng một số logic cho nó để tạo ra đầu ra cuối cùng dưới dạng chuỗi. Điều đáng chú ý là phương pháp này chỉ có thể trả về kết quả văn bản chứ không phải số (mặc dù nó có thể trả về một số dưới dạng văn bản sẽ được chuyển đổi trong một ô riêng biệt).

  3. Về bản thân, = TCase tạo ra lỗi do không có tham chiếu ô / chuỗi để nó diễn giải (trong bảng ví dụ, thông báo lỗi chỉ là một lời nhắc về định dạng cần phải tuân theo). Nhưng, kết hợp TCase với công thức Excel chuỗi có độ dài 0 dự kiến ​​cho phép nó đọc đầu vào từ công thức dưới dạng chuỗi và áp dụng logic của bạn cho nó. Cuối cùng, công thức / đầu ra sẽ trông giống như dưới đây. Lưu ý rằng tôi đã chèn chuỗi văn bản trực tiếp vào công thức bên dưới, nhưng bạn sẽ thấy trong bảng ví dụ rằng nó cũng có thể diễn giải một tham chiếu ô duy nhất.

    CÔNG THỨC:
    =TCase&REPT("i want to convert this mIxEd sTRing into A TITLE cAsE string!!!",0)

    ĐẦU RA:

    I Want to Convert This Mixed String Into a Title Case String!!!

Cuối cùng, tôi không khuyên bạn nên làm theo phương pháp này cho bất kỳ điều gì khác ngoài sự tò mò bệnh hoạn để xem giới hạn nào Excel có thể được đẩy đến. VBA là một giải pháp UDF đơn giản và thanh lịch hơn nhiều, nhưng ít nhất tôi đã rất vui khi tham gia thử thách.

LƯU Ý: Nếu bạn muốn xem nó hoạt động như thế nào trong tệp ví dụ dễ dàng hơn một chút, hãy sử dụng Công thức Đánh giá từ ruy-băng Công thức và bước vào / ra công thức trong một trong các ô nơi tôi chèn một ví dụ. Tôi đã ẩn tất cả các Phạm vi được đặt tên bên dưới để dọn sạch tất cả sau khi tôi hoàn thành, vì vậy chúng không hiển thị trong Trình quản lý tên trừ khi bạn bỏ qua tất cả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.