09-10-12, 05:55 PM
كاتب الموضوع : 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
كود :
<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
كود :
<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
وبهذا تكون فئتنا قد انتهت ولكنها مازالت غير متوفرة لبقية حلول الأوفيس. الآن افتح محرر الكود للفئة 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
كود :
Sub CallVSTOMethod()
Dim addIn As COMAddIn
Dim automationbject As Object
addIn = Application.COMAddIns("ExcelImportData")
automationObject = addIn.Object
automationObject.ImportData()
End Sub
الآن عد إلى ملف الـ Excel ثم شغل الماكرو CallVSTOMethod الذي قمنا بإنشائه للتو وربما ستظهر لك رسالة تفيد بأنه لا توجد Schema مرتبطة ببيانات الـ XML وأن الـ Excel سيقوم بإنشائها لك فقط قم بالموافقة على الرسالة هنا فتلاحظ إنشاء ورقة جديدة باسم Imported Data وقد تم إضافة بيانات في الخلية A1 والخلية B1