اذهب إلى المحتوى

تتكون تطبيقات جداول البيانات مثل كالك Calc من مصنفات workbooks وأوراق عمل worksheets وخلايا Cells يجب معالجتها باستخدام ماكرو Macro لأتمتة المهام المختلفة. سنشرح فيما يلي المعالجة الأساسية لأوراق العمل والخلايا ومحتوياتها التي تُعَد أساسًا للعديد من الماكرو المعقّد.

هذا المقال جزء من سلسلة مقالات حول إنشاء ماكرو في ليبرأوفيس كالك، فهرس السلسلة:

أوراق عمل مصنفات ليبرأوفيس LibreOffice ومعالجة الخلايا باستخدام الماكرو

سنقرأ جدول بيانات كالك مكوَّن من 3 أوراق وسنقرأ محتوياته، ثم سنعرض محتويات القراءة المنسَّقة في نافذة الرسالة.

تحتوي الورقة 1 و الورقة 2 و الورقة 3 على البيانات التالية:

01_LO_Trav_demo1.png

02_LO_Trav_demo2.png

03_LO_Trav_demo3.png

تفاصيل الشيفرة

سنصرّح أولًا عن 3 كائنات لتعريف مصنف كالك ومجموعة الأوراق والخلية. لمعرفة كيفية البدء بالعمل وكتابة شيفرات الماكرو منذ البداية راجع المقال السابق، المشار إليه ببداية المقال.

dim my_doc   as object
Dim my_sheets as object
Dim my_cell as object

اضبط my_doc باستخدام ThisComponent الذي يشير إلى أن مصنف كالك الحالي مفتوح، ثم يمكنك إسناد مجموعة الأوراق إلى كائن my_sheets للوصول إلى جميع أوراق المصنف، وتُسنَد جميع الأوراق إلى كائن my_sheets بوصفها مصفوفة، حيث يمكن الوصول إليها من خلال استخدام الدليل السفلي subscript مثل Sheets(0)‎ و Sheets(1)‎ وما إلى ذلك (لاحظ أن الدليل السفلي subscript يبدأ من الصفر).

my_doc = ThisComponent
my_sheets = my_doc.Sheets 
sheet_count = my_sheets.Count

يمكننا الوصول إلى كل خلية باستخدام التابع getCellByPosition بمجرد أن نحصل على مقبض إلى الورقة باستخدام Sheets(subscript)‎. الطريقة النموذجية للوصول إلى خلية هي على النحو التالي:

my_cell = ThisComponent.Sheets(i).getCellByPosition(col,row)

لاحظ أن وسطاء التابع getCellByPosition هي عمود column ثم صف row.

يجب الوصول إلى محتويات كائن الخلية my_cell بعد ضبطه، ولكن لدى ليبرأوفيس نظرة مختلفة إليها، حيث تُعرَّف كل خلية بنوع محتواها. إذا وضعت عددًا في خلية، فسيصبح نوع هذه الخلية عدديًا، وإذا وضعت محارفًا فيه، فسيصبح من النوع النصي. يوفّر ليبرأوفيس قائمة تعدادية enums لنوع الخلية Cell.Type كما يلي:

com.sun.star.table.CellContentType.VALUE   ' Used for cells containing numbers
com.sun.star.table.CellContentType.TEXT    ' Used for cells containing characters
com.sun.star.table.CellContentType.EMPTY    ' Used for empty cells
com.sun.star.table.CellContentType.FORMULA    ' Used for cells containing formula

استخدم جزء الشيفرة التالي للوصول إلى قيم الخلية في مثالنا:

Select Case my_cell.Type
  Case com.sun.star.table.CellContentType.VALUE
    cell_value = my_cell.Value
  Case com.sun.star.table.CellContentType.TEXT
    cell_value = my_cell.String
End Select

تشغيل الشيفرة

سنربط قيم كل خلية بطريقة منسَّقة ونعرضها في مربع رسالة، ثم تظهر جميع قيم الخلايا من جميع الأوراق على النحو التالي بعد تشغيل الشيفرة (راجع فقرة "الشيفرة الكاملة" أدناه):

04_LO_Trav_demo4.png

الشيفرة الكاملة

Sub processing_sheets_cells

    dim my_doc   as object
    Dim my_sheets as object
    Dim my_cell as object

    Dim sheet_count, i, row, col, cell_value, str

    my_doc = ThisComponent
    my_sheets = my_doc.Sheets 
    sheet_count = my_sheets.Count

    for i = 0 to sheet_count - 1        
        str = str & chr(13) & "--------" & chr(13)  
        for row=1 to 4
                for col=0 to 1
                    my_cell = ThisComponent.Sheets(i).getCellByPosition(col,row)
                    Select Case my_cell.Type
                        Case com.sun.star.table.CellContentType.VALUE
                            cell_value = my_cell.Value
                        Case com.sun.star.table.CellContentType.TEXT
                            cell_value = my_cell.String
                    End Select
                    str = str & " " & cell_value
                next col
                str = str & Chr(13)
        next row
    next i
    msgbox str

End Sub

معالجة السلاسل النصية String في ماكرو ليبرأوفيس كالك مع أمثلة عنها

سنوضّح كيفية معالجة سلسلة نصية مشتركة باستخدام الماكرو في ليبرأوفيس LibreOffice، حيث سنستخدم خلايا ليبرأوفيس كالك لاستخدام السلاسل النصية، فعمليات المعالجة هذه ضرورية لتطوير أيّ ماكرو.

لنضع 3 سلاسل نصية في ورقة ليبرأوفيس كالك ونضمّها كما هو موضّح أدناه:

05_LibreOffice-Calc-Macro-Join-Data.png

ضم Joining السلاسل في كالك

استخدم المعامل "&" لضم سلسلتين أو نصين، حيث سنستخدم هذا المعامل لضم ثلاثة أعمدة من السلاسل النصية ووضع النتائج في عمود آخر كما يلي:

Sub String_join()
  part1 = ThisComponent.Sheets(0).getCellByPosition(0,1)
  part2 = ThisComponent.Sheets(0).getCellByPosition(1,1) 
  part3 = ThisComponent.Sheets(0).getCellByPosition(2,1)

  result_cell = ThisComponent.Sheets(0).getCellByPosition(3,1)
  result_cell.String = part1.String & "." & part2.String & "." & part3.String
End Sub

06_LibreOffice-Calc-Macro-Join.png

ماكرو ليبرأوفيس كالك - الضم Join

لنضع بعض السلاسل النصية في العمود A كما هو موضّح أدناه في ليبرأوفيس، حيث سنستخدم هذه السلاسل الثلاثة لعمليات المعالجة المتبقية في مثالنا.

الدالة Left

تعيد الدالة Left عدد المحارف من جانب السلسلة النصية الأيسر، حيث يمكن تحديد عدد المحارف في وسيط الدالة. ضع السلسلة "www.google.com" في الخلية A1 وشغّل الدالة على الخلية A1 على النحو التالي، حيث ستعيد هذه الدالة السلسلة الفرعية "www".

Sub left_demo()
  part1 = ThisComponent.Sheets(0).getCellByPosition(0,0)
  result = ThisComponent.Sheets(0).getCellByPosition(2,0)
  result.String = left(part1.String,3)    
End Sub

07_LibreOffice-Calc-Macro-Left-Example.png

ماكرو ليبرأوفيس كالك - مثال Left

الدالة Right

تعيد الدالة Right عدد المحارف المُعطَى من الجانب الأيمن، حيث ستعيد هذه الدالة أدناه السلسلة النصية "com" مع المثال السابق نفسه.

Sub right_demo()
  part1 = ThisComponent.Sheets(0).getCellByPosition(0,0)
  result = ThisComponent.Sheets(0).getCellByPosition(2,0)
  result.String = right(part1.String,3)    
