أنت هنا
ما الذي يقوم به هذا التطبيق:
عند كتابة ماكرو لبرامج بلغة فيجوال بيسيك للتطبيقات فإن هذا التطبيق يقوم بما يلي:
- تنسيق الماكرو بشكل صحيح
- إضافة أرقام الأسطر
- إضافة معالج للأخطاء
- تتضمن هذه المكتبة أيضاً إضافات تمكن من استخدام بعض فئات أطار عمل دوت نيت في برمجة تطبيقات أوفيس
- هذه المكتبة متوافقة مع 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، نص ويب htmlSub 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 وهو ما تستخدمه هذه المكتبة
لمزيد من المعلومات عن لغة التعبيرات الشائعة واستخدامها مع لغات الفيجوال استيديو يمكن استخدام البرامج التالية:
- Expresso form http://www.ultrapico.com
- csharpregexdemo
- RegEx Builder form www.SoftPedia.com
معلومات عن إضافات أوفيس الذاتية:
هي أضافات للأوفيس كتبة بلغة فيجوال بيسيك للتطبيقات من خلال برامج أوفيس نفسها مثل الورد (*.dotm) والأكسس (*.mda) وفيما يلي بعض التطبيقات المهمة لذا الخصوص: