يتضمن مايكروسوفت أفيس عدد من التطبيقات الأساسية المهم في كل مجال ومن هذه التطبيقات ورد – أكسل – أكسس
Microsoft Office Word, Excell, Access.
تمكنك تلك التطبيقات من كتابة ماكروات وتحرير تلك الماكروات لتنفيذ أعمال متقدمة كما تمكنك من استخدم لغة فيجول بيسيك للتطبيقات لتجعل تلك التطبيقات أكثر مرونة وهذا لا يقتصر على تطبيقات أوفيس بل العديد من البرامج تدعم لغة فيجوال بيسيلك للتطبيقات
تستهدف هذه المكتبة المهتمين بهذا المجال


ما الذي يقوم به هذا التطبيق :
عند كتابة ماكرو لبرامج بلغة فيجوال بيسيك للتطبيقات فإن هذا التطبيق يقوم بما يلي :

 

  • تنسيق الماكرو بشكل صحيح .
  • إضافة أرقام الأسطر .
  • إضافة معالج للأخطاء .
  • تتضمن هذه المكتبة أيضاً إضافات تمكن من استخدام بعض فئات أطار عمل دوت نيت في برمجة تطبيقات أوفيس .
  • هذه المكتبة متوافقة مع VBA6 وVBA7 للنسخة 32 أو 64 بت على حد سواء من برامج أوفيس .

ما المشاكل التي تم حلها:

  • لا توفر لغات البرمجة  المتضمنة في الفيجوال ستوديو طريقة مباشرة لصنع الوظائف الإضافية للفيجوال بيسيك للتطبيقات VBA، ويفيد هذا التطبيق في شرح طريقة التغلب على هذه النقطة
  • دعم VBA7 للنسخة 64 بت من تطبيقات مايكروسوفت أوفيس

تمهيد
على الرغم من فيجوال بيسيك 6 قد خرجت من الخدمة إلا أن الحاجة لتطوير وحدات الماكرو بلغة فيجوال بيسيك للتطبيقات لا تزال مهمة.

متطلبات البرنامج:

  • مايكروسوفت أوفيس 2010 (32 بت أو 64 بت)
  • عند تركيب أوفيس الرجاء اختيار تركيب دعم برمجة دوت نت. إذا كان أوفيس مركب مسبقاً الرجاء تشغيل برنامج الإعداد مجدداً ولاضافة قابلية برمجة دوت نت إلى جميع تطبيقات أوفي المثبتة.
  • مايكروسوفت دوت NET Framework الإصدار 2
  • أدوات تطوير أوفيس VSTO

كيفية استخدام هذا التطبيق لتنسيق الماكرو:

  • تحميل التطبيق وفك ضغطه إلى مجلد في القرص الصلب.
  • تشغيل ملف التسجيل كمسؤول.
  • فتح مستند أوفيس الذي يحتوي على الماكرو أو قاعدة بيانات أكسس التي تحتوي على وحدة برمجية
  • تحرير الماكرو  أو الوحدة البرمجية من خلال محرر فيجوال بيسيك للتطبيقات
  • من نافذة فيجوال بيسيك للتطبيقات نختار قائمة الوظائف الإضافية ثم اختر إضافة معالج الأخطاء إلى هذا الملف
  • سوف يؤدي ذلك إلى تغيير تنسيق التعليمات البرمجية كما يلي …

نص الماكرو قبل التنسيق:

Public Sub Macro1()
    MsgBox("This is Macro1")
End Sub

نص الماكرو بعد التنسيق:

Public Sub Macro1()
    On Error GoTo EH
11  MsgBox("This is Macro1")
    Exit Sub
