Regex لاستخراج السلاسل في Excel (واحد أو كل التطابقات)

  • شارك هذا
Michael Brown

في هذا البرنامج التعليمي ، ستتعلم كيفية استخدام التعبيرات العادية في Excel للعثور على سلاسل فرعية مطابقة لنمط معين واستخراجها.

يوفر Microsoft Excel عددًا من الوظائف لاستخراج النص من الخلايا. يمكن لهذه الوظائف التعامل مع معظم تحديات استخراج السلاسل في أوراق العمل الخاصة بك. معظم وليس كل. عندما تتعثر وظائف النص ، يتم إنقاذ التعبيرات العادية. انتظر ... لا يحتوي Excel على وظائف RegEx! صحيح ، لا توجد وظائف يحمل في ثناياه عوامل. ولكن لا يوجد شيء يمنعك من استخدام تلك الخاصة بك :)

    وظيفة Excel VBA Regex لاستخراج السلاسل

    لإضافة وظيفة استخراج Regex مخصصة إلى Excel ، الصق الكود التالي في محرر VBA. من أجل تمكين التعبيرات العادية في VBA ، نستخدم كائن Microsoft RegExp المدمج.

    الوظيفة العامة RegExpExtract (النص كسلسلة ، ونمط كسلسلة ، ومثيل اختياري على شكل عدد صحيح = 0 ، وحالة مطابقة اختيارية باسم Boolean = True) خافت text_matches () حيث تطابق String Dim_index كـ عدد صحيح عند الخطأ ، انتقل إلى ErrHandl RegExpExtract = "" تعيين regex = CreateObject ("VBScript.RegExp") regex.pattern = pattern regex.Global = True regex.MultiLine = True If True = match_case ثم regex. ignorecase = False Else regex.ignorecase = True End If Set المطابقات = regex.Execute (text) If 0 & lt؛ المطابقات.العد ثم إذا (0 = example_num) ثم ReDim text_matches (مباريات. العدد - 1 ، 0) للمطابقات_index = 0 إلىVBA RegExp ، أنا أشجعك على قراءة الجزء التالي الذي يناقش الكثير من وظائف .NET Regex القوية.

    وظيفة Regex مخصصة تستند إلى .NET لاستخراج النص في Excel

    بخلاف وظائف VBA Regexp التي يمكن كتابته من قبل أي مستخدم لبرنامج Excel ، فإن .NET RegEx هو عالم المطور. يدعم Microsoft .NET Framework بناء جملة تعبير عادي كامل الميزات متوافق مع Perl 5. لن تعلمك هذه المقالة كيفية كتابة مثل هذه الوظائف (أنا لست مبرمجًا وليس لدي أدنى فكرة عن كيفية القيام بذلك :)

    أربع وظائف قوية تمت معالجتها بواسطة محرك .NET RegEx القياسي تمت كتابتها بالفعل بواسطة مطورينا وتم تضمينها في Ultimate Suite. أدناه ، سنشرح بعض الاستخدامات العملية للوظيفة المصممة خصيصًا لاستخراج النص في Excel.

    نصيحة. للحصول على معلومات حول بناء جملة .NET Regex ، يرجى الرجوع إلى لغة التعبير العادي لـ .NET.

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

    بافتراض أن لديك أحدث إصدار من Ultimate Suite مثبتًا ، فإن استخراج النص باستخدام التعبيرات العادية يتلخص في هاتين الخطوتين:

    1. في علامة التبويب Ablebits Data ، في المجموعة Text ، انقر فوق Regex Tools .
    2. في جزء أدوات Regex ، حدد البيانات المصدر ، وأدخل نمط Regex ، واختر الخيار استخراج . للحصول على النتيجة كدالة مخصصة ، وليست قيمة ، حدد الاختيار إدراج كصيغة علبة. عند الانتهاء ، انقر فوق الزر استخراج .

    ستظهر النتائج في عمود جديد على يمين بياناتك الأصلية:

    AblebitsRegexExtract بناء الجملة

    وظيفتنا المخصصة لها بناء الجملة التالي:

    AblebitsRegexExtract (المرجع ، التعبير العادي)

    المكان:

    • المرجع (مطلوب) - مرجع إلى الخلية التي تحتوي على سلسلة المصدر.
    • Regular_expression (مطلوب) - نمط regex المراد مطابقته.

    ملاحظة مهمة! تعمل الوظيفة فقط على الأجهزة المثبت عليها Ultimate Suite for Excel.

    ملاحظات الاستخدام

    لجعل منحنى التعلم الخاص بك أكثر سلاسة وتجربتك أكثر إمتاعًا ، يرجى الانتباه إلى هذه النقاط:

    1. لإنشاء صيغة ، يمكنك استخدام أدوات Regex ، أو مربع حوار إدراج دالة في Excel ، أو كتابة اسم الوظيفة بالكامل في خلية. بمجرد إدراج الصيغة ، يمكنك إدارتها (تحرير أو نسخ أو نقل) مثل أي صيغة أصلية.
    2. ينتقل النمط الذي تدخله في الجزء أدوات Regex إلى الوسيطة الثانية. من الممكن أيضًا الاحتفاظ بتعبير عادي في خلية منفصلة. في هذه الحالة ، ما عليك سوى استخدام مرجع خلية للوسيطة الثانية.
    3. تستخرج الدالة أول تطابق تم العثور عليه .
    4. افتراضيًا ، الوظيفة هي case -حساسة . للمطابقة غير الحساسة لحالة الأحرف ، استخدم النمط (؟ i).
    5. إذا لم يتم العثور على تطابق ، فسيكون الخطأ # N / Aتم إرجاعه.

    Regex لاستخراج سلسلة بين حرفين

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

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

    النمط 1 : \ [(. *؟) \]

    مع نظرة موجبة للخلف والمظهر ، ستكون النتيجة بالضبط نفس الشيء.

    النمط 2 : (؟ & lt؛ = \ [) (. *؟) (؟ = \])

    يرجى الانتباه إلى أن مجموعة الالتقاط الخاصة بنا يقوم (. *؟) بإجراء بحث كسول عن نص بين قوسين - من الأول [إلى الأول]. ستقوم مجموعة الالتقاط بدون علامة استفهام (. *) بإجراء بحث جشع والتقاط كل شيء من الأول [إلى الأخير].

    مع النمط الموجود في A2 ، فإن الصيغة تسير على النحو التالي يلي:

    =AblebitsRegexExtract(A5, $A$2)

    كيفية الحصول على جميع التطابقات

    كما ذكرنا سابقًا ، يمكن لوظيفة AblebitsRegexExtract استخراج تطابق واحد فقط. للحصول على جميع التطابقات ، يمكنك استخدام وظيفة VBA التي ناقشناها سابقًا. ومع ذلك ، هناك تحذير واحد - لا يدعم VBA RegExp مجموعات الالتقاط ، لذلك سيعيد النمط أعلاه أحرف "الحدود" أيضًا ، الأقواس في حالتنا.

    =TEXTJOIN(" ", TRUE, RegExpExtract(A5, $A$2))

    للتخلص من الأقواس ، استبدلها بسلاسل فارغة ("") باستخدام هذه الصيغة:

    =SUBSTITUTE(SUBSTITUTE(TEXTJOIN(", ", TRUE, RegExpExtract(A5, $A$2)), "]", ""),"[","")

    للحصول على قراءة أفضل ، نستخدم فاصلة للمحدد.

    Regex لاستخراج نص بين سلسلتين

    الطريقة التي عملنا بهافسرها حرفيا).

  • (؟: [A-Za-z \ d \ - \.] {2،255} \.)؟ - مجموعة غير ملتقطة لتحديد نطاقات المستوى الثالث والرابع وما إلى ذلك ، إن وجدت ( المحمول في نموذج عنوان URL الخاص بنا). في النمط الأول ، يتم وضعه ضمن مجموعة التقاط أكبر لإدراج كل هذه المجالات الفرعية في الاستخراج. يمكن أن يتراوح طول النطاق الفرعي من 2 إلى 255 حرفًا ، ومن هنا جاء {2،255} المُحدد الكمي.
  • ([A-Za-z \ d \ -] {1،63} \. [A-Za-z] {2،24}) - مجموعة الالتقاط لاستخراج نطاق المستوى الثاني ( قادر على ) ونطاق المستوى الأعلى ( com ). يبلغ الحد الأقصى لطول نطاق المستوى الثاني 63 حرفًا. أطول مجال ذو مستوى أعلى موجود حاليًا يحتوي على 24 حرفًا.
  • اعتمادًا على التعبير العادي الذي تم إدخاله في A2 ، ستنتج الصيغة أدناه نتائج مختلفة:

    =AblebitsRegexExtract(A5, $A$2)

    Regex لاستخراج اسم المجال الكامل مع جميع المجالات الفرعية:

    Regex لاستخراج المستوى الثاني المجال بدون المجالات الفرعية:

    هذه هي طريقة استخراج أجزاء من النص في Excel باستخدام التعبيرات العادية. أشكرك على القراءة وأتطلع إلى رؤيتك على مدونتنا الأسبوع المقبل!

    التنزيلات المتاحة

    أمثلة لاستخراج Excel Regex (ملف .xlsm)

    الإصدار التجريبي من Ultimate Suite (ملف. exe)

    \ ب (0؟ [0-9]match.Count - 1 text_matches (match_index، 0) = متطابقات. theem (

    إذا كانت لديك خبرة قليلة مع VBA ، فقد يكون دليل المستخدم خطوة بخطوة مفيدًا: كيفية إدراج رمز VBA في Excel.

    ملاحظة. لكي تعمل الوظيفة ، تأكد من حفظ الملف كمصنف ممكن بماكرو (.xlsm).

    بناء جملة RegExpExtract

    تبحث الدالة RegExpExtract في سلسلة إدخال عن القيم التي تطابق تعبيرًا عاديًا وتستخرج واحدًا أو كل التطابقات.

    تحتوي الوظيفة على بناء الجملة التالي :

    RegExpExtract (نص ، نمط ، [example_num] ، [match_case])

    حيث:

    • Text (مطلوب) - السلسلة النصية للبحث فيها.
    • النمط (مطلوب) - التعبير العادي المراد مطابقته. عندما يتم توفيره مباشرة في صيغة ، يجب أن يكون النمط محاطًا بعلامات اقتباس مزدوجة.
    • Instance_num (اختياري) - رقم تسلسلي يشير إلى المثيل المراد استخراجه. في حالة الحذف ، تُرجع جميع المطابقات التي تم العثور عليها (افتراضي).
    • Match_case (اختياري) - تحدد ما إذا كنت تريد مطابقة حالة النص أو تجاهلها. إذا كانت القيمة TRUE أو تم حذفها (افتراضيًا) ، فسيتم إجراء المطابقة الحساسة لحالة الأحرف ؛ إذا كانت FALSE - غير حساسة لحالة الأحرف.

    تعمل الوظيفة في كافة إصدارات Excel 365 و Excel 2021 و Excel2019 و Excel 2016 و Excel 2013 و Excel 2010.

    4 أشياء يجب أن تعرفها عن RegExpExtract

    لاستخدام الوظيفة بشكل فعال في Excel ، هناك بعض الأشياء المهمة التي يجب الانتباه إليها:

    1. بشكل افتراضي ، ترجع الوظيفة جميع المطابقات الموجودة في الخلايا المجاورة كما هو موضح في هذا المثال. للحصول على حدث معين ، قم بتوفير رقم مطابق للوسيطة example_num .
    2. افتراضيًا ، تكون الوظيفة حساسة لحالة الأحرف . للمطابقة غير الحساسة لحالة الأحرف ، اضبط الوسيطة match_case على FALSE. بسبب قيود VBA ، لن يعمل البناء غير المتحسس لحالة الأحرف (؟ i).
    3. إذا لم يتم العثور على نمط صالح ، فإن الدالة لا تُرجع شيئًا (سلسلة فارغة).
    4. إذا كان النمط غير صالح ، فإن الخطأ #VALUE! حدث خطأ.

    قبل البدء في استخدام هذه الوظيفة المخصصة في أوراق العمل الخاصة بك ، تحتاج إلى فهم ما هي قادرة عليه ، أليس كذلك؟ تغطي الأمثلة أدناه بعض حالات الاستخدام الشائعة وتشرح سبب اختلاف السلوك في Dynamic Array Excel (Microsoft 365 و Excel 2021) و Excel التقليدي (2019 والإصدارات الأقدم).

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

    Regex لاستخراج رقم من سلسلة

    باتباع الحد الأقصى الأساسي للتعليم "من البسيط إلى المعقد" ، سنبدأ بحالة بسيطة جدًا: استخراج رقم من السلسلة.

    أول شيء عليك أن تقرره هو أي رقم تريد استرداده: أولاً ، أخيرًا ، حدث محدد أو كل الأرقام.

    استخراج الرقم الأول

    هذا أمر بسيط بقدر ما يمكن الحصول عليه من regex. بالنظر إلى أن \ d تعني أي رقم من 0 إلى 9 ، و + تعني مرة واحدة أو أكثر ، فإن تعبيرنا العادي يأخذ هذا الشكل:

    Pattern : \ d +

    تعيين example_num إلى 1 وستحصل على النتيجة المرجوة:

    =RegExpExtract(A5, "\d+", 1)

    حيث A5 هي السلسلة الأصلية.

    للراحة ، يمكنك إدخال النمط في خلية محددة مسبقًا ($ A $ 2) وقفل عنوانها بعلامة $:

    =RegExpExtract(A5, $A$2, 1)

    احصل على آخر رقم

    لاستخراج آخر رقم في سلسلة ، إليك النمط المراد استخدامه:

    النمط : (\ d +) (؟!. * \ d)

    مترجم إلى لغة بشرية ، تقول: اعثر على رقم لا يتبعه (في أي مكان ، وليس على الفور) بأي رقم آخر. للتعبير عن هذا ، نستخدم مظهرًا سلبيًا (؟!. * \ d) ، مما يعني أنه على يمين النمط لا يجب أن يكون هناك رقم آخر (\ d) بغض النظر عن عدد الأحرف الأخرى الموجودة قبله.

    =RegExpExtract(A5, "(\d+)(?!.*\d)")

    نصائح:

    • للحصول على تكرار محدد ، استخدم \ d + للنمط والتسلسل المناسبnumber لـ example_num .
    • تمت مناقشة الصيغة لاستخراج جميع الأرقام في المثال التالي.

    Regex لاستخراج جميع التطابقات

    0> example_num وسيطة. الافتراضي هو جميع التطابقات ، لذلك يمكنك ببساطة حذف هذه المعلمة:

    =RegExpExtract(A2, "\d+")

    تعمل الصيغة بشكل جميل لخلية واحدة ، لكن السلوك يختلف في Dynamic Array Excel والإصدارات غير الديناميكية.

    Excel 365 و Excel 2021

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

    Excel 2019 وأقل

    في Excel ما قبل الديناميكي ، سترجع الصيغة أعلاه تطابقًا واحدًا فقط. للحصول على مطابقات متعددة ، يجب أن تجعلها صيغة صفيف. لهذا ، حدد نطاقًا من الخلايا ، واكتب الصيغة ، واضغط على Ctrl + Shift + Enter لإكمالها.

    الجانب السلبي لهذا الأسلوب هو مجموعة من أخطاء # N / A تظهر في "خلايا إضافية" . للأسف ، لا يمكن فعل أي شيء حيال ذلك (لا يمكن لـ IFERROR ولا IFNA إصلاحه ، للأسف).

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

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

    =TEXTJOIN(", ", TRUE, RegExpExtract(A5, "\d+"))

    ملاحظة. نظرًا لأن الدالة TEXTJOIN متوفرة فقط في Excel for Microsoft 365 و Excel 2021 و Excel 2019 ، فلن تعمل الصيغة في الإصدارات الأقدم.

    Regex لاستخراج النص من السلسلة

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

    النمط : [^ \ d] +

    للحصول على سلاسل فرعية في الخلايا الفردية (نطاق الانسكاب) ، الصيغة هي:

    =RegExpExtract(A5, "[^\d]+")

    لإخراج جميع التطابقات في خلية واحدة ، قم بتداخل الدالة RegExpExtract في TEXTJOIN على النحو التالي:

    =TEXTJOIN("", TRUE, RegExpExtract(A5, "[^\d]+"))

    Regex to استخراج عنوان البريد الإلكتروني من سلسلة

    لسحب عنوان بريد إلكتروني من سلسلة تحتوي على الكثير من المعلومات المختلفة ، اكتب تعبيرًا عاديًا يكرر بنية عنوان البريد الإلكتروني.

    النمط : [\ w \. \ -] + @ [A-Za-z0-9 \. \ -] + \. [A-Za-z] {2،24}

    كسر هذا التعبير العادي ، إليك ما نحصل عليه:

    • [\ w \. \ -] + هو اسم مستخدم قد يتضمن حرفًا واحدًا أو أكثر من الأحرف الأبجدية الرقمية والشرطات السفلية والنقاط والواصلات.
    • @ الرمز
    • [A-Za-z0-9 \. \ -] + هو اسم مجال يتكون من: أحرف كبيرة وصغيرة وأرقام وواصلات ونقاط (في حالةمن المجالات الفرعية). لا يُسمح هنا بالشرطات السفلية ، لذلك يتم استخدام 3 مجموعات أحرف مختلفة (مثل A-Z a-z و0-9) بدلاً من \ w الذي يتطابق مع أي حرف أو رقم أو شرطة سفلية.
    • \. [A-Za-z ] {2،24} هو نطاق من المستوى الأعلى. يتكون من نقطة متبوعة بأحرف كبيرة وصغيرة. تتكون معظم نطاقات المستوى الأعلى من 3 أحرف (مثل .com .org و .edu وما إلى ذلك) ، ولكن نظريًا يمكن أن تحتوي على من 2 إلى 24 حرفًا (أطول نطاق TLD مسجل).

    بافتراض أن السلسلة موجودة في A5 والنمط الموجود في A2 ، فإن الصيغة لاستخراج عنوان بريد إلكتروني هي:

    =RegExpExtract(A5, $A$2)

    Regex لاستخراج المجال من البريد الإلكتروني

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

    Pattern : @ ([A-Za-z0 -9 \. \ -] + \. [A-Za-z] {2،24})

    قدمها إلى وظيفة RegExp الخاصة بنا:

    =RegExpExtract(A5, "@([A-Za-z0-9\.\-]+\.[A-Za-z]{2,24})")

    و ستحصل على هذه النتيجة:

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

    =REPLACE(RegExpExtract(A5, "@([a-z\d][a-z\d\-\.]*\.[a-z]{2,})", 1, FALSE), 1, 1, "")

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

    أرقام الهواتف يمكن كتابتها بعدة طرق مختلفة ، وهذا هو السبب في أنه من المستحيل التوصل إلى حل يعمل تحت الجميع(\ d {4}من السلسلة

    يعتمد التعبير العادي لاستخراج التاريخ على التنسيق الذي يظهر به التاريخ داخل السلسلة. على سبيل المثال:

    لاستخراج التواريخ مثل 1/1/21 أو 01/01/2021 ، فإن التعبير العادي هو: \ d {1،2} \ / \ d {1،2} \ / (\ d {4}ظروف. ومع ذلك ، يمكنك تدوين جميع التنسيقات المستخدمة في مجموعة البيانات الخاصة بك ومحاولة مطابقتها.

    في هذا المثال ، سنقوم بإنشاء regex يستخرج أرقام الهواتف بأي من هذه التنسيقات:

    (123) 345-6789

    (123) 345 6789

    (123) 3456789

    123- 345-6789

    123.345.6789

    123345 6789

    1233456789

    النمط : \ (؟ \ d {3} [- \. \)] * \ d {3} [- \. ]؟ \ d {4} \ b

    • الجزء الأول \ (؟ \ d {3} يطابق صفرًا أو قوس فتح واحد متبوعًا بثلاثة أرقام d {3}.
    • الجزء [- \. \)] * يعني أي حرف بين قوسين مربعين يظهر 0 أو أكثر من المرات: واصلة أو نقطة أو مسافة أو قوس إغلاق.
    • بعد ذلك ، لدينا ثلاثة أرقام مرة أخرى d {3} متبوعة بـ أي واصلة أو نقطة أو مسافة [- \. ]؟ تظهر 0 أو 1 مرة.
    • بعد ذلك ، هناك مجموعة من أربعة أرقام \ d {4}.
    • أخيرًا ، هناك حد لكلمة \ b يحدد رقم الهاتف نحن لا يمكن أن يكون البحث عن جزء من رقم أكبر.

    تأخذ الصيغة الكاملة هذا الشكل:

    =RegExpExtract(A5, "\(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b")

    يرجى الانتباه إلى أن التعبير المعتاد أعلاه قد يعرض القليل نتائج إيجابية كاذبة مثل 123) 456 7899 أو (123 456 7899. الإصدار أدناه يصلح هذه المشكلات. ومع ذلك ، فإن بناء الجملة هذا يعمل فقط في وظائف VBA RegExp ، وليس في التعبيرات العادية الكلاسيكية.

    النمط : (\ (\ d {3} \)ستعمل أيضًا على سحب النص بين حرفين لاستخراج النص بين سلسلتين.

    على سبيل المثال ، للحصول على كل شيء بين "الاختبار 1" و "الاختبار 2" ، استخدم التعبير العادي التالي.

    النمط : test 1 (. *؟) test 2

    الصيغة الكاملة هي:

    =AblebitsRegexExtract(A5, "test 1(.*?)test 2")

    Regex لاستخراج المجال من URL

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

    للحصول على اسم المجال الكامل بما في ذلك المجالات الفرعية

    النمط : (؟: https؟ \:

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