Thep Excel

NONVISUALทำให้ตัวกรองไม่ส่งผลกระทบต่อสิ่งที่ visual แสดง

NONVISUAL ใช้ทำเครื่องหมายว่า filter expression นี้เป็น non-visual ซึ่งหมายความว่ามันจะส่งผลต่อการคำนวณ measure แต่จะไม่ไปทำให้แถวที่แสดงในตารางสรุปเปลี่ยนไป มักใช้ร่วมกับ SUMMARIZECOLUMNS เพื่อควบคุมพฤติกรรมของตัวกรองอย่างละเอียด

fx
=NONVISUAL(<Expression>)

ความนิยม5/10
ความยาก5/10
ประโยชน์5/10

อัปเดต 13 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด คำอธิบาย
Expression table or filter expression table expression หรือ filter expression ที่ต้องการจะทำให้เป็น non-visual ช่วงแรกของ SUMMARIZECOLUMNS จะใช้มันเพื่อกรองแล้วแต่ไม่ไปกำหนดแถวที่แสดง

Additional Notes

NONVISUAL เป็นฟังก์ชันที่ควบคุมวิธีการทำงานของ filter ภายใน SUMMARIZECOLUMNS นั่นคือมันทำให้ filter เป็น “non-visual” – ส่งผลต่อการคำนวณ measure แต่ไม่ส่งผลต่อชุดแถวที่ SUMMARIZECOLUMNS จะแสดง

ที่เจ๋งคือ NONVISUAL ช่วยสำหรับการควบคุมแบบละเอียด เวลาคุณต้องการให้ measure คำนวณภายใต้ filter บางตัว แต่ยังต้องการให้ filter นั้นไม่ไปตัดแถวในตารางสรุป มันจะสนับสนุน ALLSELECTED ให้ทำงานภาพกว้างขึ้น แทนที่จะ “สอง context” มันจะเป็น “context ที่มี expression ส่วน visual ได้เอกสิทธิ์แยกกัน”

ส่วนตัวผมเห็นว่า NONVISUAL เหมือนเครื่องคั่น context – มันบอก DAX ว่า “ตัวกรองนี้เป็นความลับของ measure ขอไม่เอาไปแสดงในตารางหลักนะ” ใช้อย่างถูกต้องมันจะช่วยแก้ปัญหา “แถวหาย” หรือ “แถวพิลึก” ในตารางสรุปได้ยอดเยี่ยม

How it works

มีตัวกรองประกอบแต่ไม่อยากให้แถวในผลลัพธ์เปลี่ยน

ให้ตัวกรองมีผลต่อค่าที่คำนวณ แต่ไม่ใช่ตัวกำหนดชุดแถวที่แสดง

ควบคุมพฤติกรรมของตารางสรุปใน SUMMARIZECOLUMNS

แยก “ตัวกรองเพื่อคำนวณ” ออกจาก “ตัวกรองเพื่อเลือกแถวที่แสดง”

Examples

ตัวอย่างที่ 1: NONVISUAL ใน SUMMARIZECOLUMNS – ตัวกรองแยกจากการแสดงผลSales by Category = SUMMARIZECOLUMNS( Product[Category], "Total Sales", [Total Sales], NONVISUAL(TREATAS({"Brand A", "Brand B"}, Product[Brand])) )

NONVISUAL ทำให้ TREATAS filter มีผลต่อการคำนวณ measure แต่ไม่ส่งผลต่อชุดแถว (Category) ที่จะแสดง ถ้าไม่มี NONVISUAL SUMMARIZECOLUMNS อาจตัดแถว Brand A/B ที่ไม่มีข้อมูลออกไป

fx
Sales by Category =
SUMMARIZECOLUMNS(
Product[Category],
"Total Sales", [Total Sales],
NONVISUAL(TREATAS({"Brand A", "Brand B"}, Product[Brand]))
)

ผลลัพธ์ตารางแสดงทุก Category แต่การคำนวณ [Total Sales] เอามาจากเฉพาะ Brand A และ Brand B เท่านั้น
ตัวอย่างที่ 2: NONVISUAL ร่วมกับ VALUES – ตัวกรองที่ขึ้นกับ filter contextSales with Brand Filter = VAR SelectedBrands = VALUES(Product[Brand]) RETURN SUMMARIZECOLUMNS( Product[Category], "Category Sales", [Total Sales], NONVISUAL(TRE…

ประโยชน์คือ measure [Total Sales] จะมี filter context ของ Brand แต่ SUMMARIZECOLUMNS จะแสดงทุก Category โดยไม่ตัดแถวตามตัวกรอง

fx
Sales with Brand Filter =
VAR SelectedBrands = VALUES(Product[Brand])
RETURN
SUMMARIZECOLUMNS(
Product[Category],
"Category Sales", [Total Sales],
NONVISUAL(TREATAS(SelectedBrands, Product[Brand]))
)

ผลลัพธ์สรุปข้อมูลตาม Category โดยมีตัวกรองจาก SelectedBrands เป็น non-visual
ตัวอย่างที่ 3: NONVISUAL เทียบกับ IGNORE – ความแตกต่างในการควบคุมCompare Behavior = VAR WithNonvisual = SUMMARIZECOLUMNS( Product[Category], "Sales NV", [Total Sales], NONVISUAL(TREATAS({"USA", "UK"}, Sales[Country])) ) VAR W…

NONVISUAL ควบคุม filter context เพื่อให้ measure คำนวณได้ IGNORE ควบคุมการตัดสินแถว non-blank ใน SUMMARIZECOLUMNS ทั้งสองเป็นการควบคุมสิ่งต่างกัน

fx
Compare Behavior =
VAR WithNonvisual = SUMMARIZECOLUMNS(
Product[Category],
"Sales NV", [Total Sales],
NONVISUAL(TREATAS({"USA", "UK"}, Sales[Country]))
)
VAR WithIgnore = SUMMARIZECOLUMNS(
Product[Category],
"Sales Ignore", [Total Sales],
IGNORE(TREATAS({"USA", "UK"}, Sales[Country]))
)
RETURN
WithNonvisual

ผลลัพธ์NONVISUAL: ทุก Category แสดง แต่ Sales มาจากแค่ USA/UK เท่านั้น; IGNORE: อาจเห็นแถว Country ปรากฏหากไม่มี non-blank value

FAQs

NONVISUAL เป็นตัวกรองจริง ๆ หรือเปล่า?+

ใช่ มันเป็นตัวกรองจริง มีผลต่อการคำนวณ measure ทั้งหมด แต่จุดเด่นคือมันไม่ส่งผลต่อชุดแถวที่ SUMMARIZECOLUMNS เลือกที่จะแสดง ถ้าคิด "visual" ว่าคือชุดแถว NONVISUAL ก็คือตัวกรองที่ mask ไว้ข้างนอก visual ส่วนตัวผมว่า NONVISUAL คือ "invisible wall" ที่ measure รู้อยู่ แต่ table builder ไม่รู้

NONVISUAL ต่างจาก IGNORE อย่างไร?+

NONVISUAL ทำให้ filter expression ไม่ส่งผลต่อแถวที่จะแสดง แต่มีผลต่อ measure; IGNORE ทำให้ expression ไม่ส่งผลต่อการตัดสินแถว non-blank ใน SUMMARIZECOLUMNS (แต่ยังมีผลต่อ filter context) ผมเห็นพวกนี้เหมือน: NONVISUAL = "ซ่อนตัวกรองจาก visual" IGNORE = "ไม่นับ expression นี้เมื่อตัดสินว่าแถวไหน blank"

NONVISUAL ใช้ได้นอก SUMMARIZECOLUMNS ไหม?+

ทั้งทางการและในทางปฏิบัติ NONVISUAL ออกแบบมาใช้ใน SUMMARIZECOLUMNS หรือ SUMMARIZE ฟังก์ชันอื่น ๆ ที่สร้าง table ส่วนตัวผมแนะนำเฉพาะใช้ใน SUMMARIZECOLUMNS เพราะที่นั่นมันมีความหมายชัดเจน

แถวหายเพราะอะไร? NONVISUAL แก้ได้ไหม?+

แถวอาจหายเพราะ SUMMARIZECOLUMNS ตัดแถว non-blank (ของ measure) และตัดแถวที่ filter ยังไม่มีข้อมูล NONVISUAL ช่วยได้เพราะมันบอก SUMMARIZECOLUMNS ว่า "filter นี้ไม่นับในการตัดสินแถว" ซึ่งช่วยให้ ALLSELECTED ในการคำนวณ measure ทำงานได้ภาพกว้างขึ้น หากยังเห็นแถวหายให้ลองใช้ IGNORE ร่วมด้วย

NONVISUAL ส่งผลต่อ ALLSELECTED ไหม?+

ใช่ NONVISUAL ทำให้ ALLSELECTED คิดถึง "context ที่กว้างกว่า" NONVISUAL filter ไม่ถูกมองเป็นส่วนของ visual filter ดังนั้น ALLSELECTED จึง "เห็นข้อมูลนอก NONVISUAL filter" มันเหมือนบอก ALLSELECTED ว่า "อันนี้ไม่นับนะ" ผมใช้มันเมื่อต้องการให้ ALLSELECTED ทำงานกว้างขึ้น

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ NONVISUAL จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้NONVISUALTable manipulation
Table manipulation (4)
IGNORE

IGNORE ใช้ภายใน SUMMARIZECOLUMNS เพื่อบอกว่า expression/measure นี้ต้องถูก “ละเว้น” ตอนตัดสินว่าแถวไหนเป็น non-blank ทำให้แถวในผลลัพธ์ไม่ถูกตัดทิ้งเพียงเพราะ measure ที่เลือกละเว้นเป็น BLANK

SUMMARIZECOLUMNS

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

TREATAS

TREATAS เป็นเสมือนการสร้าง "virtual relationship" โดยไม่ต้องแก้โมเดล ช่วยให้ส่งเงื่อนไขข้ามตารางที่ไม่เชื่อมกัน หรือเมื่อต้องการส่งหลายคีย์พร้อมกัน

VALUES

VALUES ดึงค่าที่ไม่ซ้ำจากคอลัมน์ หรือดึงแถวทั้งหมดจากตาราง โดยรวมแถว BLANK ที่เกิดจากข้อผิดพลาดของความสัมพันธ์ (Referential Integrity Violations) ส่วน DISTINCT จะไม่รวมแถว BLANK นี้

Filter (2)
ALLSELECTED

ALLSELECTED เป็น DAX function ที่ลบ filter context จาก Visual (row และ column filters) แต่คง filter context จาก Slicer, Page Filter และ Report Filter ไว้ ทำให้สามารถคำนวณ Visual Total ได้ ซึ่งเป็นยอดรวมของข้อมูลที่ผู้ใช้เลือกดูในปัจจุบัน ไม่ใช่ Grand Total ทั้งหมด ฟังก์ชันนี้ทำงานผ่าน Shadow Filter Context ซึ่งเป็น filter context ที่ DAX Engine เก็บไว้ก่อนที่ Visual จะเพิ่ม row/column filter เมื่อเรียก ALLSELECTED จะเรียกคืน shadow context นี้ ใช้ร่วมกับ CALCULATE และ SUM, AVERAGE, DIVIDE เพื่อคำนวณ Visual Total, Percentage of Selected, Dynamic Benchmark, Ranking within Selection และ Time Intelligence ที่เคารพ Slicer ต้องระวังการใช้งานใน iterator functions เช่น SUMX, FILTER เพราะอาจให้ผลลัพธ์ที่ไม่คาดคิด และระวัง Expanded Table Caveat ที่จะลบ filter ของ related table ด้วย

CALCULATE

CALCULATE เป็นฟังก์ชันหลักที่สำคัญที่สุดใน DAX ใช้สำหรับ evaluate expression ภายใต้ filter context ที่ถูกปรับเปลี่ยน สามารถเพิ่มตัวกรองใหม่ ลบตัวกรองเดิม หรือแทนที่ filter ที่มีอยู่ได้ รองรับทั้ง Boolean expression และ table expression เป็น filter arguments พร้อม filter modifier functions เช่น REMOVEFILTERS, ALL, ALLEXCEPT, KEEPFILTERS เพื่อควบคุมการกรองอย่างละเอียด มีพฤติกรรมพิเศษคือ context transition ที่เปลี่ยน row context เป็น filter context โดยอัตโนมัติ ทำให้เป็นเครื่องมือหลักในการสร้าง measure ที่ซับซ้อนและ calculated column ที่ต้องใช้ aggregation

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่