EH:
    Debug.Print "Error in: Module1.Macro1." & Erl & vbNewLine & Err.Description
    'هذا الأمر سوف يعرض اسم الوحدة البرمجية واسم الإجراء ورقم السطر حيث حدث الخطأ في نافذة 
    'Immediate Window 
    'إن رقم السطر مفيد جداً في تسهيل اكتشاف موقع الخطأ
    Debug.Assert False
    'هذا الأمر سوف يوقف تنفيذ الإجراء إذا كان الإجراء ينفذ في وضع إكتشاف الأخطاء
    'ولا يؤثر على عمل الإجراء إذا كان الإجراء ينفذ في وضع التشغيل
    MsgBox "Error in: Module1.Macro1." & Erl & vbNewLine & Err.Description
    'هذا الأمر سوف يظهر رسالة عن الخطأ تظهر في وضعي التشغيل ووضع اكتشاف الأخطاء
    'This will show a message box about the error in run time
End Sub

كيفية يمكن هذا التطبيق من استخدام بعض مكتبات الدوت نيت في برمجة الماكرو:

  • تحميل التطبيق وفك ضغطه إلى مجلد في القرص الصلب.
  • تشغيل ملف التسجيل كمسؤول.
  • فتح مستند أوفيس الذي يحتوي على الماكرو أو قاعدة بيانات أكسس التي تحتوي على وحدة برمجية
  • تحرير الماكرو  أو الوحدة البرمجية من خلال محرر فيجوال بيسيك للتطبيقات
  • في نافذة فيجوال بيسيك للتطبيقات اختر القائمة Tools ثم References ثم Brows ثم اختر الملف VBAExtend.dll.tlb من الدليل الذي توجد به هذه المكتبة
  • تحتوي هذه المكتبة تحتوي على فئة تدعى NP  يمكن استخدامها للوصول إلى معظم  الفئات الأخرى.  وللوصل إليها أضف السطر التالي  إلى بداية الوحدة البرمجية:
    Public NP As New VBAExtend.NP
  • بعد ذلك يمكنك استخدام الكائن NP في إي ماكرو ضمن المشروع الخاص بك لأداء وظائف متعددة

استعمال الفئة NP الموجودة في هذه المكتبة:

  • تتضمن هذه المكتبة الفئة NP وهي مصممة لتستخدم في فيجوال بيسيك للتطبيقات حيث تمكن من الوصول إلى معظم الفئات الأخرى في هذه المكتبة وذلك بعد التصريح عنها كما هو مذكور سابقاً
  • NP.Clipboard: تستخدم للوصول إلى الحافظة الخاصة بالكمبيوتر كوضع نص في الحافظة بتنسيق محدد أو استعادته منها كما تستخدم لتحويل تنسيق النص في الحافظة من وإلى تنسيق يونيكود.
    يمكن وضع نص أو استعادته من الحافظة بأحد التسيقات التالية: نص عادي، نص يونيكود، نص منسق RTF، نص ويب html

    Sub Test()
    	NP.Clipboard.Clear
    	NP.Clipboard.SetText "Some Text"
    	NP.Clipboard.Ascii2Unicode
    	NP.Clipboard.Unicode2Ascii
    	Debug.Print NP.Clipboard.GetText
    End Sub
    
  • NP.Directory: تستخدم للتعامل مع المجلدات (إختبار وجوده، نقل، حذف،  إنشاء)
    Sub Test()
    	If Not NP.Directory.Exists("C:\Temp") Then NP.Directory.CreateDirectory "C:\Temp"
    	NP.Directory.Move "C:\Temp", "C:\Temp2"
    	NP.Directory.Delete "C:\Temp2"
    End Sub
  • NP.File: تستخدم للتعامل مع الملفات (إختبار وجوده، نسخ، حذف،  إنشاء)
    Sub Test()
    Copy, Create, Delete, Exists, Move, Shell
    	If Not NP.File.Exists("C:\Temp.txt") Then NP.File.Create "C:\Temp.txt"
    	NP.File.Move "C:\Temp.txt", "C:\Temp2.txt"
    	NP.File.Copy "C:\Temp2.txt", "C:\Temp.txt"
    	NP.File.Delete "C:\Temp2.txt"
    	NP.Shell "C:\Temp.txt"
    End Sub
  • NP.Screen: تستخدم للتعامل مع الشاشة (معرفة قياس الشاشة و معاملات التحويل إلى تويب) وتحتوي على الإجراءات التالية:
    CM, Height, Width, TwipsPerPixelX, TwipsPerPixelY
  •  NP.Text:  تحتوي على الإجراءات التالية:
    EncodingConvert, EncodingConvertByCodePage, GetTextHeight, Md5Hash, TrimAny
  • NP.SQL: تحتوي على عدد من الإجراءات المتعلقة بصياغة SQL