End Sub

08_LibreOffice-Calc-Macro-Right-Example.png

ماكرو ليبرأوفيس كالك - مثال Right

الدالة Mid

تعيد الدالة Mid حجم سلسلة فرعية من سلسلة نصية معينة. وسطاء الدالة Mid هي (السلسلة النصية string، وموضع البداية start position، وطول السلسلة الفرعية length of the sub-string). ضع سلاسلًا نصية في عمود ضمن ليبرأوفيس كالك، ثم شغّل الدالة Mid، حيث تُحوَّل السلاسل من العمود A إلى سلسلة فرعية موجودة في العمود B في المثال أدناه، إذ تبدأ السلسلة الفرعية من المحرف رقم 4 من السلسلة ويبلغ الطول 6 محارف.

Sub mid_demo()
  part1 = ThisComponent.Sheets(0).getCellByPosition(0,1) 
  result = ThisComponent.Sheets(0).getCellByPosition(1,1)
  result.String = mid(part1.String,5,6) 

  part2 = ThisComponent.Sheets(0).getCellByPosition(0,2)
  result = ThisComponent.Sheets(0).getCellByPosition(1,2)
  result.String= mid(part2.String,5,6) 

  part3 = ThisComponent.Sheets(0).getCellByPosition(0,3)
  result = ThisComponent.Sheets(0).getCellByPosition(1,3)
  result.String = mid(part3.String,5,6) 
End Sub

09_LibreOffice-Calc-Macro-Mid-Example.png

ماكرو ليبرأوفيس كالك - مثال Mid

الدالة Trim

تُستخدَم الدالة Trim لإزالة المسافات البادئة واللاحقة من سلسلة نصية، حيث يمكن استخدام هذه الدالة كما يلي: Trim(your_string_here)‎.

الدالة Len

تعيد الدالة Len عدد محارف السلسلة، أي طول السلسلة، حيث تُستخدَم كما يلي: Len(string)‎.

الدالة Instr

تُستخدَم الدالة Instr للبحث عن سلسلة ضمن سلسلة أخرى. إذا عُثِر على تطابق، فستعيد الدالة Instr رقم موضع بداية السلسلة التي يجري البحث عنها، وإن لم يُعثَر عليها، فستُعاد القيمة 0.

Sub instr_demo()
  part1 = ThisComponent.Sheets(0).getCellByPosition(0,1) 
  result = ThisComponent.Sheets(0).getCellByPosition(1,1)
  result.Value = instr(part1.String,"oogl") 

  part2 = ThisComponent.Sheets(0).getCellByPosition(0,2)
  result = ThisComponent.Sheets(0).getCellByPosition(1,2)
  result.Value = instr(part2.String,"dd") 

  part3 = ThisComponent.Sheets(0).getCellByPosition(0,3)
  result = ThisComponent.Sheets(0).getCellByPosition(1,3)
  result.Value = instr(part3.String,"untu")       
End Sub

10_LibreOffice-Calc-Macro-Instr-Example.png

ماكرو ليبرأوفيس كالك - مثال Instr

معالجة التاريخ والوقت في ليبرأوفيس كالك باستخدام الماكرو

التاريخ هو نوع بيانات يُستخدم لتخزين قيم التاريخ والوقت، ويحتفظ بقيمة منتصف الليل من 1 يناير عام 0001 افتراضيًا، ولكن يمكن أن نختار أيّ تاريخ نريده ونعالجه بطرق مختلفة.

إضافة أيام وشهور إلى تاريخ

يمكن التصريح عن متغير التاريخ كما يلي:

Dim my_date As Date

سنستخدم بعد ذلك الدالة DateValue التي تساعد في تحويل التاريخ من تنسيق نص إلى تنسيق تاريخ، حيث سنضع هذا التاريخ في خلية ليبرأوفيس كالك.

