مستندات HotXLS

نهج التحقق من صحة إدخال الصيغة

تكشف واجهتا Classic XLS وXLSX عن العقد نفسه الخالي من الآثار الجانبية لتصنيف مدخلات الصيغة قبل أن يغيّر المتصل خلية ما

النهج المشترك

TXLSFormulaEmptyStringMode =
  (xlfesmClearCell, xlfesmPreserveString);
TXLSFormulaUnknownSymbolMode =
  (xlfusmReject, xlfusmPreserve);

TXLSFormulaEntryPolicy = record
  EmptyStringMode: TXLSFormulaEmptyStringMode;
  UnknownFunctionMode: TXLSFormulaUnknownSymbolMode;
  UnknownNameMode: TXLSFormulaUnknownSymbolMode;
end;

property FormulaEntryPolicy: TXLSFormulaEntryPolicy;
تكشف واجهتا Classic‏ IXLSWorkbook و TXLSWorkbook عن الخاصية معًا مع TXLSXWorkbook؛ ويعمل XLSDefaultFormulaEntryPolicy على إفراغ المدخل الفارغ ورفض الدوال غير المعروفة والأسماء المعرَّفة غير المعروفة
تُنسخ خاصية المصنف بالقيمة ويُتحقق منها ذرّيًا عند الإسناد، بحيث ترفع قيم التعداد غير المدعومة الاستثناء EArgumentOutOfRangeException دون تغيير النهج السابق

نتيجة التحقق

function ValidateFormulaEntry(Row, Col: Integer;
  const Formula: WideString): TXLSFormulaEntryValidationResult;

TXLSFormulaEntryValidationResult = record
  Issue: TXLSFormulaEntryIssue;
  Action: TXLSFormulaEntryAction;
  Symbol: WideString;
end;
Issue بين غياب الخطأ، والدالة غير المعروفة، والاسم غير المعروف، وخطأ الصياغة، وقيود التنسيق الهدف، والإحداثيات الهدف غير الصالحة
Action بين إفراغ الخلية أو تخزين السلسلة أو تخزين الصيغة أو الرفض، بينما يحدد Symbol دالة أو اسمًا غير معروفين عند التعرّف على أحدهما

النص الفارغ والصيغ

يعيد المدخل الفارغ تمامًا xlfeaClearCell أو xlfeaStoreString وفقًا لقيمة EmptyStringMode
تبقى الصيغة التي تعيد سلسلة فارغة، مثل =""، صيغة وتعيد xlfeaStoreFormula عندما يستطيع التنسيق الهدف تمثيلها
قد يتضمن نص الصيغة علامة يساوية واحدة في البداية أو يستغني عنها
يؤدي إسناد سلسلة فارغة تمامًا عبر الخاصية العادية Value للخلية في Classic XLS أو XLSX إلى تطبيق هذا الوضع مباشرةً الآن: فالافتراضي يزيل أي قيمة أو صيغة موجودة، بينما يستبدل xlfesmPreserveString محتوى الخلية بسلسلة ثابتة طولها صفر
Null و Unassigned دائمًا إلى إفراغ الخلية في كلا الوضعين، بينما تبقى الصيغة الحقيقية مثل ="" صيغة ذات نتيجة سلسلة فارغة تُخزَّن أو تُحسب باستقلالية
تطبّق كاتبات صفوف أو أعمدة XLSX للنصوص وقيم Variant القاعدة نفسها دون تحويل المواضع المفرَّغة إلى كيانات فعلية، وتحتفظ بالتخزين المعبأ ما دامت القيم المتبقية قابلة للتمثيل فيه
تعالج القارئات الأصلية للصيغ XLS وXLSX وODS والمحوّلات XLS-to-XLSX أو XLSX-to-XLS القيم المخزنة بوصفها مدخلات موثوقة، لذا فإن السلسلة الفارغة الثابتة على مستوى الملف تنجو حتى عندما يحافظ المصنف الوجهة على نهج إدخال المستخدم الافتراضي

الرموز غير المعروفة والتنسيقات الهدف

تُعدّ دوال المستخدم المسجلة على مستوى المصنف أو العملية والاستدعاءات الردية المعيَّنة OnUserFunction أو OnUserFunctionEx معروفةً أثناء التحقق دون استدعاء أي معالج، بينما تحتفظ الاستدعاءات غير المسجلة باسم دالتها في Symbol
يعيد الوضع الصارم xlfeaReject للدوال أو الأسماء غير المعروفة؛ ويؤدي الإسناد عبر الخاصية العادية Formula للخلية إلى الرفض قبل تغيير القيمة أو ذاكرة الصيغ المؤقتة أو التبعيات
يحتفظ وضع الحفظ بالتشخيص ويخزن الصيغة عبر واجهة الخلية العادية؛ ويسلسل Classic XLS الاستدعاء غير المعروف عبر رموز BIFF لدوال المستخدم في الوظائف الإضافية، ويحتفظ بنص الاسم غير المعروف عبر الحفظ وإعادة الفتح والتحويل بين XLS/XLSX
يجمع Classic XLS إضافةً إلى ذلك الصيغ المعروفة عبر كاتب BIFF ويعيد xlfeiTargetFormatUnsupported عندما يتعذر تمثيل التعبير، بينما تقبل XLSX دوال الصيغ الحديثة المعروفة التي يدعمها نموذج صيغها
يتعرّف التحقق في XLSX على LAMBDA، والعناصر القابلة للاستدعاء المعجمية LET ، والأسماء المعرَّفة التي تشير إلى تعبيرات lambda، والعناصر النائبة للتقارير، والارتباطات الخارجية المسجلة للمصنفات، والمراجع الهيكلية المؤهلة أو غير المؤهلة الصالحة، بما في ذلك الصيغ المتداخلة وصيغ الصف الحالي
يمكن لوضع التوافق أيضًا الاحتفاظ بالمراجع الهيكلية الخارجية غير المحلولة للمعالجة اللاحقة، بينما لا يزال الوضع الصارم يرفض أسماء الجداول غير المحلولة

الحساب والتدقيق الشامل

تُقيَّم الدالة غير المعروفة المحفوظة التي تبقى دون معالجة بعد الإرسال إلى تعبيرات lambda ودوال المستخدم، أو الاسم غير المعروف المحفوظ، بوصفها خطأ Variant بالرمز $1D، أي خطأ #NAME? في Excel؛ وينتشر الخطأ المنمّط نفسه عبر الصيغ التابعة والتقييم السياقي
تبقى الدوال المدمجة المعروفة غير المنفَّذة متميزة عن الاستدعاء غير المعروف، بينما يؤدي تسجيل دالة مستخدم على مستوى المصنف أو العملية أو استبدالها أو إزالتها أو إفراغها، وتغيير صيغة اسم معرَّف، إلى إبطال حالة التبعيات والحساب القديمة
function AuditFormulaSymbols: TXLSFormulaSymbolIssues; overload;
function AuditFormulaSymbols(
  out AStats: TXLSFormulaSymbolAuditStats):
  TXLSFormulaSymbolIssues; overload;

TXLSFormulaSymbolIssueKind = (xlfsiUnknownFunction, xlfsiUnknownName,
  xlfsiSyntaxError);
TXLSFormulaSymbolLocationKind = (xlfslCell, xlfslDefinedName);

TXLSFormulaSymbolIssue = record
  Kind: TXLSFormulaSymbolIssueKind;
  LocationKind: TXLSFormulaSymbolLocationKind;
  Sheet: Integer;
  Row: Integer;
  Col: Integer;
  DefinedNameIndex: Integer;
  DefinedName: WideString;
  Formula: WideString;
  Symbol: WideString;
end;
TXLSWorkbook and TXLSXWorkbook يوفرLocationKind = xlfslCellوLocationKind = xlfslDefinedNameالأحمال الزائدة نفسها للتدقيق الشامل؛ ويحدد كل إشكال دالة غير معروفة أو اسمًا غير معروف أو خطأ صياغة مع موقع خلية في ورقة عمل أو موقع اسم معرَّف، والصيغة المصدر، والرمز غير المحلول
يجتاز التدقيق أشجار الصيغ المُحلَّلة أو رموز BIFF المخزنة بدلًا من مسح النص، لذا لا يُبلَّغ عن النص الشبيه بالدوال داخل سلسلة؛ وتستخدم ترجمة XLSX ذاكرة مؤقتة محلية للعملية تستخدم مفاتيح تشمل نص الصيغة المحلول، وورقة العمل، والإعدادات المحلية، وجيل الأسماء المعرَّفة، وأجيال سجل دوال المستخدم، وتوافر الاستدعاءات الردية
EntryCount عن الصيغ المدققة، ويبلّغ UniqueFormulaCount عن الصيغ المترجمة أو المدققة باستقلالية، ويبلّغ CacheHitCount عن الإدخالات المتكررة التي خدِمتها الذاكرة المؤقتة للعملية

لا تغيير في ورقة العمل

لا ينشئ التحقق خلية ولا يحررها، ولا يغيّر القيم المخزنة مؤقتًا، ولا يحدّث مخطط التبعيات، ولا يعلّم المصنف بأنه مُعدَّل، ولا يستدعي معالج دوال مستخدم مسجلًا
يبقى التحقق المباشر خاليًا من التغييرات؛ ويطبّق الإسناد العادي للصيغة القرار نفسه داخليًا ولا يُنفَّذ إلا بعد نجاح التحقق وتجهيز التنسيق الهدف

مثال بلغة Delphi

Policy := Workbook.FormulaEntryPolicy;
Policy.UnknownFunctionMode := xlfusmReject;
Policy.UnknownNameMode := xlfusmReject;
Workbook.FormulaEntryPolicy := Policy;

Validation := Sheet.ValidateFormulaEntry(4, 2, FormulaText);
if Validation.Action = xlfeaStoreFormula then
  Sheet.Cells[4, 2].Formula := FormulaText;

Issues := Workbook.AuditFormulaSymbols(Stats);
for I := 0 to High(Issues) do
  if Issues[I].Kind = xlfsiUnknownFunction then
    LogUnknownSymbol(Issues[I].Symbol);

انظر أيضًا

تقييم الصيغ السياقي
محرك حسابات Excel
أعضاء واجهة برمجة تطبيقات XLS الكلاسيكية الإضافية
أعضاء واجهة برمجة تطبيقات XLSX المتقدمة