استعمال الفئة VBADatabase الموجودة في هذه المكتبة:

  • تستخدم هذه الفئة في قواعد بيانات  أكسس بشكل أساسي
  • قبل استعمال هذه الفئة لا بد من التصريح عن كائن مشتق منها قبل استخدامها كما هو الحال مع الفئة NP
  • بعد ذلك لا بد من تعين قاعدة البيانات على النحو التالي:
    Public db As New VBAExtend.VBADatabase
    Sub Test()
        db.SetDB CurrentDB
       '...... your code
    End Sub
  • بعد تعين قاعدة البيانات الحالية يمكن استخدام الكائن db للوصول إلى الإجراءات المختلفة للفئة VBADatabase
  • db.IsField: التحقق من أن الحقل المشار إلية موجود في الجدول أو الاستعلام
  • db.IsTableOrQuery: التحقق من جود جدول أو استعلام بالاسم المعطى في قاعدة البيانات المتربطة بالكائن.
  • db.RefreshLink يحدث ارتباطات الجداول المرتبطة لتشير إلى الموقع الجديد لها
  • db.RefreshLinkChooseDB: يطلب من المستخدم تحديد مسار قاعدة البيانات التي تحتوي الجداول الأصلية ثم يحدث ارتباطات الجداول المرتبطة لتشير إليها
  • الإجراءات SettingDelete، SettingGet، SettingSave : تستخدم للتعامل مع الإعدادات المخزنة في جدول ضمن قاعدة البيانات.

كيفية إيقاف تشغيل وضع إكتشاف الأخطاء عند تنفيذ ماكرو:

  • افتح مستند أوفيس الذي يحتوي على الماكرو ثم قم بتحرير الماكرو
  •  في نافذة فيجوال بيسيك للتطبيقات أختر القائمة  Tolls ثم اختر your project properties ثم اختر Protection تحقق من اختيار
    Lock project for viewing اكتب كلمة مرور ثم  موافق
  • إغلاق المستند وإعادة فتحه حتى يتم تفعيل التغيرات

معلومات لمطوري البرامج بلغة فيجوال استيدو:

كيفة كتابة مكتبة  للتقبل التعامل مع تطبيقات ذات 32 أو 64 بت:

  • أنشئ مشروع مكتبة جديد في الفيجوال استيديو
  • من خصائص المشروع الرجاء اختيار تحويل إلى ملف تنفيذي Compile ثم اختيار خيارات متقدمة ثم اختيار وحدة المعالجة المركزية إلمستهدفة وحدد الخيار أي معالج
  •  إذا  كان المشروع الخاص بك عبارة عن إضافات فالرجاء عدم تجميعه في وضع اسكشاف الأخطاء Debug بل فقط في وضع Release
  • الرجاء تسجيل المتبة الخاصة  بك عن طريق الإصدار  المناسب من برنامج regasm
  • إذا حوى المشروع  StrongNameKey فالرجاء إزالة جميع الإصدارات السابقة قبل تسجيل الإصدار الجديد
  • البرنامج التالي يحدد الإصدار المناسب من regasm المطلوب لتسجيل برنامج ما:
