รูทีนย่อย Excel VBA: วิธีเรียกย่อยใน VBA พร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

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

  • 📦 ความหมาย: ซับรูทีนทำหน้าที่เฉพาะอย่างและไม่ส่งค่าใด ๆ กลับไปยังโค้ดที่เรียกใช้
  • ♻️ การนำกลับมาใช้ใหม่: สามารถเรียกใช้ซับรูทีนหนึ่งตัวได้หลายครั้งจากทุกที่ในโปรเจ็กต์
  • 🔤 กฎการตั้งชื่อ: ชื่อดังกล่าวต้องไม่มีช่องว่าง ขึ้นต้นด้วยตัวอักษรหรือเครื่องหมายขีดล่าง และต้องไม่ใช่คำหลักของ VBA
  • 🧾 ไวยากรณ์: คำสั่ง Private Sub name(ByVal arg As String) เปิดบล็อก และคำสั่ง End Sub ปิดบล็อก
  • 🖱️ โทรศัพท์: เมื่อคลิกปุ่มคำสั่ง ระบบจะเรียกใช้ซับรูทีนและส่งอาร์กิวเมนต์ของซับรูทีนนั้นไป
  • ▶️ เรียกใช้งานโดยตรง: การกด F5, กล่องโต้ตอบมาโคร หรือคำสั่ง Call ล้วนเป็นการเรียกใช้ซับรูทีนโดยไม่ต้องกดปุ่มใดๆ
  • 🔁 ฟังก์ชันย่อยหรือฟังก์ชันหลัก: เลือกใช้ฟังก์ชันเมื่อต้องการส่งค่ากลับ มิเช่นนั้นให้เลือกซับรูทีน

รูทีนย่อย Excel VBA

รูทีนย่อยใน VBA คืออะไร?

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

สมมติว่าคุณได้สร้างอินเทอร์เฟซผู้ใช้พร้อมกล่องข้อความสำหรับรับข้อมูลอินพุตของผู้ใช้ คุณสามารถสร้างซับรูทีนที่ล้างเนื้อหาของกล่องข้อความ ซับรูทีนการเรียก VBA เหมาะสมในสถานการณ์ดังกล่าว เนื่องจากคุณไม่ต้องการส่งคืนผลลัพธ์ใดๆ

ทำไมต้องใช้รูทีนย่อย

  • แบ่งโค้ดเป็นโค้ดขนาดเล็กที่สามารถจัดการได้:โปรแกรมคอมพิวเตอร์ทั่วไปมีโค้ดต้นฉบับจำนวนหลายพันบรรทัด ซึ่งทำให้มีความซับซ้อน ซับรูทีนช่วยแก้ปัญหานี้โดยแบ่งโปรแกรมออกเป็นโค้ดย่อยๆ ที่จัดการได้
  • Code การนำกลับมาใช้ใหม่สมมติว่าคุณมีโปรแกรมที่ต้องเข้าถึงฐานข้อมูล หน้าต่างเกือบทั้งหมดในโปรแกรมจะต้องโต้ตอบกับฐานข้อมูล แทนที่จะเขียนโค้ดแยกกันสำหรับหน้าต่างเหล่านี้ คุณสามารถสร้างฟังก์ชันที่จัดการการโต้ตอบกับฐานข้อมูลทั้งหมด จากนั้นคุณก็สามารถเรียกใช้จากหน้าต่างใดก็ได้ที่คุณต้องการ
  • รูทีนย่อยและฟังก์ชันมีการจัดทำเอกสารด้วยตนเอง- สมมติว่าคุณมีฟังก์ชันการคำนวณ LoanInterest และอีกฟังก์ชันหนึ่งที่ระบุว่า ConnectToDatabase เพียงแค่ดูชื่อของรูทีนย่อย/ฟังก์ชัน โปรแกรมเมอร์ก็จะสามารถบอกได้ว่าโปรแกรมทำอะไร

ก่อนที่จะเขียนชื่อไฟล์ คอมไพเลอร์จะคาดหวังว่าชื่อไฟล์นั้นจะต้องเป็นไปตามกฎเกณฑ์สั้นๆ ชุดหนึ่ง

