2010-01-04 34 views
12

Tôi là một newbie với add-in lập trình và cần được giúp đỡ với các tình huống sau:Automation add-in vs COM add-in

Tôi có một C# Excel tự động add-in mà các cuộc gọi một vài UDF s. Tôi muốn thực hiện kiểm tra tên người dùng và mật khẩu trong khi tải bổ trợ tự động hóa mà màn hình mà người dùng có thể nhập chi tiết của mình phải bật lên khi tải bổ trợ. Làm thế nào nó có thể được thực hiện bằng cách sử dụng một add-in tự động hóa?

Cách xử lý sự kiện có thể được thực hiện nói chung bằng cách sử dụng các phần bổ trợ tự động? Tôi muốn một số tính toán được thực hiện khi người dùng nhấn F9 để tính công thức UDF trong một số ô.

Có bài viết nào giải thích sự kiện xử lý trong trình bổ sung tự động hóa không?

Trả lời

25

Trình bổ sung tự động, nói chung, không được thiết kế để xử lý loại chức năng này. Bạn có thể có bổ trợ của bạn thực hiện IDTExtensibility2 để có được một tham chiếu đến đối tượng 'Excel.Application' mà add-in của bạn đang chạy. Từ đó, bạn có thể truy cập tất cả các sự kiện của lớp 'Excel.Application'. Nhưng một add-in tự động hóa thường không được thiết kế để xử lý các sự kiện mô hình đối tượng Excel - nó được thiết kế để chỉ hỗ trợ các hàm do người dùng định nghĩa (UDF).

tôi muốn làm một tên người dùng và mật khẩu kiểm tra trong khi các addin tự động hóa tải mà một màn hình mà người dùng có thể nhập các chi tiết của ông phải bật lên trên tải của thêm vào. Làm thế nào có thể nó được thực hiện bằng cách sử dụng addin tự động hóa?

Hãy cẩn thận khi cố gắng thực hiện hành động khi lần tải tự động nạp bổ sung đầu tiên của bạn. Bổ trợ tự động hóa được tải theo nhu cầu, có nghĩa là nó không được tải cho đến khi Excel cần. Nó thường sẽ tải khi người dùng bắt đầu nhập hàm đầu tiên do người dùng định nghĩa (UDF) của trình bổ sung tự động hóa của bạn vào một ô. Vấn đề là phần lớn các lệnh chương trình sẽ thất bại khi cố gắng thực thi trong khi người dùng vẫn đang chỉnh sửa ô. Vì vậy, nếu bạn cố gắng thực hiện các hành động như vậy khi tải bổ trợ đầu tiên của bạn, có một cơ hội khá tốt mà nó đang tải trong khi Excel đang ở trong một chế độ không cho phép mã của bạn thực thi an toàn. (Để biết thêm về điều này, hãy xem: Excel fails when Automation add-In loads.)

Để khắc phục sự cố này, bạn có thể sử dụng trình bổ sung COM được quản lý thay thế, được thiết kế để xử lý các sự kiện mô hình đối tượng Excel. Bổ trợ COM được quản lý của bạn thậm chí có thể tải bổ trợ tự động hóa của bạn, nếu bạn muốn; hoặc lớp bổ trợ COM được quản lý và lớp bổ trợ tự động hóa có thể vừa nằm trong cùng một assembly, trong trường hợp này chúng có thể giao tiếp trực tiếp.

Cách xử lý sự kiện có thể được thực hiện trong bổ sung chung bằng tự động hóa? Tôi muốn một số tính toán được thực hiện khi người dùng nhấn F9 để tính công thức 2 udf trong một số ô.

Phát hiện khi nhấn phím F9 có thể được thực hiện bằng cách đăng ký sự kiện 'Excel.Application.SheetCalculate', sẽ kích hoạt bất kỳ lúc nào bất kỳ trang tính nào đã hoàn thành tính toán. Tính toán, trong trường hợp này, có thể được kích hoạt vì bất kỳ lý do nào - không chỉ để nhấn phím F9. Nếu bạn muốn bẫy khóa F9 cụ thể, thì bạn sẽ cần phải sử dụng gọi lại 'Application.OnKey', chỉ có sẵn thông qua VBA. Bạn có thể, tuy nhiên, phơi bày một lớp trong dự án của bạn để COM và có nó được gọi là từ một bổ trợ VBA được gọi trở lại từ sự kiện 'Application.OnKey'.