my_date = DateValue("Nov 20, 2014")
my_cell = ThisComponent.Sheets(0).getCellbyPosition(1,1)
my_cell.String = my_date

يمكن إضافة 3 أيام إلى التاريخ السابق باستخدم الدالة DateAdd()‎. يحدّد وسيط هذه الدالة الأول أيّ جزء من التاريخ يجب زيادته. إذا مرّرت الحرف "d"، فسيُزاد جزء اليوم من التاريخ، وإذا استخدمتَ الحرف "m"، فسيؤدي ذلك إلى زيادة جزء الأشهر في التاريخ. يمكن زيادة التاريخ بمقدار 3 أيام كما يلي:

my_cell = ThisComponent.Sheets(0).getCellbyPosition(1,3)
my_cell.String = DateAdd("d", 3, my_date)

يمكن زيادة التاريخ بمقدار 3 أشهر كما يلي:

my_cell = ThisComponent.Sheets(0).getCellbyPosition(1,5)
my_cell.String = DateAdd("m", 3, my_date)

تنسيق التاريخ

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

  • الخرج: 20‎ – 11 – 14
my_cell = ThisComponent.Sheets(0).getCellbyPosition(1,7)
my_cell.String = Format(my_date, "d - m - yy") ' 20 - 11 - 14
  • الخرج: ‎20 Nov 2014
my_cell = ThisComponent.Sheets(0).getCellbyPosition(1,9)
my_cell.String = Format(my_date, "d MMM yyyy") '20 Nov 2014
  • الخرج: 20‎ November 2014
my_cell = ThisComponent.Sheets(0).getCellbyPosition(1,11)
my_cell.String = Format(my_date, "d MMMM yyyy") '20 November 2014
  • الخرج: Thursday, 20 Nov 2014
my_cell = ThisComponent.Sheets(0).getCellbyPosition(1,13)
my_cell.String = Format(my_date, "dddd, d MMM yyyy") 'Thursday, 20 Nov 2014
  • الخرج: Thursday, 20 November 2014
my_cell = ThisComponent.Sheets(0).getCellbyPosition(1,15)
my_cell.String = Format(my_date, "dddd, d MMMM yyyy") 'Thursday, 20 November 2014

معالجة الوقت

يمكن استخراج وقت النظام باستخدام الماكرو، حيث سنعرض فيما يلي بعض دوال الوقت وخصائصها.

  • Now: تعرض التاريخ الحالي ووقت النظام متضمنًا الساعات والدقائق والثواني.
my_cell = ThisComponent.Sheets(0).getCellbyPosition(1,17)
my_cell.String = Now
  • Hour: تعرض جزء الساعات.
my_cell = ThisComponent.Sheets(0).getCellbyPosition(1,19)
my_cell.String = Hour(Now)
  • Minute: تعرض جزء الدقائق.
my_cell = ThisComponent.Sheets(0).getCellbyPosition(1,21)
my_cell.String = Minute(Now)
  • Second: تعرض جزء الثواني.
my_cell = ThisComponent.Sheets(0).getCellbyPosition(1,23)
my_cell.String = Second(Now)

الخرج النهائي

إذا وضعنا جميع شيفرات معالجة التاريخ والوقت السابقة في ماكرو، فسيكون الخرج كما يلي في كالك:

11_Date-and-Time-Processing-Example-Output.png

خرج مثال معالجة الوقت والتاريخ

حذف محتويات مجال من الخلايا في كالك باستخدام الماكرو

يمكنك مسح محتويات خلية أو مجال من الخلايا باستخدام الماكرو، حيث سنمسح كل نوع من أنواع المحتويات من هذا المجال. لنعرّف دالة باستخدام Sub تمسح محتويات مجال من الخلايا كما يلي:

Sub ClearRangeContents()
End Sub

لنحصل على مجال من الخلايا في الورقة 1. تعيد الدالة getCellRangeByName كائن المجال المقابل للمجال المُمرَّر عبر الوسيط.