กฎการตั้งชื่อรูทีนย่อยและฟังก์ชัน

หากต้องการใช้รูทีนย่อยและฟังก์ชัน มีชุดกฎที่ต้องปฏิบัติตาม

  • ชื่อฟังก์ชันการเรียกรูทีนย่อยหรือ VBA ไม่สามารถมีช่องว่างได้
  • ชื่อย่อยหรือฟังก์ชัน Excel VBA Call ควรขึ้นต้นด้วยตัวอักษรหรือขีดล่าง ไม่สามารถขึ้นต้นด้วยตัวเลขหรืออักขระพิเศษได้
  • รูทีนย่อยหรือชื่อฟังก์ชันไม่สามารถเป็นคีย์เวิร์ดได้ คำสำคัญคือคำที่มีความหมายพิเศษ VBA- คำต่างๆ เช่น Private, Sub, Function และ End ฯลฯ ล้วนเป็นตัวอย่างของคีย์เวิร์ด คอมไพเลอร์ใช้สำหรับงานเฉพาะ

เมื่อเลือกชื่อที่ถูกต้องแล้ว การประกาศนั้นก็จะปฏิบัติตามรูปแบบที่กำหนดไว้

ไวยากรณ์รูทีนย่อย VBA

คุณจะต้องเปิดใช้งานแท็บนักพัฒนาซอฟต์แวร์ใน Excel เพื่อติดตามตัวอย่างนี้ หากคุณไม่ทราบวิธีเปิดใช้งานแท็บนักพัฒนาซอฟต์แวร์ ให้อ่านบทช่วยสอนใน การควบคุม VBA ใน Excel

ที่นี่ในไวยากรณ์

Private Sub mySubRoutine(ByVal arg1 As String, ByVal arg2 As String)
    'do something
End Sub

คำอธิบายไวยากรณ์

Code การกระทำ
  • “ย่อยส่วนตัว mySubRoutine(…)”
  • ที่นี่คีย์เวิร์ด "Sub" ใช้เพื่อประกาศรูทีนย่อยชื่อ "mySubRoutine" และเริ่มต้นเนื้อหาของรูทีนย่อย
  • คีย์เวิร์ด Private ใช้เพื่อระบุขอบเขตของรูทีนย่อย
  • “ByVal arg1 เป็นสตริง, ByVal arg2 เป็นสตริง”:
  • ประกาศพารามิเตอร์สองตัวของชนิดข้อมูลสตริงชื่อ arg1 และ arg2
  • “จบย่อย”
  • “End Sub” ใช้เพื่อสิ้นสุดเนื้อหาของรูทีนย่อย

ซับรูทีนต่อไปนี้ยอมรับชื่อและนามสกุลและแสดงในกล่องข้อความ

ตอนนี้เราจะเขียนโปรแกรมและดำเนินการขั้นตอนย่อยนี้ มาดูสิ่งนี้กัน

วิธีเรียก Sub ใน VBA

ด้านล่างนี้เป็นกระบวนการทีละขั้นตอนเกี่ยวกับวิธีการโทร Sub ใน VBA:

  1. ออกแบบอินเทอร์เฟซผู้ใช้และตั้งค่าคุณสมบัติสำหรับการควบคุมผู้ใช้
  2. เพิ่มรูทีนย่อย
  3. เขียนโค้ดเหตุการณ์การคลิกสำหรับปุ่มคำสั่งที่เรียกรูทีนย่อย
  4. ทดสอบการใช้งาน

ขั้นตอน 1) ส่วนติดต่อผู้ใช้

ออกแบบส่วนติดต่อผู้ใช้ตามที่แสดงในภาพด้านล่าง

วิธีเรียก Sub ใน VBA

ตั้งค่าคุณสมบัติต่อไปนี้ คุณสมบัติที่เรากำลังตั้งค่า:

S / N Control อสังหาริมทรัพย์ ความคุ้มค่า
1 ปุ่มคำสั่ง1 ชื่อ btnDisplayFullName
2 คำบรรยายภาพ รูทีนย่อยชื่อเต็ม

อินเทอร์เฟซของคุณควรมีลักษณะดังนี้

วิธีเรียก Sub ใน VBA