Đối với bài viết về tự động hóa add-ins, xem:

Đối với các bài viết về quản lý COM add-ins, xem:

Đối với bài viết liên quan đến cả hai COM add-in và tự động hóa các add-ins, xem:

Đối với bài viết thảo luận về việc sử dụng một VBA add-in mà các cuộc gọi ứng dụng quản lý của bạn, xem:

tôi biết rằng đây là rất nhiều để tiêu hóa, nhưng hy vọng điều này có thể giúp bạn đi. Nói chung, tôi muốn giới thiệu một add-in COM được quản lý để xử lý chức năng giao diện người dùng của bạn. Dữ liệu được lưu bởi add-in COM được quản lý có thể được chia sẻ với phần bổ trợ tự động một cách dễ dàng, hoặc bằng cách có cả hai tham chiếu bổ trợ một assembly chung hoặc bằng cả lớp bổ trợ COM được quản lý và tự động thêm trong lớp học được tổ chức trong cùng một hội đồng.

Tôi hy vọng điều này sẽ hữu ích và hãy hỏi xem bạn có muốn tôi làm rõ thêm điều gì không.

- Mike

Follow-Up Trả lời:

Cảm ơn rất nhiều cho các liên kết và con trỏ. Tôi đã đi qua các liên kết và có một ý tưởng công bằng về những gì cần phải được thực hiện. :)

Rất vui được. :) Đó là rất nhiều đọc, tôi đề nghị bạn in chúng lên và đọc tất cả. Bạn đang tìm kiếm để làm một cái gì đó khá tiên tiến, vì vậy bạn càng biết nhiều về chủ đề, thì bạn càng tốt hơn.

Nếu tôi đang sử dụng addin COM để xử lý các sự kiện excel của mình, làm cách nào để kết hợp các chức năng UDF của tôi?

Bổ trợ COM được quản lý không thể hiển thị các hàm UDF.Bạn vẫn sẽ cần một trình bổ sung tự động hóa cho điều đó. Tuy nhiên, lớp bổ trợ COM được quản lý của bạn và lớp bổ trợ tự động hóa của bạn có thể nằm trong cùng một assembly, nếu bạn muốn. Do đó, trình bổ sung COM của bạn có thể yêu cầu người dùng cung cấp thông tin mà bạn cần, và các giá trị này sẽ có sẵn cho trình bổ sung tự động hóa khi các UDF trong đó được chạy.

Chúng sẽ được hiển thị dưới dạng chức năng bình thường trong ngăn công thức tương tự như trường hợp sử dụng trình bổ sung tự động hóa?

Các UDF được trình tự động thêm vào sẽ được bao gồm trong thuật sĩ 'Chèn hàm' tự động, trong danh mục phù hợp với tên bổ trợ tự động hóa của bạn. Tuy nhiên, mô tả sẽ không tự động bao gồm nhiều thông tin được cung cấp cho các hàm dựng sẵn của Excel. Chức năng mặc định thường là tốt, nhưng nếu bạn muốn cung cấp thông tin đầy đủ hơn cho thuật sĩ 'Chèn Hàm', đây là một chủ đề phức tạp cho chính nó. Xem: Excel 2007 UDF: how to add function description, argument help.

Giả sử tôi cần gọi hàm getcube trả về khối lập phương của số getcube kép công khai (double a) {return a * a * a; }

Khi trình bổ sung của tôi sử dụng cả giao diện tùy chỉnh xác định UDF và IDTExtensibility2 của tôi, cách xử lý trường hợp này? Bạn có thể giải thích trường hợp này bằng một ví dụ không?

Cho đến nay, tôi không thấy cần phải triển khai IDTExtensibility2 dựa trên những gì bạn hiển thị ở đây, bạn chỉ cần bổ trợ tự động hóa chuẩn. Đối với tiện ích tự động hóa chuẩn, bạn nên đọc Writing user defined functions for Excel in .NETWriting Custom Excel Worksheet Functions in C#. Để thảo luận về cách triển khai IDTExtensibility2 cho một bổ trợ COM được quản lý, hãy xem Implementing IDTExtensibility2 in an Automation Add-in.

