หน้าเว็บ

วันอาทิตย์ที่ 27 กันยายน พ.ศ. 2552

ความเก่งกาจของฟังก์ชั่น Offset

ถ้าเราไปยืนที่ใดที่หนึ่งแล้วสามารถจะหันได้รอบทิศ ย่อมเป็นที่พอใจและน่ายินดีมากกว่าจะหันไปได้แค่ ซ้าย ขวาและมองไปข้างหน้าใช่ไหมครับ

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

ฟังก์ชั่น Offset เป็นฟังก์ชั่นสำหรับหาค่า เดี่ยว หรือ ชุดข้อมูล ได้ ขึ้นอยู่กับการกำหนดส่วนประกอบของฟังก์ชั่นครับ ซึ่งฟังก์ชั่น Offset มีส่วนประกอบ 5 ส่วนตามด้านล่าง

ไวยากรณ์

=Offset(Reference,Rows,Columns,Height,Width)

หรือ แปลตามแบบของผมเอง

=Offset(เซลล์อ้างอิง, จำนวนแถวที่ห่างจากเซลล์อ้างอิง ,จำนวนคอลัมน์ที่ห่างจากเซลล์อ้างอิง, ความสูงของข้อมูล, ความกว้างของข้อมูล)

ยกตัวอย่างเช่น

=Offset(A1,0,0,1,1)

หมายความว่า

  1. ให้หาค่าโดยดูจาก A1 เนื่องจากเซลล์อ้างอิง คือ A1
  2. ห่างจาก A1 ไปด้านล่าง 0 แถว คือไม่ไปไหน ยังอยู่ที่ A1 เหมือนเดิ
  3. ห่างจาก A1 ไปด้านขวา 0 คอลัมน์ คือไม่ไปไหน ยังอยู่ A1 เหมือนเดิม
  4. ความสูงของข้อมูล 1 เซลล์ ก็คือความสูงของ A1
  5. ความกว้างของข้อมูล 1 เซลล์ ก็คือความสูงของ A1 เช่นเดิม

สูตรด้านบน สามารถที่จะละส่วนประกอบ 2 ส่วนสุดท้ายไว้ก็ได้ เพราะมีความสูงและความกว้างของข้อมูลแค่ 1 บรรทัดก็จะได้เป็น

=Offset(A1,0,0)

หรือแบบของผู้ที่คิดว่าตัวเองเข้าใจดีแล้วก็จะเหลือ

=Offset(A1,,)

จะได้ค่าเดียวกัน คือ A1 นั่นเอง

ดูตัวอย่างตามภาพด้านล่าง 

Offset01

ยกตัวอย่างใหม่ให้หลากหลายกว่าเดิม เพราะ Offset สามารถไปข้างหน้าและถอยหลังได้ การเริ่มที่เซลล์ A1 ไม่สามารถไปซ้ายและขึ้นบนได้ แต่มีประโยชน์แน่นอน จะกล่าวถึงในตอนท้ายถ้าไม่ลืม

ถ้าเช่นนั้น เริ่มที่ D5 ก็แล้วกัน จะได้เป็น

=Offset(D5,-1,-2,2,2)

โอ้โห...มีติดลบด้วย

ครับ ต้องไม่กระพริบตาเลยครับ

แปลสูตรได้ว่า

  1. เริ่มจาก D5
  2. ห่างจาก D5 จำนวน -1 แถว (อ้าว...แล้วไปไหน) ไป D4 ครับ ซึ่ง D4 จะกลายเป็นเซลล์อ้างอิงใหม่เพื่อใช้ในข้อ 3
  3. ห่างจาก D4 จำนวน -2 คอลัมน์ (อ้าว...แล้วไปไหน) ไป B4 ครับ ซึ่ง B4 จะกลายเป็นเซลล์อ้างอิงใหมเพื่อใช้ในข้อ 4
  4. จาก B4 ในข้อ 3 ความสูง 2 แถว ก็แสดงว่าสูงไปถึง B5 ก็จะกลายเป็น B4:B5
  5. จากข้อ 4 (คือ B4:B5) กว้าง 2 คอลัมน์ ก็จะกลายเป็น B4:C5

สรุป Offset(D5,-1,-2,2,2) คือช่วงเซลล์ B4:C5
ในชีวิตจริงการใช้สูตรนี้อย่างเดียวจะเกิดค่าผิดพลาดเนื่องจากให้ผลลัพธ์เป็นช่วงข้อมูล ซึ่งเราไม่สามารถอ้างถึงช่วงข้อมูลขึ้นมาลอย ๆ ในเซลล์ใด ๆ ได้ เช่นถ้าคีย์ตรง ๆ ในเซลล์ใด ๆ เป็น =B4:C5 จะให้ผลลัพธ์เป็นค่าผิดพลาด ดังนั้น ปกติแล้วจะใช้สูตรอื่นมาครอบอีกทีครับ เช่น

=Sum(Offset(D5,-1,-2,2,2))

มายถึงการรวมยอดของช่วงเซลล์ B4:C5

ดูตัวอย่างตามภาพด้านล่าง 

Offset02

ความสูงและความกว้างเป็นลบได้ไหม ได้แน่นอนครับ อย่างที่บอกว่าสามารถหันได้รอบทิศ

ถ้าเปลี่ยนสูตรด้านบนเป็น

=Sum(Offset(D5,-1,-2,-2,-2))

จะเป็นการ Sum ช่วงเซลล์ไหนครับ? (เฉลยอยู่ด้านล่าง) ให้ทดลองเล่นดูแล้วจะเข้าใจมากขึ้น อย่าเพิ่งดูเฉลยครับ

และ เมื่อระยะห่างจากเซลล์อ้างอิง ทั้งความสูงและความกว้างสามารถเป็นลบได้ ดังนั้น สูตรที่ให้ผลลัพธ์หลุดออกนอกกรอบของ Sheet จะให้ค่าผิดพลาดเป็น #Ref! จึงควรระวังในการใช้งาน

เช่น

=Offset(A1,-1,0)

ผลลัพธ์จะได้ #Ref!

เนื่องจาก A1 คือเซลล์แรกแล้ว ไม่มีเซลล์อื่นใดมาก่อน A1 อีก

คิดว่าสิ่งที่อธิบายมานี้ทำให้เข้าใจมากขึ้นสำหรับฟังก์ชั่น Offset และใช้งานกันอย่างเพลิดเพลินนะครับ

สำหรับโอกาสที่จะใช้งาน ขึ้นอยู่กับผู้ใช้ครับ โดยปกติแล้วจะใช้หาค่าในตำแหน่งต่าง ๆ โดยมีเซลล์เริ่มต้นเป็นเซลล์อ้างอิง และน้อยนักที่จะใช้ตัวเลขเป็นลบในส่วนของระยะห่าง, ความสูงและความกว้างของช่วงข้อมูล เพราะว่าถ้าไม่แม่นจริงจะสับสนครับ

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

อะไรคือถูกกระทบให้เปลี่ยนแปลงได้โดยง่าย ก็เช่น แค่เราเลือกเซลล์ว่าง ๆ แล้วกดแป้น Delete ฟังก์ชั่น Offset ก็ทำงานแล้วครับ หรือแค่ปรับความสูงความกว้างของแถวหรือคอลัมน์ใด ๆ ซึ่งไม่ได้เฉียดหรืออยู่ในตำแหน่งใกล้ ๆ กับเซลล์ที่บรรจุฟังก์ชั่น Offset เลย ฟังก์ชั่น Offset ก็ทำการคำนวณให้เช่นเดียวกัน

การที่เป็น Volatile นี้เองทำให้เราคำนึงให้มากสำหรับการใช้งาน เพราะถ้าใช้ Offset เป็นจำนวนมาก จะทำให้เครื่องคำนวณช้าลงอย่างมากครับ



เฉลย

=Sum(Offset(D5,-1,-2,-2,-2))

คือ Sum(A3:B4)

2 ความคิดเห็น:

ไม่ระบุชื่อ กล่าวว่า...

ได้ความรู้มากเลยครับ แต่อยากถามนิดนึงที่บอกว่า

=Offset(A1,0,0)

หรือแบบของผู้ที่คิดว่าตัวเองเข้าใจดีแล้วก็จะเหลือ

=Offset(A1,,)

ผมลองดูแล้วค่ามันไม่เหมือนกันนะครับ
เข้าใจว่าค่า default ของ hight และ width น่าจะเท่ากับ 1

แต่อย่างไรก็ขอบคุณที่มี Blog ดีๆให้อ่านครับ
MR.Kai

snasui กล่าวว่า...

สำหรับ offset(A1,0,0) และ offset(A1,,) ขอยืนยันว่าได้ค่าเท่ากันแน่นอนครับ

ค่าเริ่มต้นของความสูงและความกว้างเริ่มต้นที่ 1 ใช่แล้วครับ แต่ค่าตามด้านบน ไม่ใช่ความกว้างและความสูง เป็นค่าของแถวและคอลัมน์ที่จะถัดจาก A1 การไม่ไม่ใส่ค่า หรือใ่ส่ค่าเป็น 0 จึงมีค่าเท่ากัน