كشف وظيفة VSTO لـ VBA بدون المسؤول المحلي
سؤال
ما هي أفضل طريقة لكشف وظائف معينة في وظيفة Dotnet VSTO Excel الإضافية لـ VBA، دون مطالبة المستخدم بأن يكون مسؤولاً محليًا (أي مسؤول محلي؟)لا يوجد تسجيل كوم، لا يوجد المتشعب)؟هل من الممكن استخدام قوائم انتظار الرسائل لـ Microsoft من VBA؟
المحلول
إذا كان بإمكاني تفسير سؤالك على نطاق واسع مثل "كيف يمكنني كشف الوظائف في تجميع .Net إلى Excel دون تسجيل COM"، فإن الحل الأمثل هو استخدام واجهة XLL الخاصة بـ Excel.يقوم المرء بشكل أساسي بنشر شريحة xll وملف .Net dll المرتبط.عندما يتم تحميل ملف xll فإنه ينعكس على ملف dll ويكشف عن الوظائف الموجودة فيه لبرنامج Excel.
يمكن العثور على تطبيق مفتوح المصدر هنا http://exceldna.typepad.com/blog/2006/01/introducing_exc.html
مصدر تجاري مغلق، ولكنه أكثر ثراءً بالميزات هناhttp://www.managedxll.com/
نصائح أخرى
لا يمكنك ببساطة إنشاء مثيل لها ككائنات COM، حيث لن يتم تشغيل VSTO في مجال التطبيق الافتراضي.
إليكم كيف فعلت ذلك، وهو أمر معقد بعض الشيء.كان هذا مع مصنف VSTO المحفوظ كملف XLA، والذي يعد في بعض النواحي أكثر مرونة من وظيفة VSTO الإضافية الخالصة.
تحتاج إلى إنشاء مكتبة نوع باستخدام regasm.exe والتي سيتم الرجوع إليها بواسطة كود VBA الخاص بك.
قم بإنشاء فئة مصنع جذر في نموذج كائن .NET الخاص بك، وهو قادر على إنشاء مثيل لأي من الفئات التي تريد استهلاكها في VBA (شيء مثل فئة "التطبيق" في نماذج كائنات Office).
تحتاج بعد ذلك إلى إيجاد طريقة لتمرير مرجع إلى مثيل فئة المصنع هذه إلى VBA.بمجرد حصول VBA على مرجع إلى مثيل فئة المصنع هذه، يمكنه استدعاء أساليبه لإنشاء مثيل لأي كائنات أخرى في نموذج كائن .NET الخاص بك.
لتمرير مثيل إلى VBA، قم بتعريف ماكرو في كود VBA الخاص بك كما يلي
رمز المثال:
Private m_objMyFactory As Object
Public Sub RegisterFactory(MyFactory As Object)
On Error GoTo ErrHandler
Set m_objMyFactory = MyFactory
Exit Sub
ErrHandler:
MsgBox "An unexpected error occurred when registering the Factory component: " & Err.Description
Exit Sub
End Sub
- أضف الآن تعليمات برمجية إلى معالج الأحداث VSTO ThisWorkbook_Open، الذي يقوم بإنشاء كائن المصنع الخاص بك ويستدعي الماكرو أعلاه لتمرير مرجع إلى كائن المصنع.
رمز المثال:
void ThisWorkbook_Open()
{
try
{
ThisApplication.Run("RegisterFactory",
new MyNamespace.MyFactory(),
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing);
}
catch (Exception ex)
{
MessageBox.Show("Load error: " + ex.ToString());
}
}
هناك بعض المشكلات الأخرى التي يجب أخذها في الاعتبار حتى يعمل هذا الأمر بقوة - إذا كنت مهتمًا بمتابعة هذا الأمر، فأخبرني بذلك وسأقوم بنشر المزيد من التفاصيل.
قد تكون مهتمًا ببرنامج Excel4Net (وهو مشابه لـ ExcelDNA وManagedXll، ولكنه أسهل في الاستخدام):
موقع إلكتروني:http://www.excel4net.com
فقط للإشارة إلى القراء في المستقبل:قد ترغب أيضًا في إلقاء نظرة على هذا السؤال:
الوصول إلى أنواع الوظائف الإضافية لتطبيق VSTO من VBA (Excel)
وعلى وجه الخصوص، إلى المدونة المشار إليها هناك:
وظائف VSTO الإضافية وCOMAddIns وRequestComAddInAutomationService
بالتجاوز ريسكيتومادينأوتوماتيونسيرفيسي () يمكنك الكشف عن أي وظيفة تريدها، عن طريق تحديد فئة الواجهة التي توفر نقاط دخول لجميع تلك الميزات، وتعريض تلك الفئة لـ VBA.