Dim oDoc As Object
Dim oSheet As Object
Dim oCell As Object
Dim oRange As Object

oDoc = ThisComponent
oSheet = oDoc.Sheets(0) ' Refers to Sheet1 as in 0, 1, 2 etc
oRange = oSheet.getCellRangeByName("A3:B10")

12_Range-A3-B10-with-different-types-of-values.png

المجال A3:B10 مع أنواع مختلفة من القيم

يمكن استخدام دالة المجال clearContents(flags)‎ لمسح محتويات هذا المجال، فالرايات flags هي أنواع القيم التي يمكن أن توجد في خلية، حيث يمكن أن تكون عبارة عن سلسلة نصية أو أرقام أو صيغ أو أنماط وغير ذلك، إذ يمكنك تحديد الأنواع التي تريد مسحها من هذا المجال. تُعَد رايات وسيط الدالة ClearContents من نوع البيانات long، ويمكن أن تأخذ رايات متعددة كدخل.

توجد الرايات في مجموعة أوبن أوفيس / ليبرأوفيس الثابتة CellFlags التي تُعَد جزءًا من com.sun.star.sheet.

قائمة الرايات الموجودة ضمن com.sun.star.sheet.CellFlags

الراية وصفها قيمتها
VALUE تحدد القيم العددية الثابتة التي ليس تنسيقها تاريخ أو وقت. 1
DATETIME تحدد القيم العددية الثابتة التي لها تنسيق التاريخ أو الوقت. 2
STRING تحدد سلاسلًا نصية ثابتة. 4
ANNOTATION تحدد تعليقات الخلايا التوضيحية. 8
FORMULA تحدّد الصيغ. 16
HARDATTR تحدد كل التنسيقات الصريحة، لكنها لا تحدد التنسيق المطبق ضمنيًا من خلال نمط الأوراق. 32
STYLES تحدد أنماط الخلية. 64
OBJECTS تحدد الكائنات الرسومية. 128
EDITATTR تحدد التنسيق ضمن أجزاء من محتويات الخلية. 256
FORMATTED تحدد الخلايا ذات التنسيق ضمن الخلايا أو الخلايا التي تحتوي على أكثر من فقرة واحدة في الخلايا. 512

ضع كل الثوابت السابقة ضمن متغير ومرّره إلى الدالة clearContents كما يلي:

Dim oFlags As Long
oFlags = com.sun.star.sheet.CellFlags.VALUE + _
    com.sun.star.sheet.CellFlags.DATETIME + _
    com.sun.star.sheet.CellFlags.STRING + _
    com.sun.star.sheet.CellFlags.ANNOTATION + _
    com.sun.star.sheet.CellFlags.FORMULA + _
    com.sun.star.sheet.CellFlags.HARDATTR + _
    com.sun.star.sheet.CellFlags.STYLES + _
    com.sun.star.sheet.CellFlags.OBJECTS + _
    com.sun.star.sheet.CellFlags.EDITATTR

oRange.clearContents(oFlags)

تشغيل الشيفرة

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

شيفرة الماكرو الكاملة

Sub ClearRangeContents()

    Dim oDoc As Object
    Dim oSheet As Object
    Dim oCell As Object
    Dim oRange As Object
    Dim oFlags As Long

    oDoc = ThisComponent
    oSheet = oDoc.Sheets(0) ' Refers to Sheet1 as in 0, 1, 2 etc
    oRange = oSheet.getCellRangeByName("A3:B10")

    oFlags = com.sun.star.sheet.CellFlags.VALUE + _
        com.sun.star.sheet.CellFlags.DATETIME + _
        com.sun.star.sheet.CellFlags.STRING + _
        com.sun.star.sheet.CellFlags.ANNOTATION + _
        com.sun.star.sheet.CellFlags.FORMULA + _
        com.sun.star.sheet.CellFlags.HARDATTR + _
        com.sun.star.sheet.CellFlags.STYLES + _
        com.sun.star.sheet.CellFlags.OBJECTS + _
        com.sun.star.sheet.CellFlags.EDITATTR

    oRange.clearContents(oFlags)

