คลาส TXLSFormulaDebugger
TXLSFormulaDebugger วิเคราะห์สูตรในบริบทเวิร์กชีต XLSX หนึ่งตัวและคืน TXLSFormulaDebugSession ที่เป็นของผู้เรียก
เซสชันรวมต้นไม้ไวยากรณ์ที่แยกวิเคราะห์ที่สมบูรณ์เข้ากับลำดับการประเมินจริง, ค่ากลาง, พิกัดการพึ่งพา, กิ่งขี้เกียจที่เลือก, นิพจน์ที่ข้าม และต้นกำเนิดข้อผิดพลาดแรก
ผู้เรียกเป็นเจ้าของและต้องปลดปล่อยทุกเซสชันที่คืนโดย Analyze
การประกาศ
type
TXLSFormulaDebugger = class
constructor Create(Worksheet: TXLSXWorksheet);
function Analyze(const Formula: WideString):
TXLSFormulaDebugSession;
end;
สมาชิกของเซสชัน
| Formula | ซอร์สที่ทำให้เป็นมาตรฐานโดยไม่มีเครื่องหมายเท่ากับนำหน้าแบบไม่บังคับ |
| FinalValue | ค่าสเกลาร์ที่คำนวณได้หรือข้อผิดพลาดสูตร Variant มาตรฐาน |
| Nodes | โหนดที่แยกวิเคราะห์ตามลำดับ parent ก่อน child |
| Dependencies | การพึ่งพาเซลล์, ช่วง หรือชื่อที่กำหนดพร้อมพิกัดเวิร์กชีตที่แก้ไขแล้วเมื่อมี |
| StepNodes | โหนดตามลำดับการประเมินที่กำหนดไว้ รวมถึงโหนดที่ข้าม |
| CurrentNode | โหนดที่เลือกโดยเคอร์เซอร์การนำทางเชิงโต้ตอบ |
| ErrorOriginNodeId | โหนดที่ลึกที่สุดที่ก่อให้เกิดข้อผิดพลาดสูตรสุดท้าย หรือ -1 เมื่อผลลัพธ์สุดท้ายไม่ใช่ข้อผิดพลาด |
| ErrorCode | รหัสข้อผิดพลาดของ Excel ที่นำติดตัวโดยค่าข้อผิดพลาดสุดท้าย |
| ErrorText | ข้อความแสดงผลของ Excel เช่น #DIV/0! หรือ #N/A |
การวินิจฉัยโหนด
แต่ละ TXLSFormulaDebugNode รายงาน parent, ความลึก, ช่วงซอร์ส, ชนิดโหนด, ชื่อตัวดำเนินการหรือฟังก์ชัน, ตัวระบุโหนดตัวถูกดำเนินการ, ค่าตัวถูกดำเนินการ, ค่าผลลัพธ์, ดัชนีการประเมิน, สถานะ, กิ่งที่เลือก และรายละเอียดข้อผิดพลาด
สถานะโหนดคือ fdsPending, fdsEvaluated, fdsSkipped หรือ fdsError
การวินิจฉัยกิ่งแยกแยะเส้นทาง IF จริงและเท็จ, เส้นทาง IFERROR หรือ IFNA แบบค่าและแบบย้อนกลับ และกิ่ง CHOOSE, IFS หรือ SWITCH ที่เลือก
ข้อผิดพลาดภายในที่กู้คืนยังคงมองเห็นได้บนโหนดของมันแม้เมื่อผลลัพธ์สูตรสุดท้ายถูกต้อง
การนำทาง
MoveFirstเลือกขั้นตอนการประเมินแรกMoveNextและMovePreviousย้ายเคอร์เซอร์ปัจจุบันโดยไม่คำนวณใหม่SeekNodeเลือกหนึ่งโหนดตามตัวระบุเฉพาะเซสชันที่เสถียรของมันResetล้างเคอร์เซอร์ในขณะที่รักษาการวินิจฉัยทั้งหมดไว้
ตัวอย่าง
Debugger := TXLSFormulaDebugger.Create(Sheet);
try
Session := Debugger.Analyze('=IF(A1=0,42,B1/C1)');
try
if Session.MoveFirst then
repeat
Writeln(Session.CurrentNode.Source);
until not Session.MoveNext;
finally
Session.Free;
end;
finally
Debugger.Free;
end;