سؤال

ما هي أفضل طريقة لكشف وظائف معينة في وظيفة 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

مدونة:http://excel4net.blogspot.com

فقط للإشارة إلى القراء في المستقبل:قد ترغب أيضًا في إلقاء نظرة على هذا السؤال:

الوصول إلى أنواع الوظائف الإضافية لتطبيق VSTO من VBA (Excel)

وعلى وجه الخصوص، إلى المدونة المشار إليها هناك:

وظائف VSTO الإضافية وCOMAddIns وRequestComAddInAutomationService

بالتجاوز ريسكيتومادينأوتوماتيونسيرفيسي () يمكنك الكشف عن أي وظيفة تريدها، عن طريق تحديد فئة الواجهة التي توفر نقاط دخول لجميع تلك الميزات، وتعريض تلك الفئة لـ VBA.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top