---
title: NONVISUAL – ทำให้ตัวกรองไม่ส่งผลกระทบต่อสิ่งที่ visual แสดง
url: https://www.thepexcel.com/functions/dax/table-manipulation/nonvisual-dax/
type: function-explainer
program: DAX
syntax: "NONVISUAL(<Expression>)"
date: 2025-12-13
updated: 2025-12-25
scores:
  popularity: 5
  difficulty: 5
  usefulness: 5
---

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

> NONVISUAL ใช้ทำเครื่องหมายว่า filter expression นี้เป็น non-visual ซึ่งหมายความว่ามันจะส่งผลต่อการคำ

## คำอธิบาย

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

## Syntax

```excel
NONVISUAL(&lt;Expression&gt;)
```

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| Expression | Yes | table or filter expression |  | table expression หรือ filter expression ที่ต้องการจะทำให้เป็น non-visual ช่วงแรกของ SUMMARIZECOLUMNS จะใช้มันเพื่อกรองแล้วแต่ไม่ไปกำหนดแถวที่แสดง |

## เคสการใช้งาน

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

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

_เหมาะกับ:_ non-visual-filter

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

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

_เหมาะกับ:_ summarizecolumns-control

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: NONVISUAL ใน SUMMARIZECOLUMNS - ตัวกรองแยกจากการแสดงผล

```excel
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 เท่านั้น`

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

### 2. ตัวอย่างที่ 2: NONVISUAL ร่วมกับ VALUES - ตัวกรองที่ขึ้นกับ filter context

```excel
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`

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

### 3. ตัวอย่างที่ 3: NONVISUAL เทียบกับ IGNORE - ความแตกต่างในการควบคุม

```excel
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`

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

## หมายเหตุเพิ่มเติม

- ผมแนะนำให้ใช้ NONVISUAL เมื่อพอใจว่า: (1) ต้องการ measure มีตัวกรองเพิ่มเติม แต่ (2) ไม่อยากให้ตารางสรุปเพิ่มแถวหรือตัดแถว เช่น ต้องการสรุปตาม Category แต่ measure คำนวณมาจากแค่ Brand เลือกสรรเท่านั้น

- เมื่อเจอปัญหา "แถวหายในตารางสรุป" อย่าเพิ่งวุ่นวาย ให้เช็ค FILTER expression ที่ใช้ใน SUMMARIZECOLUMNS ว่าควรเป็น NONVISUAL ไหม โดยทั่วไป VALUES หรือ TREATAS ที่มาจาก slicer อาจต้อง NONVISUAL

- NONVISUAL + VALUES = ดีมาก เมื่อ VALUES ขึ้นอยู่กับ filter context จากนอก SUMMARIZECOLUMNS ให้ wrap ด้วย NONVISUAL เพื่อป้องกันไม่ให้มันไปกำหนดแถวสรุป

- ส่วนตัวผมมักใช้ NONVISUAL เมื่ออยากให้ ALLSELECTED ทำงานแบบ "เห็นของแบบกว้าง" ตัวอย่าง: ต้องการ YoY Growth ที่เปรียบเทียบ Category ปัจจุบันกับ Year ก่อนหน้า NONVISUAL ช่วยให้แถว Category ยังโชว์ในตารางแม้ว่า Year ก่อนหน้าไม่มีข้อมูล

## คำถามที่พบบ่อย

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

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

**Q: NONVISUAL ต่างจาก IGNORE อย่างไร?**

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

**Q: NONVISUAL ใช้ได้นอก SUMMARIZECOLUMNS ไหม?**

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

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

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

**Q: NONVISUAL ส่งผลต่อ ALLSELECTED ไหม?**

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

## ฟังก์ชันที่เกี่ยวข้อง

- summarizecolumns
- calculate
- values
- ignore
- [FILTER – กรองตารางด้วยเงื่อนไขที่ซับซ้อน (Iterator Function)](https://www.thepexcel.com/functions/dax/filter/filter-dax/)
- issubtotal

## แหล่งข้อมูลเพิ่มเติม

- [DAX Guide: NONVISUAL](https://dax.guide/nonvisual/) _(guide)_
- [SQLBI: NONVISUAL and IGNORE](https://www.sqlbi.com/articles/) _(guide)_

---

_Source: [https://www.thepexcel.com/functions/dax/table-manipulation/nonvisual-dax/](https://www.thepexcel.com/functions/dax/table-manipulation/nonvisual-dax/)_