ขั้นตอน 2) เพิ่มรูทีนย่อย

  1. กด Alt + F11 เพื่อเปิดหน้าต่างโค้ด
  2. เพิ่มซับรูทีนต่อไปนี้
Private Sub displayFullName(ByVal firstName As String, ByVal lastName As String)
    MsgBox firstName & " " & lastName
End Sub

ที่นี่ในรหัส

Code สถานะ
  • “ไพรเวทย่อย displayFullName(…)”
  • ประกาศซับรูทีนส่วนตัว displayFullName ที่ยอมรับพารามิเตอร์แบบสตริงสองตัว
  • “ByVal ชื่อเป็นสตริง ByVal นามสกุลเป็นสตริง”
  • ประกาศตัวแปรพารามิเตอร์สองตัวคือ firstName และ lastName
  • ข่าวสารเกี่ยวกับBox ชื่อนามสกุล"
  • มันเรียกข่าวสารเกี่ยวกับBox ฟังก์ชันในตัวสำหรับแสดงกล่องข้อความ จากนั้นส่งตัวแปร 'firstName' และ 'lastName' เป็นพารามิเตอร์
  • เครื่องหมายและ “&” ใช้เพื่อเชื่อมตัวแปรทั้งสองเข้าด้วยกัน และเพิ่มช่องว่างระหว่างตัวแปรทั้งสอง

ขั้นตอน 3) การเรียกรูทีนย่อย

การเรียกรูทีนย่อยจากเหตุการณ์คลิกปุ่มคำสั่ง

  • คลิกขวาที่ปุ่มคำสั่งตามที่แสดงในภาพด้านล่าง เลือก "ดู" Code.
  • ตัวแก้ไขโค้ดจะเปิดขึ้น

วิธีเรียก Sub ใน VBA

เพิ่มโค้ดต่อไปนี้ในตัวแก้ไขโค้ดสำหรับเหตุการณ์คลิกของปุ่มคำสั่ง btnDisplayFullName

Private Sub btnDisplayFullName_Click()
    displayFullName "John", "Doe"
End Sub

หน้าต่างโค้ดของคุณควรมีลักษณะดังนี้

วิธีเรียก Sub ใน VBA

บันทึกการเปลี่ยนแปลงและปิดหน้าต่างโค้ด

ขั้นตอน 4) การทดสอบรหัส

บนแถบเครื่องมือของนักพัฒนาให้ปิดโหมดการออกแบบ 'ปิด' ดังที่แสดงด้านล่าง

วิธีเรียก Sub ใน VBA

ขั้นตอน 5) คลิกที่ปุ่มคำสั่ง 'FullName Subroutine'

คุณจะได้รับผลลัพธ์ดังต่อไปนี้

วิธีเรียก Sub ใน VBA

ดาวน์โหลดไฟล์ Excel ด้านบน Code

การกดปุ่มนั้นสะดวกก็จริง แต่ไม่ใช่เพียงวิธีเดียวในการเริ่มใช้งานซับรูทีน และในระหว่างการพัฒนานั้น แทบจะไม่ใช่วิธีที่เร็วที่สุดเลย

วิธีเรียกใช้ซับรูทีนโดยไม่ต้องใช้ปุ่ม

