الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كتابة شيفرة لإنشاء Add-in يتم استدعاؤه من Vba

مغلق
بدأه محمد سامر أبو سلو في 21 ديسمبر 2007 · 0 رد · 472 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1

أنشئ مشروعا جديدا بلغة 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

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

هذا الموضوع مغلق.

مواضيع مشابهة