Có cách nào để chỉ triển khai IDTExtensibility2 trên trình bổ sung tự động hóa để truy cập đối tượng Excel.Application hay tôi nên tạo một addin COM riêng biệt cho nó?

Bạn hoàn toàn có thể thực hiện IDTExtensibility2 trực tiếp trong tự động hóa của bạn add-in, không có nhu cầu để tạo ra một quản lý COM add-in cho việc này. Một lần nữa, xem, Implementing IDTExtensibility2 in an Automation Add-in. Những gì bạn muốn đạt được, tuy nhiên, là sử dụng xử lý sự kiện đối với mô hình đối tượng Excel. Trong khi điều này có thể được thực hiện bằng cách sử dụng một add-in tự động hóa, nó không chuẩn và không phải là loại nhiệm vụ mà một add-in tự động hóa được thiết kế để làm. Đặc biệt, bạn muốn có thông tin đầu vào của người dùng khi tải tự động đầu tiên thêm vào; điều này có thể là một tình huống đặc biệt khó khăn, đó là lý do tại sao tôi khuyên bạn nên sử dụng một add-in COM được quản lý cho nhiệm vụ này. Để biết thêm về điều này, hãy xem Excel fails when Automation add-In loads.

Để làm rõ, các bổ trợ COM được quản lý và bổ trợ tự động hóa chỉ là các lớp đã được hiển thị COM và được đăng ký chính xác. Không có lý do gì khiến hai lớp này không thể tồn tại trong cùng một assembly. Và, vì có vẻ như bạn muốn chức năng của mình bao gồm cả UDF và xử lý sự kiện mô hình đối tượng Excel, một assembly đơn bao gồm cả bổ trợ COM được quản lý và phần bổ trợ tự động sẽ cho phép bạn xử lý tất cả các chức năng mà bạn tìm kiếm cách Excel mong đợi.

Tôi biết rằng điều này là rất nhiều để tiêu hóa, nhưng nếu bạn đọc kỹ các bài viết mà tôi gợi ý ở đây, tôi nghĩ rằng nó sẽ có ý nghĩa ...

Mike

+0

Thanks a lot. Mọi thứ dần dần bắt đầu rõ ràng. Tôi vẫn bị kẹt ở phần có cả addin tự động hóa của tôi và addin com trong cùng một assembly. Có lẽ bạn có thể giải thích nó với một ví dụ để tôi hiểu nó tốt hơn? – Sandy

+0

Chúng không nhất thiết phải như vậy. Mỗi lớp là một lớp riêng biệt. Nếu bạn muốn, bạn có thể đặt mỗi add-in lớp trong một hội đồng riêng biệt và sau đó có cả hai hội đồng tham chiếu một hội đồng thứ ba. Trong trường hợp của bạn, mặc dù, tôi nghĩ rằng nó là dễ nhất để chỉ cần đặt cả hai tự động hóa add-in lớp và quản lý COM add-in lớp trong cùng một hội đồng. Làm theo các ghi chú về cách tạo một trình bổ sung COM được quản lý, sử dụng thuật sĩ. Sau đó, làm theo các bài viết về cách tạo một lớp bổ trợ tự động hóa, nhưng đưa lớp bổ trợ tự động hóa của bạn vào trong cùng một assembly như phần bổ trợ COM được quản lý của bạn. Nó thật sự đơn giản. –

+0

@MikeRosenblum Tôi hiện đang làm việc trên dự án bổ trợ tự động hóa Excel và gặp một số vấn đề. UDF của tôi yêu cầu tìm nạp dữ liệu qua dịch vụ web để có những lo ngại về các vấn đề về hiệu suất. Nếu tôi làm theo cách đồng bộ, ứng dụng khách Excel sẽ đóng băng. Vì vậy, câu hỏi của tôi ở đây là - làm thế nào chúng ta có thể viết một UDF có thể gọi các phương thức web ** Không đồng bộ **? Bạn có thể cho tôi một số gợi ý không, Mike? Cảm ơn rất nhiều. – woodykiddy

Các vấn đề liên quan