أحياناً أحب تبنّي أسلوب عملي أبسط، وهنا أشارك خطوة بخطوة أثبتت معي في تقارير العمل: أولاً أضع نسخة من العمود الأصلي ثم أطبق صيغة تحويل واحدة لتفادي فقدان البيانات الأصلية.
أكتب في الخلية المجاورة: =SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A2,"0","٠"),"1","١"),"2","٢"),"3","٣"),"4","٤"),"5","٥"),"6","٦"),"7","٧"),"8","٨"),"9","٩"). بعد ذلك أملأ الصيغة للأسفل (سحب الزاوية). إذا أردت تحويل الأعمدة كلها لقيم ثابتة، أنسخ العمود الناتج ثم الصق قيم (Paste Special > Values) فوق نفسه.
إذا كنت مريحاً بالبرمجة داخل الإكسل أفضل حل للدفعات هو دالة مخصصة (UDF) بلغة VBA تسمح لي بكتابة =ToArabicIndic(A2) مباشرة. هذه الدوال تسهل الصيانة عندما أحتاج نفس العملية في ملفات مختلفة. أما إذا كنت تفضّل بيئة تحويل رسومياً، أفتح 'Power Query' وأستخدم Replace Values أو أكتب M code بسيط لاستبدال كل رقم برمزه العربي-الهندي؛ هذا ممتاز للبيانات المستوردة بشكل متكرر.
خلاصة سريعة: للصغير والسريع استعمل SUBSTITUTE المتداخل، للدفعات أو التكرار استعمل ماكرو VBA أو دالة مخصصة، وللتنظيف المنتظم استخدم 'Power Query'. أحب أن أحتفظ بنسخة أصلية من البيانات دائماً قبل أي تحويل.
أكره أن أضطر لتمرير العين عبر جدول مليان أرقام مكتوبة بنمطين مختلفين، لذلك تعمّقت في حلول عملية لتحويل الأرقام للعربية تلقائياً داخل الإكسل. أول شيء توضيحي: هل تريد الأرقام بالعربية-الهندية (٠١٢٣…) أم تحويل الأرقام إلى نص عربي مكتوب بالكلمات؟ سأركز هنا على تحويل الأرقام إلى الأرقام العربية-الهندية (التي نراها في الصفحات العربية)، مع تلميحات لخيارات أخرى.
الطريقة الأسهل لو أردت تحويل خلية أو عمود كلها من الأرقام الغربية إلى العربية-الهندية دون تعقيد هي استخدام دالة SUBSTITUTE المتداخلة. مثال: =SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"0","٠"),"1","١"),"2","٢"),"3","٣"),"4","٤"),"5","٥"),"6","٦"),"7","٧"),"8","٨"),"9","٩"). ألصق الصيغة في عمود جديد وجرِّها للأسفل.
لو كنت أتعامل مع نطاق كبير أو أحتاج قابلية إعادة الاستخدام أكثر، كتبت ماكرو بسيط بصيغة VBA يستبدل الأرقام داخل الخلايا المحددة بشكل أسرع. ضع هذا في وحدة نمطية في المحرّر:
Sub ConvertToArabicIndic
Dim rng As Range, c As Range, i As Integer
Dim repl As Variant
repl = Array(ChrW(&H0660), ChrW(&H0661), ChrW(&H0662), ChrW(&H0663), ChrW(&H0664), ChrW(&H0665), ChrW(&H0666), ChrW(&H0667), ChrW(&H0668), ChrW(&H0669))
On Error Resume Next
Set rng = Application.Selection
For Each c In rng
If Not c.HasFormula Then
For i = 0 To 9
c.Value = Replace(c.Value, CStr(i), repl(i))
Next i
End If
Next c
End Sub
وإذا أردت نهجاً قوياً لا ينكسر مع التنسيقات، أستخدم 'Power Query' لتحويل النص عن طريق سلسلة من عمليات الاستبدال أو M code بسيط. أيضاً على مستوى النظام، تغيير إعدادات المنطقة في ويندوز إلى العربية وتفعيل 'Use native digits' يجعل الأرقام تظهر بالعربية تلقائياً في بعض النسخ من الإكسل، لكن هذا يعتمد على إصدار الإكسل ونظام التشغيل. ختاماً، أحب استخدام الماكرو عندما أحتاج تحويل دفعة كبيرة، أما صيغة SUBSTITUTE فهي سريعة ومباشرة للتعديلات السريعة والنسخ الاحتياطي للأصلية.
أحب الحلول المختصرة والعملية: إذا أردت تحويل الأرقام الغربية إلى أرقام عربية-هندية بسرعة داخل خلية واحدة، أستخدم دالة SUBSTITUTE متداخلة لأنها تعمل بدون إعدادات نظامية أو صلاحيات ماكرو. الصيغة تبدو طويلة لكنها مباشرة وتؤمن تحويلاً فورياً.
للبيئات المنظمة أو عندما أكرر العملية باستمرار أفضّل ماكرو صغير يقوم باستبدال كل رقم داخل النطاق المختار باستخدام CharW للرموز العربية-الهندية (U+0660 إلى U+0669). تنفيذ الماكرو أسرع من الصيغ على ملفات كبيرة، كما أنه يترك التنسيق الرقمي كما هو، فقط يغيّر هذا الرمز المرئي.
وبالنسبة لمن يريد الحل على مستوى النظام، يمكن تجربة تغيير إعدادات المنطقة في ويندوز إلى العربية وتفعيل الأرقام المحلية، لكن هذا يعتمد على نسخة الإكسل وقد لا يعمل دائماً. في النهاية أجد أن الجمع بين نسخة احتياطية، صيغة SUBSTITUTE للتجارب، وماكرو للدفعات هو توازن عملي جيد يؤدي إلى جداول أنظف وأقل فوضى.