End Sub

معالجة الملفات والمجلدات باستخدام ماكرو ليبرأوفيس كالك

سنوضّح كيفية معالجة أو قراءة الملفات والمجلدات في نظام ملفات يونيكس باستخدام لغة بيسيك Basic وماكرو ليبرأوفيس كالك، ووضع أسماء الملفات أو المجلدات في خلايا ليبرأوفيس كالك.

يجب معرفة معالجات نظام الملفات والمجلدات، حيث سنعتمد على نظام ملفات يونيكس الذي يختلف عن نظام ويندوز، إذ سيقرأ الماكرو محتويات مجلد ويستخرج الملفات والمجلدات ويدرجها في خلايا كالك. لنفترض أن بنية نظام الملفات تشبه ما يلي في نظام أبونتو Ubuntu المعياري في المسار ‎/usr/include:

13_Files-and-Directories-inside-usr-include.png

هناك الكثير من المجلدات والملفات، حيث نريد أن ندرج هذه المحتويات الكاملة ضمن خلايا كالك. توفّر لغة بيسيك Basic الدالة Dir التي يمكن استخدامها لقراءة محتويات مجلد، وتكون هذه الدالة بالشكل التالي:

Dir (path, attributes) As String

وسيط دالة Dir الأول هو سلسلة المسار النصية المراد قراءتها، ويخبر الوسيط الثاني الدالة Dir بنوع عناصر هذا المسار المراد إعادتها. مرّر القيمة "0" للملف والقيمة "16" للمجلدات في الوسيط الثاني، حيث يكون الوسيطان اختياريين.

إذا استدعيت الدالة Dir لأول مرة بنجاح، فاستدعِ الدالة مرة أخرى بدون وسيط داخل حلقة للحصول على نفس العناصر من الدالة الناتجة عن إدراج محتويات المجلد الكامل.

شيفرة الماكرو الكاملة

أنشئ ملف كالك جديد وانسخ والصق الشيفرة التالية في محرّر الماكرو Macro Editor ضمن ليبرأوفيس وشغّلها:

Sub list_files()
    Dim i, strFile
    path ="/usr/include/"
    strFile = Dir(path,0)
    i = 1
    while strFile <> ""
        my_cell = ThisComponent.Sheets(0).getCellbyPosition(1,i)
        my_cell.String = strFile
        strFile = Dir ' returns next entry
        i = i + 1
    wend
End Sub

Sub list_directory()
    Dim i, strDir
    path ="/usr/include/"
    strDir = Dir(path, 16)
    i = 1
    while strDir <> ""
        my_cell = ThisComponent.Sheets(0).getCellbyPosition(2,i)
        my_cell.String = strDir
        strDir = Dir ' returns next entry
        i = i + 1
    wend
End Sub

الخرج

ستظهر محتويات المسار ‎/usr/include في كالك بعد تشغيل الشيفرة، حيث سيحتوي العمود الأول على الملفات وسيحتوي العمود الثاني على المجلدات.

14_List-Files-and-Directories-Using-Calc-Macro.png

قائمة الملفات والمجلدات باستخدام ماكرو كالك

مرجع الدالة Dir

Dir (path, attributes)
  • المسار path: وسيط اختياري.
  • السمات attributes: وسيط اختياري.
  • القيمة المعادة: سلسلة نصية String.

قائمة أنواع السمات

السمة وصفها
  عادية (القيمة الافتراضية)
1 للقراءة فقط
2 مخفية
4 ملف نظام
8 تسمية قرص Volume label
16 مجلد أو دليل
64 اسم الملف هو اسم بديل alias

ترجمة -وبتصرُّف- لمجموعة المقالات

لصاحبها Arindam.

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...