Thep Excel

Expression.Evaluate – ประเมินผลนิพจน์ M แบบไดนามิก

Expression.Evaluate ใช้สำหรับประเมินผลนิพจน์ M ที่เก็บไว้เป็นข้อความ โดยสามารถระบุตัวแปรและฟังก์ชันที่ใช้ได้ในสภาพแวดล้อม ทำให้สามารถเขียนโค้ด M แบบไดนามิก

=Expression.Evaluate(document as text, optional environment as nullable record) as any

By ThepExcel AI Agent
12 December 2025

Function Metrics


Popularity
4/10

Difficulty
9/10

Usefulness
6/10

Syntax & Arguments

=Expression.Evaluate(document as text, optional environment as nullable record) as any

Argument Type Required Default Description
document text Yes นิพจน์ M ที่เก็บไว้เป็นข้อความสตริง ต้องเป็นโค้ด M ที่ถูกต้องตามไวยากรณ์
environment record Optional null record ที่ประกอบด้วยตัวแปรและฟังก์ชันที่ต้องการให้เข้าถึงได้ในนิพจน์ (เช่น [x = 5, y = 10] หรือ #shared สำหรับสภาพแวดล้อมทั่วโลก)

Examples

ตัวอย่างที่ 1: การคำนวณแบบง่าย
Expression.Evaluate("1 + 1")
ประเมินผลการบวกแบบง่าย โดยไม่ต้องมีสภาพแวดล้อม ผลลัพธ์คือเลข 2
Power Query Formula:

= Expression.Evaluate("1 + 1")

Result:

2

ตัวอย่างที่ 2: ใช้ตัวแปรจาก environment
Expression.Evaluate("x + y", [x = 17, y = 25])
ส่งตัวแปร x และ y ผ่าน environment record เพื่อใช้ในนิพจน์ ผลลัพธ์คือ 42
Power Query Formula:

= Expression.Evaluate("x + y", [x = 17, y = 25])

Result:

42

ตัวอย่างที่ 3: เรียกใช้ฟังก์ชัน List.Sum
Expression.Evaluate("List.Sum({1, 2, 3})", [List.Sum = List.Sum])
ถ้าไม่ส่ง List.Sum ในสภาพแวดล้อม จะเกิดข้อผิดพลาด 'List.Sum' doesn't exist ต้องใส่ [List.Sum = List.Sum] เพื่อให้ฟังก์ชันสามารถใช้ได้
Power Query Formula:

= Expression.Evaluate("List.Sum({1, 2, 3})", [List.Sum = List.Sum])

Result:

6

ตัวอย่างที่ 4: ใช้ #shared สำหรับสภาพแวดล้อมทั่วโลก
Expression.Evaluate("List.Sum({5, 10, 15})", #shared)
#shared ให้เข้าถึงฟังก์ชัน Power Query ทั้งหมด (global environment) ทำให้ไม่ต้องเขียน [List.Sum = List.Sum] ซ้ำ
Power Query Formula:

= Expression.Evaluate("List.Sum({5, 10, 15})", #shared)

Result:

30

ตัวอย่างที่ 5: let expression แบบไดนามิก
Expression.Evaluate("let a=3, b=4, c=a*b in c")
ประเมินผล let…in expression ที่เก็บไว้เป็นข้อความ ผลลัพธ์คือ 12 (3 * 4) ทำให้สามารถสร้างโค้ด M ที่มีการประกาศตัวแปรแบบไดนามิก
Power Query Formula:

= Expression.Evaluate("let a=3, b=4, c=a*b in c")

Result:

12

ตัวอย่างที่ 6: สตริงต่อเนื่องกัน
Expression.Evaluate( Expression.Constant("abc") & " & " & Expression.Identifier("x"), [x = "def"] )
ใช้ Expression.Constant() เพื่อแปลงค่าเป็นโค้ด M และ Expression.Identifier() สำหรับตัวแปร จากนั้นต่อเข้าด้วยกัน ผลลัพธ์คือสตริง "abcdef"
Power Query Formula:

= Expression.Evaluate(
    Expression.Constant("abc") & " & " & Expression.Identifier("x"), 
    [x = "def"]
  )

Result:

"abcdef"

FAQs

Expression.Evaluate ต้องใช้ environment parameter เสมอหรือ

ไม่จำเป็น ถ้านิพจน์ไม่มีการอ้างอิงตัวแปรหรือฟังก์ชันใดๆ สามารถไม่ส่ง environment ได้ เช่น Expression.Evaluate(“1 + 1”) ใช้ได้เลย แต่ถ้ามีการอ้างอิงฟังก์ชัน เช่น List.Sum ต้องใส่ในสภาพแวดล้อมหรือใช้ #shared

#shared และ record ที่ส่งเป็น environment ต่างกันอย่างไร

#shared ให้เข้าถึงฟังก์ชันและตัวแปรทั่วโลกของ Power Query ส่วน record ที่ส่งเป็น environment มีแต่สิ่งที่ระบุเท่านั้น ถ้าต้องใช้ฟังก์ชัน List.Sum ด้วย ต้องใส่ [List.Sum = List.Sum] ในการส่ง record

สามารถใช้ Expression.Evaluate ในแต่ละแถวของตาราง (row context) ได้หรือ

ได้ แต่ต้องระวังเรื่องประสิทธิภาพ การประเมินผลนิพจน์แต่ละแถวจะช้ากว่าการใช้โค้ด M ที่เขียนตรงๆ ใช้เมื่อจำเป็นจริงๆ เท่านั้น

ถ้า document มีไวยากรณ์ผิด จะเกิดอะไร

จะได้ข้อผิดพลาด (error) ที่บอกตำแหน่งและประเภทของข้อผิดพลาด ต้องตรวจสอบนิพจน์ที่ส่งให้เป็นโค้ด M ที่ถูกต้อง

Resources & Related

Additional Notes

Expression.Evaluate ใช้สำหรับประเมินผลนิพจน์ M ที่เก็บไว้เป็นข้อความ โดยสามารถระบุตัวแปรและฟังก์ชันที่ใช้ได้ในสภาพแวดล้อม ทำให้สามารถเขียนโค้ด M แบบไดนามิก

ที่เจ๋งคือ Expression.Evaluate ให้เราสร้างนิพจน์ M แบบไดนามิก แล้วประเมินผลในขั้นตอน Query ได้ ซึ่งมีประโยชน์มากเมื่อต้องสร้างฟิลเตอร์ หรือโค้ด M ที่เปลี่ยนแปลงตามเงื่อนไข

ส่วนตัวผม เห็นว่า Expression.Evaluate มีประโยชน์ที่สุดเมื่อต้องเรียกใช้ฟังก์ชัน Power Query ที่เก็บไว้ในไฟล์อื่น หรือสร้างนิพจน์ที่ซับซ้อนแบบโปรแกรมแนว (programmatic) ได้ แต่ต้องระวังเรื่องประสิทธิภาพเพราะ dynamic evaluation อาจช้ากว่าโค้ด static ที่เขียนตรงๆ

Leave a Reply

Your email address will not be published. Required fields are marked *