يضبط HotXLS مراجع الصيغ تلقائياً عندما تقوم بإدراج أو حذف الصفوف أو الأعمدة في ورقة عمل XLSX. تعيد أساليب المحرك InsertRows، وDeleteRows, وInsertCols، وDeleteCols كتابة كل صيغة باقية بحيث تستمر مراجع A1 الخاصة بها — النسبية، والمطلقة، والنطاق — في الإشارة إلى البيانات نفسها بعد التعديل الهيكلي، وتصبح المراجع المؤدية إلى كتلة محذوفة هي #REF!، مما يطابق سلوك Excel
الخلل الذي يمنعه هذا هو أحد أكثر الأخطاء هدوءاً في توليد التقارير. يكتب المولد أرقاماً يومية في C2:C9 مع =SUM(C2:C9) تحتها، ثم تقوم خطوة لاحقة بإدراج صف رأس في الأعلى. وإذا كان المحرك ينقل قيم الخلايا فقط ويترك نص الصيغة كما هو، فستظل دالة SUM تقرأ C2:C9 بينما تعيش البيانات الآن في C3:C10 — وبالتالي يسقط الإجمالي بصمت اليوم الأخير ويحسب الرأس مرتين. لا يثير أي شيء استثناءً، ويفتح الملف بشكل جيد، والرقم ببساطة خاطئ. قبل الإصدار 2.160، ترك محرك HotXLS XLSX الصيغ دون تغيير أثناء التعديلات الهيكلية؛ ومنذ الإصدار 2.160 أصبحت إعادة الكتابة تلقائية ولا توجد علامة لتعيينها
ماذا يحدث للصيغ عندما تقوم بإدراج صف في Excel؟
قاعدة Excel هي أن المراجع تتبع البيانات، وليس العناوين. عند إدراج صف، فإن كل مرجع يقع فهرس صفه عند نقطة الإدراج أو أسفلها يتحرك لأسفل بمقدار عدد الصفوف المدرجة؛ بينما تظل المراجع التي تقع بالكامل فوق نقطة الإدراج دون تغيير. تشغيل حذف الصفوف يتبع نفس القاعدة بشكل عكسي: تنزلق المراجع الموجودة أسفل الكتلة المحذوفة للأعلى، وتصبح المراجع المؤدية إلى الكتلة المحذوفة نفسها #REF! لأن الخلايا التي سميت لم تعد موجودة. وتتصرف الأعمدة بشكل متطابق على المحور الآخر. يتعين على مكتبة جداول البيانات التي تريد أن تنجو مخرجاتها من مواجهة مستخدمي Excel إعادة إنتاج هذه الآليات بدقة، لأن المستخدمين يفكرون في صيغهم بهذه المصطلحات دون التفكير في الأمر على الإطلاق
الجزء الذي يفاجئ المطورين هو أن المراجع المطلقة تتحرك أيضاً. تتحكم علامات المراسي $ في $B$2 في ما يحدث عندما يتم نسخ الصيغة أو ملؤها في خلية أخرى — فهي لا تفعل شيئاً أثناء التعديلات الهيكلية. قم بإدراج صف فوق الصف 2 وسيقوم Excel بإعادة كتابة $B$2 إلى $B$3، مع بقاء علامات الدولار سليمة، لأن القيمة التي تعتمد عليها الصيغة انتقلت مادياً إلى الصف 3. إن المحرك الذي يزيح المراجع النسبية فقط سيفسد بالضبط الصيغ التي يرسخها الأشخاص بشكل أكثر تعمداً. يقوم HotXLS بإزاحة كلا الشكلين ويحافظ على علامات $ في النص المعاد كتابته
كيف يقوم HotXLS بإزاحة مراجع الصيغ تلقائياً؟
تفوض جميع أساليب التعديل الهيكلي الأربعة في TXLSXWorksheet geometry engine واحداً: ShiftSheetGeometry(RowFrom, RowDelta, ColFrom, ColDelta). تستدعي InsertRows(BeforeRow, Count) هذا المحرك بديلتا صف موجبة، وDeleteRows(StartRow, Count) بديلتا سالبة، وتقوم أساليب الأعمدة بالشيء نفسه على محور الأعمدة. يعيد الإجراء أولاً تحديد موقع الخلايا نفسها — مسقطاً أي خلية تقع داخل كتلة محذوفة — ثم يمر عبر كل خلية صيغة باقية ويمرر نصها عبر XlsxAdjustFormulaRowColRefs، وهو ماسح يجد مراجع نمط A1 ويعيد كتابة مكونات صفوفها وأعمدتها مقابل الإزاحة. وتقوم التمريرة نفسها بإعادة تحديد موقع النطاقات المدمجة، والارتباطات التشعبية، والتعليقات، والصور، والمخططات، والتنسيقات الشرطية، والتحقق من صحة البيانات، ونطاقات الجداول، بحيث تتحرك الورقة بأكملها كوحدة واحدة
// Layout before the edit:
// C2..C9 daily figures
// C10 =SUM(C2:C9)
Sheet.InsertRows(2, 1); // one blank row before row 2
// Layout after the call:
// C3..C10 daily figures
// C11 =SUM(C3:C10) -- the range moved with the data
يجدر معرفة بعض تفاصيل الماسح. يتعرف XlsxAdjustFormulaRowColRefs على مراجع الخلايا المفردة في جميع أشكال المراسي الأربعة (A1، و$A1، وA$1، و$A$1) والنطاقات ذات الركنين مثل A1:B3، معدلاً كل نقطة نهاية بشكل مستقل. الصيغ التي يبدأ نصها بالفعل بـ # — وهي علامة خطأ من تعديل سابق — يتم تخطيها بدلاً من إعادة مسحها. وتضيف InsertCols ميزة لطيفة خاصة بـ Excel: ترث الأعمدة المدرجة حديثاً عرض جارتها اليسرى، وهو ما يفعله أمر إدراج أعمدة الورقة في Excel
متى يصبح المرجع المحذوف #REF!؟
تتضمن قاعدة الإزاحة لفهرس صف أو عمود فردي ثلاث نتائج. لا يتغير الفهرس الذي يقع قبل نقطة التعديل. ويتحرك الفهرس الذي يقع عند نقطة التعديل أو بعدها بمقدار الدلتا. وتحت الحذف، لا يكون للفهرس الذي يقع داخل الكتلة المحذوفة أي قيمة جديدة مفيدة — فالخلية قد ذهبت — لذا يعيد الماسح كتابة المرجع بأكمله كـ #REF!. بالنسبة لمرجع النطاق، يتم تشغيل كلا نقطتي النهاية من خلال نفس القاعدة، وإذا هبطت أي من نقطتي النهاية داخل الكتلة المحذوفة، يتم إعادة كتابة المرجع كـ #REF! بدلاً من تركه نصف صالح
// A12 holds =A4+A6+A10
Sheet.DeleteRows(5, 3); // delete rows 5..7
// The formula, now in A9, reads =A4+#REF!+A7
// A4 : above the deleted block, unchanged
// A6 : inside rows 5..7, gone -> #REF!
// A10 : below the block, slides up -> A7
إن إنتاج #REF! صارخ بدلاً من إعادة التوجيه بصمت هو المقايضة الصحيحة، وهي المقايضة التي يقوم بها Excel. فالصيغة التي تشير إلى خلية مجاورة بعد حذف إدخالها الحقيقي ستعطي رقماً يبدو معقولاً؛ وينتشر #REF! عبر الصيغ التابعة ويظهر في أول اختبار دخان. وينطبق نفس التحويل على محور الأعمدة
// E1 holds =B1*$C$1
Sheet.DeleteCols(3, 1); // remove column C
// The formula, now in D1, reads =B1*#REF!
// The absolute anchor did not protect $C$1 -- the cell itself is gone
ما هي أشكال المراجع التي لا يتم إعادة كتابتها؟
يستهدف الماسح مراجع A1 في نفس الورقة ذات الشكل الصريح لـ حرف العمود زائد رقم الصف، ويجدر بالذكر دقة ما يقع خارج ذلك. تفتقر مراجع الأعمدة الكاملة مثل A:A ومراجع الصفوف الكاملة مثل 1:1 إلى أحد المكونين، لذا يتركها الماسح كما هي مكتوبة. وتمر مراجع الجداول المنظمة (Table1[Amount]) بالمثل دون تغيير. وتعمل إعادة الكتابة أيضاً بدقة على ترميز A1 — فإذا كان كودك يبني الصيغ بأسلوب R1C1، فحولها إلى A1 قبل التعديل الهيكلي, كما هو موضح في المقالة المصاحبة حول ترميز صيغ R1C1 في دلفي
يتم التعامل مع الهياكل عبر الأوراق وعلى مستوى مصنف العمل بواسطة تمريرات منفصلة بدلاً من ماسح نص الخلية. بعد تعديل الورقة المحررة، تقوم ShiftSheetGeometry بنشر نفس التغيير الهندسي إلى الصيغ الموجودة في الأوراق الأخرى التي تشير إلى الورقة المحررة، وإلى نطاقات سلسلة المخططات، وأهداف الارتباطات التشعبية الداخلية، والأسماء المحددة. وتحصل الأسماء المحددة على حماية إضافية على مستوى دورة حياة الورقة: فمنذ الإصدار 2.150، يؤدي حذف ورقة عمل إلى إعادة كتابة كل مؤهل SheetN! داخل صيغة الاسم المحدد إلى #REF!، ويؤدي إعادة تسمية الورقة إلى إعادة كتابة المؤهل إلى الاسم الجديد، بحيث لا تشير الأسماء أبداً إلى ورقة لم تعد موجودة. ويتم تغطية كيفية تناسب الأسماء والصيغ عبر الأوراق معاً في المقالة الخاصة بالأسماء المحددة والصيغ عبر الأوراق
أعد الحساب بعد الإزاحة
تعديل المراجع يعيد كتابة نص الصيغة؛ وهو لا يعيد حساب النتائج. بعد التعديل الهيكلي، تصف القيم المخزنة مؤقتاً بجانب الصيغ الهندسة القديمة، لذا فإن التسلسل الموثوق به هو: قم بجميع عمليات الإدراج والحذف أولاً، ثم قم ببدء إعادة الحساب مرة واحدة، ثم احفظ. تشغيل الإزاحة قبل إعادة الحساب يحافظ أيضاً على أمان معلومات التبعية — فكل مرجع معاد كتابته يسمي سابقه الحقيقي، وهو بالضبط ما يحتاجه محرك إعادة الحساب التدريجي ورسم التبعية الخاص به لإعادة حساب الحد الأدنى من الخلايا المتأثرة. وإذا كانت الصيغة المعاد كتابتها تحتوي الآن على #REF!، فإن إعادة الحساب تظهر قيمة الخطأ على الفور بدلاً من ترك رقم قديم في الملف
يُشحن تعديل مراجع الصيغ كسلوك قياسي لمحرك XLSX في مكون HotXLS Delphi Excel Component لدلفي وC++Builder؛ وتتميز صفحة المنتج بمرجع واجهة برمجة تطبيقات تحرير أوراق العمل الكامل، بما في ذلك أساليب الإدراج والحذف الموضحة هنا