تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
كتابة شيفرة لإنشاء Add-in يتم استدعاؤه من VBA - VB2008
#1
كاتب الموضوع : samerselo

أنشئ مشروعا جديدا بلغة Visual Basic من نوع Office ثم 2007 ثم اختر Excel 2007 Add-in وقم بتسمية المشروع ExcelImportData حيث تكمن فكرة مشروعنا هنا في إنشاء فئة وكشفها لحلول أوفيس بحيث يمكننا استدعاء طرائق تلك الفئة من كود VBA حيث سيتم إنشاء فئة باسم AddInUtilities تمتلك طريقة تدعى ImportData
أضف فئة جديدة للمشروع باسم AddInUtilities وأضف الاستيرادات التالية لبداية الملف

كود :
Imports System.Data
Imports System.Runtime.InteropServices
Imports Excel = Microsoft.Office.Interop.Excel
استبدل جسم الفئة AddInUtilities بالكود التالي

كود :
<System.Runtime.InteropServices.ComVisibleAttribute(True)> _
<System.Runtime.InteropServices.InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
Public Interface IAddInUtilities
Sub ImportData()
End Interface

<System.Runtime.InteropServices.ComVisibleAttribute(True)> _
<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)> _
Public Class AddInUtilities
Implements IAddInUtilities

Public Sub ImportData() Implements IAddInUtilities.ImportData

' Create a new DataTable.
Dim ds As New DataSet()
Dim dt As DataTable = ds.Tables.Add("Customers")
dt.Columns.Add(New DataColumn("LastName"))
dt.Columns.Add(New DataColumn("FirstName"))

' Add a new row to the DataTable.
Dim dr As DataRow = dt.NewRow()
dr("LastName") = "Chan"
dr("FirstName") = "Gareth"
dt.Rows.Add(dr)

' Add a new XML map to the collection.
Dim activeWorkbook As Excel.Workbook = Globals.ThisAddIn.Application.ActiveWorkbook
Dim xmlMap1 As Excel.XmlMap = activeWorkbook.XmlMaps.Add(ds.GetXmlSchema(), _
"NewDataSet")

' Import the data.
If Not (xmlMap1 Is Nothing) Then
Dim lastSheet As Object = activeWorkbook.Sheets(activeWorkbook.Sheets.Count)
Dim newSheet As Excel.Worksheet = CType(activeWorkbook.Sheets.Add( _
After:=lastSheet), Excel.Worksheet)
newSheet.Name = "Imported Data"
activeWorkbook.XmlImportXml(ds.GetXml(), xmlMap1, True, _
newSheet.Range("A1"))
End If
End Sub
End Class
حيث تقوم بتعريف واجهة في بداية الكود تدعي IAddInUtilities تمتلك الخاصية ComVisible مضبوطة إلى True والخاصية InterfaceType تمتلك القيمة IntetrfaceIsDispatch ويكمن السبب في كتابة هذه الواجهة هو أن الفئة الأساسية سوف تحقق وتعرض الواجهة IDispatch مما يجعلها متوفرة للاستدعاء من قبل حلول أوفيس الأخرى

كود :
<System.Runtime.InteropServices.ComVisibleAttribute(True)> _
<System.Runtime.InteropServices.InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
Public Interface IAddInUtilities
Sub ImportData()
End Interface
وتعرف الفئة AddInUtilities لتحقق الواجهة IAddInUtilities وتطبق الخاصية ComVisisble على هذه الفئة

كود :
<System.Runtime.InteropServices.ComVisibleAttribute(True)> _
<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)> _
Public Class AddInUtilities
Implements IAddInUtilities
ثم تعرف الطريقة ImportData والتي تحقق الطريقة ImportData المحددة في الواجهة IAddInUtilities في بداية الكود فتنشئ أولا Dataset مع DataTable ثم يضاف سطر جديد لجدول البيانات ثم يضاف Xml Map مبنية على Dataset to the Collection of XML maps ثم تضاف صفحة جديدة للملف ثم تستخدم Xml Map لاستيراد البيانات من الـ Dataset إلى صفحة الـ Excel.
وبهذا تكون فئتنا قد انتهت ولكنها مازالت غير متوفرة لبقية حلول الأوفيس. الآن افتح محرر الكود للفئة ThisAddIn وقم بتجاوز Override الطريقة RequestComAddInAutomationService معيدا منها مرجعا للفئة AddInUtilities كما في الكود

كود :
Private utilities As AddInUtilities
Protected Overrides Function RequestComAddInAutomationService() As Object
If utilities Is Nothing Then
utilities = New AddInUtilities()
End If
Return utilities
End Function
وللاختبار قم بتشغيل المشروع ثم قم بحفظه كـ Excel Macro-Enabled Workbook (*.xlsm) ثم انتقل إلى صفحة developers ثم انقر Visual Basic ليفتح لك محرر الكود وافتح ThisWorkBook وأضف الكود التالي

كود :
Sub CallVSTOMethod()
Dim addIn As COMAddIn
Dim automationbject As Object
addIn = Application.COMAddIns("ExcelImportData")
automationObject = addIn.Object
automationObject.ImportData()
End Sub
الذي يعرف متغيرا يشير للغرض ComAddIn الذي يمثل الـ ExcelImportData Add-in ثم يستخدم لاستدعاء الطريقة ImportData من فئتنا السابقة.
الآن عد إلى ملف الـ Excel ثم شغل الماكرو CallVSTOMethod الذي قمنا بإنشائه للتو وربما ستظهر لك رسالة تفيد بأنه لا توجد Schema مرتبطة ببيانات الـ XML وأن الـ Excel سيقوم بإنشائها لك فقط قم بالموافقة على الرسالة هنا فتلاحظ إنشاء ورقة جديدة باسم Imported Data وقد تم إضافة بيانات في الخلية A1 والخلية B1
}}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  ثقافة برمجية(2):طريقة كتابة Property أبو يعقوب 3 821 12-07-13, 04:16 PM
آخر رد: مبرمج بلا حدود
  كتابة ملف xml فى vb.net 2008 هل هناك اسهل من هذا !!! RaggiTech 0 414 09-10-12, 05:53 PM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم