EXCEL TOOLS
Excel Add-ins ที่พัฒนาโดยคุณสันติพงศ์ ณสุย (MVP Excel 2010-2020) ด้วยภาษา C# เพื่อแก้ไขปัญหาไฟล์ใหญ่ คำนวณนาน ทำงานช้า จัดการข้อมูลต่าง ๆ ที่ทำงานประจำวันได้อย่างสะดวกรวดเร็ว สนใจคลิกไปดูได้ที่นี่ครับ => Excel Tools
Excel Add-ins ที่พัฒนาโดยคุณสันติพงศ์ ณสุย (MVP Excel 2010-2020) ด้วยภาษา C# เพื่อแก้ไขปัญหาไฟล์ใหญ่ คำนวณนาน ทำงานช้า จัดการข้อมูลต่าง ๆ ที่ทำงานประจำวันได้อย่างสะดวกรวดเร็ว สนใจคลิกไปดูได้ที่นี่ครับ => Excel Tools
 snasui.com ยินดีต้อนรับ
 snasui.com ยินดีต้อนรับ  
  สมาชิกท่านใดที่ยังไม่ได้ระบุ Version ของ Excel ที่ใช้งานจริง สามารถทำตาม Link นี้เพื่อจะได้รับคำตอบที่ตรงกับ Version ของท่านครับ
 สมาชิกท่านใดที่ยังไม่ได้ระบุ Version ของ Excel ที่ใช้งานจริง สามารถทำตาม Link นี้เพื่อจะได้รับคำตอบที่ตรงกับ Version ของท่านครับ  ระบุ Version ของ Excel
 ระบุ Version ของ Excel  โปรดทราบ
 โปรดทราบ 
 สมัครสมาชิก
 สมัครสมาชิก
 Login ผ่าน Facebook
 Login ผ่าน Facebook Reset รหัสผ่าน
 Reset รหัสผ่าน ติดต่อผู้ดูแลระบบ
 ติดต่อผู้ดูแลระบบ ตั้งค่าส่วนตัว
 ตั้งค่าส่วนตัว วิธีการตั้งและตอบกระทู้
 วิธีการตั้งและตอบกระทู้ จัดรูปแบบตัวอักษร
 จัดรูปแบบตัวอักษร กำหนดขนาดตัวอักษรใน Browser
 กำหนดขนาดตัวอักษรใน Browser[code] และปิดด้วย [/code] ตัวอย่างเช่น [code]dim r as range[/code] เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่างเพิ่มเติม)
 คลุม J2:K2 > Ctrl+C เพื่อคัดลอก > คลุม J3:K20 > Ctrl+V เพื่อวางก็จะได้ Valdation เหมือนกันทุกบรรทัดครับ
 คลุม J2:K2 > Ctrl+C เพื่อคัดลอก > คลุม J3:K20 > Ctrl+V เพื่อวางก็จะได้ Valdation เหมือนกันทุกบรรทัดครับลองแล้วไม่ได้ครับอาจารย์snasui wrote: Sat Aug 21, 2021 1:18 pmคลุม J2:K2 > Ctrl+C เพื่อคัดลอก > คลุม J3:K20 > Ctrl+V เพื่อวางก็จะได้ Valdation เหมือนกันทุกบรรทัดครับ
ปกติสามารถเลือกพื้นที่เอาไว้ก่อนแล้วสร้าง Validation พร้อมกันทีเดียวไม่ต้องคัดลอกไปใช้ครับ

 ผมลองแล้วได้ตามภาพครับ
 ผมลองแล้วได้ตามภาพครับ
 สรุปว่าต้องการสร้าง Validation แบบสัมพันธ์กันที่ต้องการใช้กับหลายเซลล์ในแนวคอลัมน์
 สรุปว่าต้องการสร้าง Validation แบบสัมพันธ์กันที่ต้องการใช้กับหลายเซลล์ในแนวคอลัมน์ขอพระคุณครับอาจารย์ เดี๋ยวผมจะลองศึกษาเรื่อง script ต่อครับsnasui wrote: Sat Aug 21, 2021 5:26 pmสรุปว่าต้องการสร้าง Validation แบบสัมพันธ์กันที่ต้องการใช้กับหลายเซลล์ในแนวคอลัมน์
เท่าที่ลองสร้างดูพบว่าไม่สามารถทำได้ น่าจะต้องทำด้วย Script ครับ
Code: Select all
var ws = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var wsOptions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("address");      // เปลี่ยนชื่อ Sheet เป็น sheet ที่เก็บตัวเลือกต่างๆ ที่เก็บข้อมูลที่จะนำมาประมวลผล
var options = wsOptions.getRange("A2:C").getValues();                                 // เปลี่ยนช่วง range ที่ต้องการ ที่อยู่ใน sheet option ช่วงข้อมูลจาก sheet ข้างบน
var firstLevelColumn = 9;                                                             // เปลี่ยน column ที่ต้องการ ที่อยู่ใน sheet ที่จะให้แสดงผล คอลัมม์ที่เท่าไหร่ นับ 1 จาก A มา
var secondLevelColumn = 10;                                                            // เปลี่ยน column ที่ต้องการ ที่อยู่ใน sheet ที่จะให้แสดงผล คอลัมม์ที่เท่าไหร่ นับ 1 จาก A มา
var thirdLevelColumn = 11;                                                             // เปลี่ยน column ที่ต้องการ ที่อยู่ใน sheet ที่จะให้แสดงผล คอลัมม์ที่เท่าไหร่ นับ 1 จาก A มา
var mainWsName = "data";                                                            // เปลี่ยนชื่อ Sheet ที่เป็นหน้าที่เราทำงาน sheet ที่จะให้แสดงผลหรทือทำงาน
function onEdit() {
  var activeCell = ws.getActiveCell().getValue();
  var wsName = ws.getActiveCell().getSheet().getName();
  var r = ws.getActiveCell().getRow();
  var c = ws.getActiveCell().getColumn();
  
  if ( wsName == mainWsName && c === firstLevelColumn && r > 1 ) {                    // ถ้ามีหัวแถวมากกว่า 1 ให้เปลี่ยนตัวเลข 1 เป็น 2,3,4 เป็นต้น
    applyFirstLevelValidation (activeCell,r)
  } else if (wsName == mainWsName && c === secondLevelColumn && r > 1){               // ถ้ามีหัวแถวมากกว่า 1 ให้เปลี่ยนตัวเลข 1 เป็น 2,3,4 เป็นต้น
    applySecondLevelValidation (activeCell,r)
  }
} // End onEdit
function applyFirstLevelValidation (activeCell,r) {
  if (activeCell === "") { 
    ws.getRange(r, secondLevelColumn).clearContent().clearDataValidations(); 
    ws.getRange(r, thirdLevelColumn).clearContent().clearDataValidations(); 
    } else {
      ws.getRange(r, secondLevelColumn).clearContent().clearDataValidations();
      var filterOptions = options.filter(function(o) { return o[0] === activeCell });
      var listToApply = filterOptions.map(function(o) { return o[1] });
      var cell = ws.getRange(r, secondLevelColumn);
      applyDatavalidationToCell(listToApply,cell)
    }
}
function applySecondLevelValidation (activeCell,r) {
  if (activeCell === "") { 
    ws.getRange(r, thirdLevelColumn).clearContent().clearDataValidations(); 
    } else {
      ws.getRange(r, thirdLevelColumn).clearContent().clearDataValidations();
      var firstLevelColValue = ws.getRange(r, firstLevelColumn).getValue();
      var filterOptions = options.filter(function(o) { return o[0] === firstLevelColValue && o[1] === activeCell});
      var listToApply = filterOptions.map(function(o) { return o[2] });
      var cell = ws.getRange(r, thirdLevelColumn);
      applyDatavalidationToCell(listToApply,cell)
    }
}
function applyDatavalidationToCell(list,cell) {
  var rule = SpreadsheetApp.newDataValidation().requireValueInList(list).setAllowInvalid(false).build();
    cell.setDataValidation(rule);
}