سؤال

متى يكون من المناسب استخدام فئة في Visual Basic for Applications (VBA)?

أفترض تسارع التنمية والحد من إدخال الخلل هو المنفعة المشتركة لمعظم اللغات التي تدعم OOP.ولكن مع VBA, هل هناك معيار محدد?

هل كانت مفيدة؟

المحلول

ذلك يعتمد على من سيذهب إلى تطوير والحفاظ على القانون.نموذجية السلطة "المستخدم" ماكرو الكتاب القرصنة الصغيرة المخصصة التطبيقات قد يكون الخلط باستخدام الطبقات.ولكن تطور خطير ، أسباب استخدام الطبقات هي نفسها كما في اللغات الأخرى.لديك نفس القيود VB6 - الميراث - ولكن هل يمكن أن يكون تعدد الأشكال باستخدام الواجهات.

الاستخدام الجيد الفئات لتمثيل كيانات ومجموعات من الكيانات.على سبيل المثال ، كثيرا ما أرى VBA البرمجية التي نسخ Excel مجموعة في صفيف ثنائي الأبعاد ، ثم يتلاعب ثنائية الأبعاد مجموعة مع رمز مثل:

Total = 0
For i = 0 To NumRows-1
    Total = Total + (OrderArray(i,1) * OrderArray(i,3))
Next i

هو أكثر قابلية للقراءة لنسخ مجموعة إلى مجموعة من الكائنات على نحو مناسب-الخصائص المسماة شيئا مثل:

Total = 0
For Each objOrder in colOrders
    Total = Total + objOrder.Quantity * objOrder.Price
Next i

مثال آخر هو استخدام الطبقات لتنفيذ RAII تصميم نمط (جوجل لذلك).على سبيل المثال ، قد تحتاج إلى القيام به هو إلغاء حماية ورقة عمل بعض التلاعبات ، ثم حمايته مرة أخرى.باستخدام فئة يضمن ورقة العمل سوف دائما تكون محمية مرة أخرى حتى إذا حدث خطأ في التعليمات البرمجية:

--- WorksheetProtector class module ---

Private m_objWorksheet As Worksheet
Private m_sPassword As String

Public Sub Unprotect(Worksheet As Worksheet, Password As String)
    ' Nothing to do if we didn't define a password for the worksheet
    If Len(Password) = 0 Then Exit Sub

    ' If the worksheet is already unprotected, nothing to do
    If Not Worksheet.ProtectContents Then Exit Sub

    ' Unprotect the worksheet
    Worksheet.Unprotect Password

    ' Remember the worksheet and password so we can protect again
    Set m_objWorksheet = Worksheet
    m_sPassword = Password
End Sub

Public Sub Protect()
    ' Protects the worksheet with the same password used to unprotect it
    If m_objWorksheet Is Nothing Then Exit Sub
    If Len(m_sPassword) = 0 Then Exit Sub

    ' If the worksheet is already protected, nothing to do
    If m_objWorksheet.ProtectContents Then Exit Sub

    m_objWorksheet.Protect m_sPassword
    Set m_objWorksheet = Nothing
    m_sPassword = ""
End Sub

Private Sub Class_Terminate()
    ' Reprotect the worksheet when this object goes out of scope
    On Error Resume Next
    Protect
End Sub

ثم يمكنك استخدام هذه لتبسيط الكود الخاص بك:

Public Sub DoSomething()
   Dim objWorksheetProtector as WorksheetProtector
   Set objWorksheetProtector = New WorksheetProtector
   objWorksheetProtector.Unprotect myWorksheet, myPassword

   ... manipulate myWorksheet - may raise an error

End Sub 

عند هذا الفرعية المخارج ، objWorksheetProtector يخرج من نطاق حماية ورقة العمل مرة أخرى.

نصائح أخرى

أعتقد المعايير هو نفس اللغات الأخرى

إذا كنت بحاجة إلى التعادل معا عدة قطع من البيانات و بعض الأساليب أيضا على وجه التحديد التعامل مع ما يحدث عندما يتم إنشاء كائن/إنهاء فصول هي مثالية

أقول إذا كان لديك عدد قليل من الإجراءات التي تطلق عند فتح نموذج واحد منهم يأخذ وقت طويل, كنت قد قررت كنت ترغب في وقت كل مرحلة......

يمكنك إنشاء ساعة توقيت الدرجة مع أساليب مهام واضحة لبدء ووقف, ثم هل يمكن إضافة وظيفة لاسترداد الوقت حتى الآن التقرير في ملف نصي باستخدام حجة يمثل اسم العملية يجري توقيتها.يمكن أن تكتب المنطق أن سجل فقط أبطأ العروض للتحقيق.

ثم هل يمكن إضافة شريط التقدم كائن مع طرق لفتح وإغلاق إلى عرض أسماء من العمل الحالية ، جنبا إلى جنب مع مرات في ms المحتمل الوقت المتبقي على أساس السابقة المخزنة التقارير وما إلى ذلك

مثال آخر قد يكون إذا كنت لا ترغب في وصول المستخدم مجموعة القمامة, يمكنك إنشاء الخاصة بك فئة المستخدم مع أساليب امكانية متسعة للتسجيل في الميزات على مستوى المجموعة المستخدم التحكم في الوصول/التدقيق/تسجيل إجراءات معينة/تتبع الأخطاء الخ

بالطبع يمكنك أن تفعل ذلك باستخدام مجموعة من أساليب لا علاقة لها والكثير من متغير عابرة ، لكن أن يكون كل شيء مغلف في الدرجة فقط يبدو أفضل بالنسبة لي.

يمكنك القيام عاجلا أو آجلا يأتي بالقرب من حدود VBA ، ولكن قوية جدا في اللغة و إذا كانت شركتك العلاقات لك أنه يمكنك فعلا الحصول على بعض جيدة ، مجمع حلول للخروج منه.

دروس مفيدة للغاية عند التعامل مع أكثر تعقيدا وظائف API و خاصة عندما تتطلب بنية البيانات.

على سبيل المثال ، GetOpenFileName() و GetSaveFileName() وظائف تأخذ بنية OPENFILENAME مع العديد من الأعضاء.قد لا تحتاج إلى الاستفادة من كل منهم ولكن هم هناك و يجب أن تتم تهيئة.

أود أن التفاف هيكل (UDT) و دالة API الإعلانات في CfileDialog الدرجة.على Class_Initialize الحدث يضع القيم الافتراضية هيكل أعضاء ، حتى عند استخدام الفئة, أنا فقط بحاجة إلى تعيين أعضاء أريد تغيير (من خلال إجراءات الخاصية).العلم الثوابت يتم تنفيذها في إجراء التعداد.لذا, فعلى سبيل المثال, اختيار جدول لفتح ، قانون بلدي قد تبدو مثل هذا:

Dim strFileName As String
Dim dlgXLS As New CFileDialog

With dlgXLS
  .Title = "Choose a Spreadsheet"
  .Filter = "Excel (*.xls)|*.xls|All Files (*.*)|*.*"
  .Flags = ofnFileMustExist OR ofnExplorer

  If OpenFileDialog() Then
    strFileName = .FileName
  End If
End With
Set dlgXLS = Nothing

فئة مجموعات الدليل الافتراضي إلى المستندات ، على الرغم من إذا أردت يمكنني تغيير ذلك مع InitDir الملكية.

هذا هو مجرد مثال واحد على كيف فئة يمكن أن تكون مفيدة بشكل كبير في VBA التطبيق.

لن أقول هناك معيار محدد ، ولكن لم يسبق لي حقا وجدت مكانا مفيدا استخدام الطبقات في التعليمات البرمجية لـ VBA.في رأيي انها مرتبطة بذلك إلى النماذج القائمة حول تطبيقات Office التي مضيفا إضافية التجريد خارج هذا الكائن نموذج فقط يخلط بين الأشياء.

وهذا لا يعني أحد لا تجد مكانا مفيدا لفئة في VBA أو فعله تماما أشياء مفيدة باستخدام فئة فقط التي لم يسبق أن وجدت من المفيد لهم في تلك البيئة.

يمكنك أيضا إعادة استخدام التعليمات البرمجية لـ VBA دون استخدام الفئات الفعلية.على سبيل المثال, إذا كان لديك دعا ، VBACode.يمكنك الوصول إلى أي وظيفة أو الفرعي في أية وحدة نمطية مع بناء الجملة التالي:

VBCode.mysub(param1, param2)

إذا قمت بإنشاء مرجع إلى قالب/doc (كما تفعل dll) يمكنك الرجوع إلى التعليمات البرمجية من المشاريع الأخرى في نفس الطريق.

تطوير البرمجيات ، حتى مع Microsoft Access باستخدام وجوه المنحى البرمجة عموما هو ممارسة جيدة.وسوف تسمح تطويره في المستقبل من خلال السماح الأجسام المتباعدة ، جنبا إلى جنب مع عدد من المزايا.وهذا يعني أساسا أن الكائنات في النظام الخاص بك سوف تكون أقل اعتمادا على بعضها البعض ، وبالتالي إعادة بيع ديون يصبح أسهل كثيرا.يمكنك تحقيق ذلك هو الوصول باستخدام الوحدات النمطية للفئة.الجانب السلبي هو أنه لا يمكن إجراء الدرجة الإرث أو تعدد الأشكال في VBA.في النهاية لا توجد قاعدة جامدة وسريعة حول استخدام الطبقات, فقط أفضل الممارسات.ولكن نأخذ في الاعتبار أن التطبيق الخاص بك تنمو ، فمن الأسهل للحفاظ على استخدام الطبقات.

البيانات العودية (أ.ك.أ.بوم المناولة) ، وهي فئة مخصصة حاسمة مفيدة و أعتقد في بعض الأحيان لا غنى عنه.يمكنك جعل وظيفة متكررة دون فئة وحدة نمطية, ولكن الكثير من البيانات قضايا لا يمكن معالجتها على نحو فعال.

(أنا لا أعرف لماذا الناس ليسوا بها يبيعون بوم المكتبة مجموعات VBA.ربما XML أدوات جعلت الفرق.)

متعددة شكل الحالات الشائعة التطبيق من فئة (أتمتة العديد من المشاكل التي هي على خلاف ذلك غير قابلة للحل), أفترض أن السؤال هو عن مخصص فصول.

يمكنني استخدام الطبقات عندما كنت بحاجة إلى القيام بشيء ما و فئة سوف نفعل ذلك أفضل:) على سبيل المثال إذا كنت بحاجة إلى الاستجابة (أو اعتراض) الأحداث, ثم كنت في حاجة الى الطبقة.بعض الناس يكرهون UDTs (يحددها المستخدم أنواع) ولكن أحب لهم, لذلك أنا استخدامها إذا كنت تريد عادي-اللغة الإنجليزية الذاتي توثيق التعليمات البرمجية.صيدلية.NCPDP كونه أسهل بكثير من قراءة ثم strPhrmNum :) ولكن UDT محدودة ، لذلك أقول أريد أن تكون قادرة على ضبط صيدلية.NCPDP وجميع الخصائص الأخرى ملء.و أنا أيضا أريد جعله بحيث لا يمكن تغيير عن طريق الخطأ البيانات.ثم كنت في حاجة الى الدرجة, لأنه ليس لديك للقراءة فقط خصائص في UDT ، إلخ.

وهناك اعتبار آخر هو مجرد القراءة.إذا كنت تفعل هياكل البيانات المعقدة ، فإنه غالبا ما يكون من المفيد أن نعرف تحتاج فقط إلى الاتصال الشركة.مالك.الهاتف.رمز المنطقة ثم محاولة للحفاظ على المسار من حيث كل شيء منظم.خاصة بالنسبة للأشخاص الذين لديهم للحفاظ على هذا codebase 2 سنوات بعد رحيلك:)

بلدي اثنين سنتا هو "رمز مع الغرض".لا تستخدم فئة دون سبب.ولكن إذا كان لديك سبب ثم القيام بذلك:)

يمكنني استخدام الطبقات إذا كنت تريد إنشاء الذات مغلفة حزمة من التعليمات البرمجية التي سوف تستخدم في العديد من مشاريع VBA التي تأتي عبر مختلف العملاء.

يمكنك تحديد sql المجمع الدرجة في الوصول الذي هو أكثر ملاءمة من مجموعات السجلات querydefs.على سبيل المثال إذا كنت ترغب في تحديث الجدول استنادا إلى معايير أخرى ذات الصلة الجدول, لا يمكنك استخدام ينضم.كنت قد بنيت vba recorset و querydef أن تفعل ذلك ومع ذلك أجد أنه من الأسهل مع فئة.أيضا, التطبيق الخاص بك يمكن أن يكون لها بعض المفهوم التي تحتاج إلى أكثر من 2 الجداول ، قد يكون من الأفضل المنظمة البحرية الدولية إلى استخدام الطبقات على ذلك.E. g.يمكنك تطبيق مسار الحوادث.الحادث لديها العديد من السمات التي تعقد في عدة جداول {المستخدمين جهات الاتصال الخاصة بهم أو ملامح الحادث الوصف ؛ مركز تتبع ؛ قوائم لمساعدة موظف الدعم الرد tonthe الحادث ؛ الرد ...} .لتتبع جميع الاستعلامات والعلاقات المعنية ، oop يمكن أن تكون مفيدة.فمن الإغاثة أن تكون قادرة على القيام الحادث.تحديث(xxx) بدلا من الترميز ...

أنا لا أرى لماذا معايير VBA سيكون مختلفا من لغة أخرى ، خاصة إذا كنت في اشارة الى VB.NET.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top