Sub Main()
        Dim Name = "VBAExtend"
        Dim Ext = ".dll"

        Dim sDir = Windows.Forms.Application.StartupPath & "\"
        Dim FullName = sDir & Name & Ext
        If IO.File.Exists(sDir & FullName & ".TLB") Then
            IO.File.Delete(sDir & FullName & ".TLB")
        End If

        Dim ProgramFiles = System.Environment.GetEnvironmentVariable("ProgramFiles")
        Dim windir = System.Environment.GetEnvironmentVariable("windir")
        Dim GACUtilPath, RegasmPath As String
        If IO.Directory.Exists(ProgramFiles & " (x86)") Then
            GACUtilPath = ProgramFiles & " (x86)\Microsoft SDKs\Windows\v7.0A\bin"
            RegasmPath = windir & "\Microsoft.NET\Framework64"
        Else
            GACUtilPath = ProgramFiles & "\Microsoft SDKs\Windows\v7.0A\bin"
            RegasmPath = windir & "\Microsoft.NET\Framework"
        End If

        If IO.File.Exists(GACUtilPath & "\NETFX 4.0 Tools") Then GACUtilPath &= "\NETFX 4.0 Tools"
        If IO.Directory.Exists(GACUtilPath & "\x64") Then GACUtilPath &= "\x64"
        If IO.Directory.Exists(RegasmPath & "\v4.0.30319") Then
            RegasmPath &= "\v4.0.30319"
        Else
            RegasmPath &= "\v2.0.50727"
        End If

        Console.Clear() 'Cls
        Console.WriteLine("RegasmPath: " & RegasmPath)
        Console.WriteLine("GACUtilPath: " & GACUtilPath)
        Console.WriteLine()
        Console.WriteLine()
        If IO.Directory.Exists(windir & "\assembly\GAC_64\" & Name) Then
            IO.Directory.Delete(windir & "\assembly\GAC_64\" & Name, True)
        End If
        If IO.Directory.Exists(windir & "\assembly\GAC_32\" & Name) Then
            IO.Directory.Delete(windir & "\assembly\GAC_32\" & Name, True)
        End If
        If IO.Directory.Exists(windir & "\assembly\GAC\" & Name) Then
            IO.Directory.Delete(windir & "\assembly\GAC\" & Name, True)
        End If

        RegasmPath &= "\Regasm.exe"
        GACUtilPath &= "\gacutil.exe"

        Dim cmd = RegasmPath & " /nologo /unregister """ & FullName & """"

        Shell(cmd, AppWinStyle.NormalFocus, True)
        cmd = GACUtilPath & " /nologo /u " & Name & Ext
        Shell(cmd, AppWinStyle.NormalFocus, True)
        Console.WriteLine()
        Console.WriteLine()

        cmd = RegasmPath & " /nologo """ & FullName & """ /tlb:""" & FullName & ".tlb"""
        Shell(cmd, AppWinStyle.NormalFocus, True)
        Console.WriteLine()
        Console.WriteLine()

        cmd = RegasmPath & " /nologo """ & FullName & """ /codebase"
        Shell(cmd, AppWinStyle.NormalFocus, True)
        REM gacutil  /nologo /f /i %FullName%
        Console.WriteLine()
        Console.WriteLine()

        Console.Write("Press any key to continue")
        Console.ReadKey()

كيف تعمل هذه المكتبة مع أوفيس 64 بت و الإصدار السابع من فيجوال بيسيك للتطبيقات VBA7:

  • لا يدعم الإصدار السابع من فيجوال بيسيك للتطبيقات الوظائف الإضافية المباشرة لذلك وفي هذه الحالة فإن Shared Office Add ins تعمل كإضافة مشتركة لمختلف تطبيقات أوفيس
  • يتم الوصول إلى محرر فيجوال بيسيك للتطبيقات  VBE من خلال التطبيق المضيف
  • من خلال الإجراء OnConnection ثم استدعاء إضافة الفيجوال بيسيك للتطبيقات
  • كي نتمكن من الوصول إلى VBE تم تعيين قيمة AccessVBOM السجل إلى 1  في المفتاح التالي:
    local machine\Software\Microsoft\Office\14.0\Office application name\Security
Public Sub OnConnection(ByVal application As Object, ByVal connectMode As ext_ConnectMode, _
                        ByVal addInInst As Object, ByRef custom As Array) Implements IDTExtensibility2.OnConnection
    Try
        applicationObject = application
        addInInstance = addInInst
        '......
        Dim _VBE = applicationObject.VBE

        If _VBE.Version >= "7" Then
            If _VBAAddin Is Nothing Then _VBAAddin = New VBAAddin
            _VBAAddin.OnConnection(_VBE)
        End If

    Catch ex As Exception
    End Try
End Sub

كيفية كتابة إضافات للفيجوال بيسيك للتطبيقات:

  • يمكنك تحميل الكود المصدري من موقع كود بروجيكت في الرابط المرفق أدنى المقال
  • أنشئ مشروع فيجوال بيسيك جديد من النوع Class Library
  • يمكنك جعل مشروعك يستخدم  الإصدار الثاني من إطار عمل دوت نيت
  • إجعل مشروعك ComVisible
  • أضف المراجع التالية إلى مشروعك:
    System
    System.Windows.Forms
    Extensibility = Microsoft Add-In Designer
    Microsoft.Vbe.Interop
    Microsoft.Office.Core
    
  • أنشئ فئة وإعلها تستخدم الواجهة IDTExtensibility2
  • أضف الكود اللازم عن الإجراء OnConnection و OnDisconnection
  • أنشئ ملف تسجيل لتسجيل برنامجك ليصبح إضافة للـ VBA6 و VBE6 ذات الإصدار 32 بت
  • إذا كنت ترغب في إنشاء إضافة للـ VBA7 و VBE7 ذات الإصدار 64 بيت فيرجى إنشاء إضافة للتطبيق المضيف كما هو مشروح أعلاه
  • نموذج لملف التسجيل *.reg
REGEDIT4

[HKEY_CURRENT_USER\Software\Microsoft\VBA\VBE\6.0\Addins\{ClassProgId}]
"CommandLineSafe"=dword:00000000
"Description"="{ClassDescription}"
"FriendlyName"="{ClassDisplayName}"
"LoadBehavior"=dword:00000003

[HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common]
"FontFace"="Courier New"
"FontHeight"="10"

حيث {ClassProgId} و {ClassDescription} و {ClassDisplayName}  هي متغيرات يتم استبدالها حسب مشروعك

{ClassProgId} هو الاسم الكالمل للفئة التي تحتوي على الإضافة على سبيل المثال: VBAExtend.VBAAddin

كيفية يمكن تحليل وحدة البرمجية في VBA  من أجل تحسينها:

على الرغم من أننا يمكننا التنقل بين الإجراءات بواسطة  كائن الفئة CodeModule إلا أن التنطبيق سوف يكون أسرع لو استخلصنا كامل الكود ثم عالجناه بشكل منصل بواسطة لغة التعبيرات الشائعة Regular Expressions وهو ما تستخدمه هذه المكتبة

لمزيد من المعلومات عن لغة التعبيرات الشائعة واستخدامها مع لغات الفيجوال استيديو يمكن استخدام البرامج التالية:

  1. Expresso form http://www.ultrapico.com
  2. csharpregexdemo
  3. RegEx Builder form www.SoftPedia.com

معلومات عن إضافات أوفيس الذاتية:

هي أضافات للأوفيس كتبة بلغة فيجوال بيسيك للتطبيقات من خلال برامج أوفيس نفسها مثل الورد (*.dotm)  والأكسس (*.mda) وفيما يلي بعض التطبيقات المهمة لذا الخصوص: