أساسيات VBA إكسل : كيفية استخدام الإجراءات والوظائف في vba

أساسيات VBA إكسل : كيفية استخدام الإجراءات والوظائف في vba

 


في هذه التدوينة من سلسلة أساسيات VBA اكسل سنتعلم كيفية استخدام الاجراءات و الوظائف في VBA

PUBLIC - PRIVATE

حاليا بالنسبة لجميع الإجراءات التي تم إنشاؤها من النوع Public، يمكننا الوصول إليها من جميع الوحدات.


Sub exemple() 'Est identique à :  

Public Sub exemple()

لجعل إجراء لا يمكن الوصول إليه خارج الوحدة ، نضيف Private :

Private Sub exemple()


ابدأ بإجراء ثم إجراء


لتشغيل إجراء ثم  إجراء آخر ، ما عليك سوى إدخال اسمه.

مثال :

Private Sub avertissement() MsgBox "Attention !!!" End Sub Sub exemple() If Range("A1") = "" Then avertissement '<= exécute la procédure "avertissement" End If  

End Sub

عندما الإجراء exemple بدأ و A1 يساوي ""، الإجراء avertissement سيتم تنفيذه عرضه في مربع الحوار.


الحجج


تُستخدم الحجج لتمرير القيم من إجراء إلى آخر

نضيف حجة texte لهذا الإجراء avertissement :


Private Sub avertissement(texte As String) MsgBox "Attention : " & texte & " !" End Sub Sub exemple() If Range("A1") = "" Then 'Si A1 est vide avertissement "cellule vide" ElseIf Not IsNumeric(Range("A1")) Then 'Si A1 est non numérique avertissement "valeur non numérique" End If End Sub

أساسيات VBA إكسل : كيفية استخدام الإجراءات والوظائف في vba





الحجة تضاف إلى الإجراء avertissement من النوع String :

Private Sub avertissement(texte As String)

لأداء الإجراء avertissement،  سيكون من الضروري إدخال قيمة من نوع String :

avertissement "cellule vide"

في حالة وجود وسائط متعددة ، يجب عليك فصلها بفواصل.


الحجج الاختيارية


بشكل افتراضي ، إذا كان الإجراء يتطلب وسائط ، فهذا ضروري لتشغيل الإجراء.

ومع ذلك ، يمكن إضافة الوسائط الاختيارية بعد الوسائط الإلزامية باستخدام Optional، مثلا :

Private Sub boiteDialogue(nom As String, Optional prenom, Optional age)


 هذا الإجراء مع أو بدون وسائط اختيارية يستطيع ان يبدأ ، مثل هذا:

'Exemple 1 : on affiche le nom boiteDialogue nom 'Exemple 2 : on affiche le nom et le prénom boiteDialogue nom, prenom 'Exemple 3 : on affiche le nom et l'âge boiteDialogue nom, , age 'Exemple 4 : on affiche le nom, le prénom et l'âge boiteDialogue nom, prenom, age


يجب أن يتم كتابة الوسائط بالترتيب.

للتحقق مما إذا كانت الوسائط الاختيارية موجودة أم لا ، سنستخدم وظيفة IsMissing ,  

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

فيما يلي مثال مع جزأين من الكود أعلاه:


Sub exemple() Dim nom As String, prenom As String, age As Integer nom = Range("A1") prenom = Range("B1") age = Range("C1") 'Exemple 1 : on affiche le nom boiteDialogue nom 'Exemple 2 : on affiche le nom et le prénom boiteDialogue nom, prenom 'Exemple 3 : on affiche le nom et l'âge boiteDialogue nom, , age 'Exemple 4 : on affiche le nom, le prénom et l'âge boiteDialogue nom, prenom, age End Sub Private Sub boiteDialogue(nom As String, Optional prenom, Optional age) 'Si l'âge est manquant If IsMissing(age) Then If IsMissing(prenom) Then 'Si le prénom est manquant, on n'affiche que le nom MsgBox nom Else 'Sinon, on affiche le nom et le prénom MsgBox nom & " " & prenom End If 'Si l'âge a été renseigné Else If IsMissing(prenom) Then 'Si le prénom est manquant, on affiche le nom et l'âge MsgBox nom & ", " & age & " ans" Else 'Sinon on affiche le nom, le prénom et l'âge MsgBox nom & " " & prenom & ", " & age & " ans" End If End If End Sub

مثال :

أساسيات VBA إكسل : كيفية استخدام الإجراءات والوظائف في vba



من الممكن أيضًا توفير القيم الافتراضية للوسائط الاختيارية ثم اختبار هذه القيم بدلاً من استخدام وظيفة IsMissing 

Private Sub boiteDialogue(nom As String, Optional prenom As String = "", Optional age As Integer = 0) 'Si l'âge est manquant If age = 0 Then If prenom = "" Then 'Si le prénom est manquant, on n'affiche que le nom MsgBox nom Else 'Sinon, on affiche le nom et le prénom MsgBox nom & " " & prenom End If 'Si l'âge a été renseigné Else If prenom = "" Then 'Si le prénom est manquant, on n'affiche que le nom MsgBox nom & ", " & age & " ans" Else 'Sinon on affiche le nom, le prénom et l'âge MsgBox nom & " " & prenom & ", " & age & " ans" End If End If End Sub

BYREF - BYVAL

بشكل افتراضي ، تكون الوسائط من النوع ByRef مما يعني أنه إذا تم تمرير متغير كوسيط، فسيتم إرسال مرجعهبمعنى آخر ، إذا تم تغيير المتغير في الإجراء الفرعي ، فسيتم تغييره أيضًا في إجراء الاستدعاء.

مثلا :

Sub exemple() Dim nombre As Integer nombre = 30 carre nombre MsgBox nombre End Sub Private Sub carre(ByRef valeur As Integer) 'Il n'est pas nécessaire de préciser ByRef (type par défaut) valeur = valeur ^ 2 End Sub

لفهم اكثر ، إليك ما يحدث عند بدء تشغيل الماكرو:

'La valeur initiale de la variable "nombre" est 30 nombre = 30 'La sous-procédure est lancée avec la variable "nombre" en argument carre nombre 'La variable "valeur" fait référence à la variable "nombre" passée en argument, par conséquent si la variable "valeur" est modifiée, la variable "nombre" le sera aussi Private Sub carre(ByRef valeur As Integer) 'La valeur de la variable "valeur" est modifiée (donc la variable "nombre" aussi) valeur = valeur ^ 2 'Fin de la sous-procédure End Sub 'La variable "nombre" a été modifiée, 900 est alors affiché dans la boîte de dialogue MsgBox nombre

الاحتمال الثاني هو استخدام ByVal.

على عكس عن طريق ByRef التي تشير مباشرة إلى المتغير ، ByVal ينقل قيمته فقط ، مما يعني أن المتغير الذي يتم تمريره كوسيطة لا يخضع لأي تعديل.

إليك ما يحدث مع الكود السابق و ByVal :

'La valeur initiale de la variable "nombre" est 30 nombre = 30 'La sous-procédure est lancée avec la variable "nombre" en argument carre nombre 'La variable "valeur" copie la valeur de la variable "nombre" (les 2 variables ne sont pas liées) Private Sub carre(ByVal valeur As Integer) 'La valeur de la variable "valeur" est modifiée valeur = valeur ^ 2 'Fin de la sous-procédure (dans cet exemple, la sous-procédure n'aura servi à rien) End Sub 'La variable "nombre" n'a pas été modifiée, 30 est donc affiché dans la boîte de dialogue MsgBox nombre


الوظائف

الفرق الرئيسي بين Sub و Function هي أن الدالة ترجع كقيمة.

اليك مثال :

Function carre(nombre As Double) carre = nombre ^ 2 'La fonction "carre" retourne la valeur de "carre" End Function Sub exemple() Dim resultat As Double resultat = carre(9.876) 'La variable resultat reçoit la valeur retournée par la fonction MsgBox resultat 'Affichage du résultat (ici, le carré de 9.876) End Sub


 

 


Comments
No comments
Post a Comment



    Reading Mode :
    Font Size
    +
    16
    -
    lines height
    +
    2
    -