تتكون تطبيقات جداول البيانات مثل كالك Calc من مصنفات workbooks وأوراق عمل worksheets وخلايا Cells يجب معالجتها باستخدام ماكرو Macro لأتمتة المهام المختلفة. سنشرح فيما يلي المعالجة الأساسية لأوراق العمل والخلايا ومحتوياتها التي تُعَد أساسًا للعديد من الماكرو المعقّد.
هذا المقال جزء من سلسلة مقالات حول إنشاء ماكرو في ليبرأوفيس كالك، فهرس السلسلة:
- مدخل إلى كتابة ماكرو Macro في ليبرأوفيس كالك LibreOffice Calc
- معالجة محتويات خلايا ليبرأوفيس كالك باستخدام الماكرو
- معالجة مجال من الخلايا باستخدام الماكرو في ليبرأوفيس كالك
- استخدام عناصر التحكم بالنماذج ونافذة فتح الملفات من خلال الماكرو في ليبرأوفيس
- التعامل مع عناصر التحكم بمربع الحوار ومعالجة النماذج باستخدام الماكرو في ليبرأوفيس كالك
- أتمتة حفظ أوراق ليبرأوفيس كالك بتنسيق PDF باستعمال الماكرو
أوراق عمل مصنفات ليبرأوفيس LibreOffice ومعالجة الخلايا باستخدام الماكرو
سنقرأ جدول بيانات كالك مكوَّن من 3 أوراق وسنقرأ محتوياته، ثم سنعرض محتويات القراءة المنسَّقة في نافذة الرسالة.
تحتوي الورقة 1 و الورقة 2 و الورقة 3 على البيانات التالية:
تفاصيل الشيفرة
سنصرّح أولًا عن 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
تشغيل الشيفرة
سنربط قيم كل خلية بطريقة منسَّقة ونعرضها في مربع رسالة، ثم تظهر جميع قيم الخلايا من جميع الأوراق على النحو التالي بعد تشغيل الشيفرة (راجع فقرة "الشيفرة الكاملة" أدناه):
الشيفرة الكاملة
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 سلاسل نصية في ورقة ليبرأوفيس كالك ونضمّها كما هو موضّح أدناه:
ضم 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
ماكرو ليبرأوفيس كالك - الضم 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
ماكرو ليبرأوفيس كالك - مثال 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
ماكرو ليبرأوفيس كالك - مثال 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
ماكرو ليبرأوفيس كالك - مثال 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
ماكرو ليبرأوفيس كالك - مثال 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)
الخرج النهائي
إذا وضعنا جميع شيفرات معالجة التاريخ والوقت السابقة في ماكرو، فسيكون الخرج كما يلي في كالك:
خرج مثال معالجة الوقت والتاريخ
حذف محتويات مجال من الخلايا في كالك باستخدام الماكرو
يمكنك مسح محتويات خلية أو مجال من الخلايا باستخدام الماكرو، حيث سنمسح كل نوع من أنواع المحتويات من هذا المجال. لنعرّف دالة باستخدام 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")
المجال 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
:
هناك الكثير من المجلدات والملفات، حيث نريد أن ندرج هذه المحتويات الكاملة ضمن خلايا كالك. توفّر لغة بيسيك 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
في كالك بعد تشغيل الشيفرة، حيث سيحتوي العمود الأول على الملفات وسيحتوي العمود الثاني على المجلدات.
قائمة الملفات والمجلدات باستخدام ماكرو كالك
مرجع الدالة Dir
Dir (path, attributes)
- المسار path: وسيط اختياري.
- السمات attributes: وسيط اختياري.
- القيمة المعادة: سلسلة نصية String.
قائمة أنواع السمات
السمة | وصفها |
---|---|
عادية (القيمة الافتراضية) | |
1 | للقراءة فقط |
2 | مخفية |
4 | ملف نظام |
8 | تسمية قرص Volume label |
16 | مجلد أو دليل |
64 | اسم الملف هو اسم بديل alias |
ترجمة -وبتصرُّف- لمجموعة المقالات
- LibreOffice Workbook Worksheet and Cell Processing using Macro
- String Processing in LibreOffice Calc Macro with Examples
- Date and Time Processing in LibreOffice Calc using Macro
- Deleting All Types of Contents from Calc Range using Macro
- Files and Directory Processing Using LibreOffice Calc Macro using Basic
لصاحبها Arindam.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.