บทช่วยสอนฟังก์ชัน Excel VBA: ส่งคืน การโทร ตัวอย่าง
⚡ สรุปอย่างชาญฉลาด
ฟังก์ชัน VBA ใน Excel คือบล็อกของโค้ดที่ทำงานบางอย่างและส่งผลลัพธ์กลับไปยังตัวเรียกใช้ หน้านี้ครอบคลุมไวยากรณ์การประกาศฟังก์ชัน การส่งคืนค่า ตัวอย่างการบวก และการใช้ฟังก์ชันภายในเซลล์ในเวิร์กชีต

ฟังก์ชั่นคืออะไร?
ฟังก์ชั่นคือส่วนของโค้ดที่ทำงานเฉพาะและส่งกลับผลลัพธ์ ฟังก์ชันส่วนใหญ่จะใช้เพื่อดำเนินงานที่ซ้ำๆ เช่น การจัดรูปแบบข้อมูลสำหรับเอาต์พุต การคำนวณ เป็นต้น
สมมติว่าคุณกำลังพัฒนา...ping โปรแกรมที่คำนวณดอกเบี้ยเงินกู้ คุณสามารถสร้างฟังก์ชันที่รับจำนวนเงินกู้และระยะเวลาชำระคืน จากนั้นฟังก์ชันจะใช้จำนวนเงินกู้และระยะเวลาชำระคืนในการคำนวณดอกเบี้ยและส่งคืนค่า
ทำไมต้องใช้ฟังก์ชัน
ข้อดีของการใช้ฟังก์ชันนั้นเหมือนกับข้อดีของการใช้ซับรูทีน คือ ช่วยแบ่งโปรแกรมที่ยาวออกเป็นส่วนย่อยๆ ที่จัดการได้ง่าย สามารถนำกลับมาใช้ซ้ำได้ทุกที่ในโครงการ และชื่อที่สื่อความหมายจะช่วยระบุว่าโค้ดนั้นทำอะไร บทช่วยสอนการใช้งานซับรูทีน VBA ใน Excel ครอบคลุมสิทธิประโยชน์เหล่านั้นอย่างครบถ้วน
กฎของการตั้งชื่อฟังก์ชัน
กฎการตั้งชื่อก็เหมือนกับกฎการตั้งชื่อซับรูทีนทุกประการ ชื่อฟังก์ชันต้องไม่มีช่องว่าง ต้องขึ้นต้นด้วยตัวอักษรหรือเครื่องหมายขีดล่าง และต้องไม่ใช่คำสงวน VBA คำสำคัญ เช่น Function, Private หรือ End
ไวยากรณ์ VBA สำหรับการประกาศฟังก์ชัน
Private Function myFunction (ByVal arg1 As Integer, ByVal arg2 As Integer) myFunction = arg1 + arg2 End Function
ที่นี่ในไวยากรณ์
| Code | การกระทำ |
|---|---|
|
|
|
|
|
|
|
|
วิธีการส่งค่ากลับและกำหนดชนิดข้อมูลของฟังก์ชัน
ฟังก์ชันมีหน้าที่อย่างหนึ่งที่ซับรูทีนไม่มี นั่นคือ การส่งค่ากลับ ค่าดังกล่าวมีรายละเอียดอยู่สองอย่างที่มักมองข้ามไป
ประการแรกคือการกำหนดค่า VBA ไม่มีคำสั่ง Return แต่เราจะกำหนดผลลัพธ์ให้กับชื่อของฟังก์ชันเอง ซึ่งเป็นเหตุผลว่าทำไมบรรทัดนั้นจึงเขียนว่า ฟังก์ชั่นของฉัน = arg1 + arg2หากการกำหนดค่าดังกล่าวไม่เคยทำงาน ฟังก์ชันจะส่งคืนค่าว่างโดยไม่แสดงข้อผิดพลาด ดังนั้นทุกส่วนของโค้ดจะต้องกำหนดค่าให้กับฟังก์ชันนี้
ประการที่สองคือประเภทของค่าที่ส่งคืน การประกาศข้างต้นสิ้นสุดที่วงเล็บปิด ดังนั้นฟังก์ชันจึงส่งคืนค่า Variant การเพิ่มข้อความ As หลังวงเล็บจะแก้ไขประเภท ซึ่งจะทำให้ทำงานได้เร็วขึ้น ใช้หน่วยความจำน้อยลง และช่วยให้คอมไพเลอร์ตรวจจับความไม่ตรงกันได้
| การประกาศ | คืนสินค้า | ควรใช้เมื่อใด |
|---|---|---|
| ฟังก์ชัน f(x ตราบใดที่) | ตัวแปร | เฉพาะเมื่อประเภทของผลลัพธ์แตกต่างกันอย่างแท้จริง |
| ฟังก์ชัน f(x ตราบใดที่) ตราบใดที่ | นาน | จำนวนเต็ม เช่น จำนวนนับและหมายเลขแถว |
| ฟังก์ชัน f(x ตราบใดที่) เมื่อ Double | Double | การคำนวณใดๆ ที่ให้ผลลัพธ์เป็นทศนิยม |
| ฟังก์ชัน f(x ยาว) เป็นสตริง | เชือก | ข้อความที่จัดรูปแบบแล้วส่งคืนเพื่อแสดงผล |
| ฟังก์ชัน f(x ตราบใดที่) เป็นบูลีน | บูลีน | การตรวจสอบความถูกต้องโดยตอบว่าจริงหรือเท็จ |
💡 เคล็ดลับ: ใช้ Exit Function เพื่อออกจากโปรแกรมก่อนกำหนดเมื่อกำหนดค่าส่งคืนแล้ว ในลักษณะเดียวกับที่ Exit Sub ออกจากซับรูทีน
ฟังก์ชั่นแสดงให้เห็นด้วยตัวอย่าง:
ฟังก์ชันมีความคล้ายคลึงกับซับรูทีนมาก ความแตกต่างที่สำคัญระหว่างซับรูทีนและฟังก์ชันคือฟังก์ชันจะส่งคืนค่าเมื่อถูกเรียกใช้ ในขณะที่ซับรูทีนจะไม่ส่งคืนค่าเมื่อถูกเรียกใช้ สมมติว่าคุณต้องการบวกตัวเลขสองตัว คุณสามารถสร้างฟังก์ชันที่รับตัวเลขสองตัวและส่งคืนผลรวมของตัวเลขเหล่านั้น
- สร้างส่วนติดต่อผู้ใช้
- เพิ่มฟังก์ชั่น
- เขียนโค้ดสำหรับปุ่มคำสั่ง
- ทดสอบรหัส
ขั้นตอน 1) ส่วนติดต่อผู้ใช้
เพิ่มปุ่มคำสั่งลงในแผ่นงานดังที่แสดงด้านล่าง
ตั้งค่าคุณสมบัติของ CommandButton1 ดังต่อไปนี้
| S / N | Control | อสังหาริมทรัพย์ | ความคุ้มค่า |
|---|---|---|---|
| 1 | ปุ่มคำสั่ง1 | ชื่อ | btnเพิ่มNumbers |
| 2 | คำบรรยายภาพ | เพิ่ม Numbers ฟังก์ชัน |
อินเทอร์เฟซของคุณควรปรากฏดังนี้
ขั้นตอน 2) รหัสฟังก์ชั่น
- กด Alt + F11 เพื่อเปิดหน้าต่างโค้ด
- เพิ่มโค้ดดังต่อไปนี้:
Private Function addNumbers(ByVal firstNumber As Integer, ByVal secondNumber As Integer) addNumbers = firstNumber + secondNumber End Function
ที่นี่ในรหัส
| Code | การกระทำ |
|---|---|
|
|
|
|
|
|
ขั้นตอนที่ 3) เขียน Code ที่เรียกใช้ฟังก์ชัน
- คลิกขวาที่ปุ่ม btnAddNumbers ปุ่มคำสั่ง
- เลือกมุมมอง Code
- เพิ่มโค้ดดังต่อไปนี้:
Private Sub btnAddNumbers_Click() MsgBox addNumbers(2, 3) End Sub
ที่นี่ในรหัส
| Code | การกระทำ |
|---|---|
| “ข่าวสารเกี่ยวกับBox เพิ่มNumbers(หนึ่ง)" |
|
ขั้นตอน 4) รันโปรแกรมจะได้ผลลัพธ์ดังนี้
ดาวน์โหลด Excel ที่มีโค้ดด้านบน
ดาวน์โหลดไฟล์ Excel ด้านบน Code
ปุ่มด้านบนเรียกใช้ฟังก์ชันจากโค้ด VBA นอกจากนี้ยังสามารถเรียกใช้ฟังก์ชันจากเวิร์กชีตได้โดยตรง โดยไม่ต้องใช้ปุ่มใดๆ
วิธีใช้ฟังก์ชัน VBA ในเซลล์ของเวิร์กชีต
ฟังก์ชันที่เขียนด้วย VBA สามารถพิมพ์ลงในเซลล์ได้เหมือนกับคำสั่ง SUM หรือ VLOOKUP Excel เรียกฟังก์ชันนี้ว่า ฟังก์ชันที่ผู้ใช้กำหนดเอง หรือ UDF และนี่คือเหตุผลที่หลายคนเรียนรู้ฟังก์ชันก่อนซับรูทีน โดยต้องมีเงื่อนไขสามข้อต่อไปนี้
- วางไว้ในโมดูลมาตรฐาน: แทรกโมดูลในโปรแกรมแก้ไข ฟังก์ชันที่จัดเก็บไว้หลังเวิร์กชีตหรือใน ThisWorkbook จะไม่ปรากฏในแถบสูตร
- ประกาศให้เป็นสาธารณะ: ตัวอย่างข้างต้นใช้คำว่า "ส่วนตัว" ซึ่งจะซ่อนคำนั้นจาก Excel ค่าเริ่มต้นคือ "สาธารณะ" ดังนั้นการลบคำหลักออกก็เพียงพอแล้ว
- ส่งคืนค่า ไม่เปลี่ยนแปลงสิ่งใด: ฟังก์ชันที่ผู้ใช้กำหนดเอง (UDF) ไม่สามารถจัดรูปแบบเซลล์ ลบแถว หรือเขียนข้อมูลลงในเซลล์อื่นได้ Excel จะบล็อกการกระทำเหล่านั้น และเซลล์จะแสดงข้อความ #VALUE!
ฟังก์ชันด้านล่างนี้ใช้สำหรับแปลงค่าอุณหภูมิ และสามารถใช้ได้ทุกที่ในแผ่นงาน
Public Function CelsiusToF(ByVal Celsius As Double) As Double CelsiusToF = (Celsius * 9 / 5) + 32 End Function
บันทึกเวิร์กบุ๊กเป็นไฟล์ .xlsm ที่เปิดใช้งานมาโคร จากนั้นพิมพ์ =CelsiusToF(A1) ป้อนชื่อลงในเซลล์ใดก็ได้ ผลลัพธ์จะอัปเดตทุกครั้งที่มีการเปลี่ยนแปลงในเซลล์ A1 และชื่อจะปรากฏในรายการเติมคำอัตโนมัติของสูตรภายใต้หมวดหมู่ที่ผู้ใช้กำหนดเอง เนื่องจากเวิร์กบุ๊กนี้มีมาโครอยู่แล้ว ผู้ที่เปิดเวิร์กบุ๊กนี้จะต้องเปิดใช้งานเนื้อหาก่อนที่สูตรจะส่งคืนค่าแทนที่จะเป็น #NAME?
ข้อผิดพลาดทั่วไปของฟังก์ชัน VBA และวิธีแก้ไข
มีปัญหาหลักสี่ประการที่ทำให้ฟังก์ชันส่วนใหญ่สามารถคอมไพล์ได้แต่ให้ผลลัพธ์ที่ไม่ถูกต้อง
- ฟังก์ชันนี้จะส่งคืนค่าว่างหรือ 0: ผลลัพธ์ไม่เคยถูกกำหนดให้กับชื่อฟังก์ชัน หรือเงื่อนไขในคำสั่ง If บางส่วนข้ามการกำหนดค่าไป กำหนดค่าส่งคืนในทุกเส้นทาง
- #ชื่อ? ในเซลล์ของเวิร์กชีต: ฟังก์ชันนี้เป็นแบบส่วนตัว อยู่ในโมดูลชีตแทนที่จะเป็นโมดูลมาตรฐาน หรือเวิร์กบุ๊กถูกบันทึกโดยไม่ได้เปิดใช้งานมาโคร
- โอเวอร์โฟลว์เมื่อใช้พารามิเตอร์ประเภทจำนวนเต็ม: ตัวอย่างนี้ใช้ As Integer ซึ่งจะหยุดที่ค่า 32,767 หากต้องการใช้ข้อมูลจริง ให้เปลี่ยนทั้งพารามิเตอร์และชนิดข้อมูลส่งคืนเป็น Long
- การเปลี่ยนข้อโต้แย้งทำให้ผู้โทรประหลาดใจ: การละเว้น ByVal จะทำให้ VBA ส่งผ่านตัวแปรนั้นโดยตรง ส่งผลให้ฟังก์ชันสามารถเปลี่ยนแปลงค่าของผู้เรียกได้ ควรเขียน ByVal เว้นแต่ว่าต้องการผลลัพธ์ดังกล่าว



