🏠 » انترنت وبرامجيات » مقالات عن الكمبيوتر والأنترنت » تنسيق كود ماكرو برامج أوفيس وإضافات مفيدة

تنسيق كود ماكرو برامج أوفيس وإضافات مفيدة

    يتضمن مايكروسوفت أفيس عدد من التطبيقات الأساسية المهم في كل مجال ومن هذه التطبيقات ورد – أكسل – أكسس
    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) وفيما يلي بعض التطبيقات المهمة لذا الخصوص:

    اترك تعليقاً

    لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

    End