ในขณะที่คุณกำลังเขียนโค้ด การเพิ่มคอนโทรลลงในชีตเพื่อทดสอบซับรูทีนนั้นเป็นการเสียเวลา VBA มีวิธีอื่นอีกสี่วิธีในการเรียกใช้ซับรูทีน และแต่ละวิธีเหมาะสมกับช่วงเวลาที่แตกต่างกันในวงจรการพัฒนา

  • กดปุ่ม F5 ในโปรแกรมแก้ไขข้อความ: วางเคอร์เซอร์ไว้ที่ใดก็ได้ภายใน Sub แล้วกด F5 โปรแกรมจะทำงานทันที วิธีนี้ใช้ได้เฉพาะเมื่อ Sub ไม่รับอาร์กิวเมนต์ใดๆ เนื่องจาก VBA ไม่มีค่าให้ป้อน
  • ทำตามขั้นตอนด้วยปุ่ม F8: รันโค้ดแบบเดียวกันทีละบรรทัด เพื่อให้คุณสามารถดูการเปลี่ยนแปลงของแต่ละตัวแปรในหน้าต่าง Locals ได้ ใช้ฟังก์ชันนี้เมื่อผลลัพธ์ผิดพลาดและคุณต้องการทราบว่าข้อผิดพลาดอยู่ที่จุดใด
  • ใช้กล่องโต้ตอบมาโคร: ในแท็บนักพัฒนา ให้คลิก มาโคร เลือกชื่อ แล้วคลิก เรียกใช้ เฉพาะซับรูทีนสาธารณะที่ไม่มีอาร์กิวเมนต์เท่านั้นที่จะปรากฏในรายการนี้ ซึ่งเป็นเหตุผลว่าทำไมซับรูทีนตัวช่วยจึงมักถูกประกาศเป็นส่วนตัว
  • โทรมาจากซับอื่น: นี่คือวิธีการที่ใช้สำหรับ Sub ทุกตัวที่รับอาร์กิวเมนต์ และเป็นวิธีที่ปุ่มคำสั่งด้านบนใช้เช่นกัน

ตัวเลือกสุดท้ายมีรูปแบบที่ยอมรับได้สองแบบ การเขียนชื่อตามด้วยอาร์กิวเมนต์เปล่าๆ ก็ใช้ได้ และการใช้คีย์เวิร์ด Call อย่างชัดเจนก็ใช้ได้เช่นกัน แต่กฎการใช้เครื่องหมายวงเล็บจะแตกต่างกันระหว่างสองวิธีนี้

Sub RunTheGreeting()
    ' Form 1: no Call keyword, no brackets
    displayFullName "John", "Doe"

    ' Form 2: Call keyword, brackets required
    Call displayFullName("Jane", "Roe")
End Sub

ทั้งสองบรรทัดทำหน้าที่เหมือนกันทุกประการ การผสมผสานรูปแบบทั้งสองโดยการเขียนวงเล็บโดยไม่ใช้คำหลัก Call เป็นสาเหตุที่พบบ่อยที่สุดของข้อผิดพลาดในการคอมไพล์ “Expected: =” เมื่อ Sub รับอาร์กิวเมนต์มากกว่าหนึ่งตัว

ความแตกต่างระหว่าง Sub และ Function ใน VBA

Sub และ Function เป็นประเภทของฟังก์ชันสองประเภทใน VBA และผู้เริ่มต้นมักเลือกใช้ผิดประเภท คำถามสำคัญคือ: โค้ดที่เรียกใช้ฟังก์ชันนั้นต้องการค่าส่งกลับหรือไม่?

คุณสมบัติ (Feature) ฟังก์ชัน
ส่งคืนค่า ไม่ ใช่ กำหนดให้กับชื่อฟังก์ชัน
ประกาศด้วย ย่อย … สิ้นสุด ย่อย ฟังก์ชัน … สิ้นสุดฟังก์ชัน
เรียกว่า แถลงการณ์ในบรรทัดของตัวเอง ส่วนหนึ่งของนิพจน์ เช่น x = myFunc(2)
สามารถใช้งานได้ในเซลล์ของเวิร์กชีต ไม่ ใช่ ในฐานะฟังก์ชันที่ผู้ใช้กำหนดเอง
การใช้งานทั่วไป จัดรูปแบบแผ่นงาน ล้างข้อมูลที่ป้อน แสดงข้อความ คำนวณผลรวม แปลงค่า ค้นหาข้อมูล

ใช้ Sub เมื่อโค้ดทำงานกับเวิร์กบุ๊ก และ... ฟังก์ชัน VBA เมื่อโค้ดสร้างคำตอบที่สิ่งอื่นนำไปใช้

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

ซับรูทีนส่วนตัว (Private Sub) สามารถเรียกใช้ได้เฉพาะจากภายในโมดูลที่ประกาศมันเท่านั้น ส่วนซับรูทีนสาธารณะ (Public Sub) สามารถมองเห็นได้จากทุกโมดูลในโปรเจ็กต์ และเป็นซับรูทีนประเภทเดียวที่ปรากฏในกล่องโต้ตอบมาโคร

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

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

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

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

สรุปโพสต์นี้ด้วย: