โครงสร้างห่วง
โครงสร้างแบบวนซ้ำอนุญาตให้เรียกใช้โค้ดหนึ่งหรือหลายบรรทัดซ้ำๆ โครงสร้างลูปที่ Visual Basic รองรับคือ:
1.ทำ...วนซ้ำ
2.สำหรับ...ถัดไป
3.สำหรับแต่ละ...ถัดไป
ทำ...วนซ้ำ
ใช้ Do loop เพื่อดำเนินการบล็อกคำสั่งซ้ำๆ ตามจำนวนครั้งที่เปลี่ยนแปลงได้ คำสั่ง Do...Loop มีหลายรูปแบบ แต่แต่ละคำสั่งจะประเมินเงื่อนไขตัวเลขเพื่อตัดสินใจว่าจะดำเนินการต่อไปหรือไม่ เช่น If...Thencondition ต้องเป็นค่าตัวเลขหรือนิพจน์ที่มีค่าเป็น True (ไม่เป็นศูนย์) หรือ False (ศูนย์) ใน Do...Loop loop ต่อไปนี้ คำสั่งจะถูกดำเนินการตราบเท่าที่เงื่อนไขเป็นจริง
ทำในขณะที่มีเงื่อนไข
งบ
วนซ้ำ
เมื่อ Visual Basic ดำเนินการ Do loop นี้ มันจะทดสอบเงื่อนไขก่อน หากเงื่อนไขเป็นเท็จ (ศูนย์) ข้อความทั้งหมดจะถูกข้าม ถ้าเงื่อนไขเป็น True (ไม่เป็นศูนย์) Visual Basic จะดำเนินการคำสั่ง จากนั้นถอยกลับไปที่คำสั่ง DoWhile เพื่อทดสอบเงื่อนไขอีกครั้ง
ดังนั้น จึงสามารถดำเนินการวนซ้ำได้หลายครั้งตามต้องการตราบเท่าที่เงื่อนไขเป็น True หรือไม่เป็นศูนย์ หากเงื่อนไขเป็นเท็จตั้งแต่ต้น คำสั่งจะไม่ถูกดำเนินการ ตัวอย่างเช่น ขั้นตอนต่อไปนี้จะนับจำนวนครั้งที่สตริงเป้าหมายปรากฏในสตริงอื่นและวนซ้ำทุกครั้งที่พบสตริงเป้าหมาย:
FunctionCountStrings(สตริงยาว เป้าหมาย)
การวางตำแหน่งนับ
ตำแหน่ง=1
DoWhileInStr (ตำแหน่ง, สตริงยาว, เป้าหมาย)
ตำแหน่ง=InStr(ตำแหน่ง,สตริงยาว,เป้าหมาย)_
1
นับ = นับ 1
วนซ้ำ
CountStrings=นับ
EndFunction
หากสตริงเป้าหมายไม่ปรากฏในสตริงอื่น InStr จะส่งกลับ 0 และลูปจะไม่ถูกดำเนินการอีกต่อไป
รูปแบบอื่นของคำสั่ง Do...Loop คือการดำเนินการคำสั่งก่อน จากนั้นจึงทดสอบเงื่อนไขหลังการดำเนินการแต่ละครั้ง แบบฟอร์มนี้รับประกันว่าคำสั่งต่างๆ จะได้รับการดำเนินการอย่างน้อยหนึ่งครั้ง:
ทำ
งบ
วนซ้ำในขณะที่มีเงื่อนไข
อีกสองรูปแบบคล้ายกับสองรูปแบบแรก ยกเว้นว่าจะดำเนินการวนซ้ำเมื่อใดก็ตามที่เงื่อนไขเป็นเท็จแทนที่จะเป็นจริง
สำหรับ...ถัดไป000
เมื่อคุณไม่ทราบว่าต้องดำเนินการคำสั่งในลูปกี่ครั้ง ก็ควรใช้ Do loop อย่างไรก็ตาม เมื่อคุณทราบจำนวนครั้งที่คุณต้องการดำเนินการแล้ว ควรใช้ For...Next loop ต่างจากลูป Do ตรงที่ For loop จะใช้ตัวแปรที่เรียกว่าตัวนับ แต่ละครั้งที่มีการวนซ้ำ ค่าของตัวแปรตัวนับจะเพิ่มขึ้นหรือลดลง ไวยากรณ์ของ For loop เป็นดังนี้:
Forcounter=startToend[การเพิ่มทีละขั้น]
งบ
ถัดไป[เคาน์เตอร์]
พารามิเตอร์ตัวนับ เริ่มต้น สิ้นสุด และเพิ่มเป็นตัวเลขทั้งหมด
โปรดทราบว่า พารามิเตอร์ส่วนเพิ่มอาจเป็นค่าบวกหรือลบก็ได้ หากการเพิ่มขึ้นเป็นบวก การเริ่มต้นจะต้องน้อยกว่าหรือเท่ากับจุดสิ้นสุด มิฉะนั้น จะไม่สามารถดำเนินการคำสั่งภายในลูปได้ หากการเพิ่มขึ้นเป็นลบ การเริ่มต้นจะต้องมากกว่าหรือเท่ากับจุดสิ้นสุดเพื่อให้สามารถดำเนินการเนื้อหาลูปได้ หากไม่ได้ตั้งค่าขั้นตอน ค่าเริ่มต้นของการเพิ่มคือ 1
เมื่อดำเนินการ For loop, Visual Basic
1. ตั้งตัวนับเท่ากับการเริ่มต้น
2. ทดสอบว่าตัวนับมากกว่าจุดสิ้นสุดหรือไม่ ถ้าเป็นเช่นนั้น Visual Basic จะออกจากการวนซ้ำ (ถ้าการเพิ่มขึ้นเป็นลบ Visual Basic จะทดสอบว่าตัวนับน้อยกว่าจุดสิ้นสุดหรือไม่)
3. ดำเนินการตามคำสั่ง
4. ตัวนับเพิ่มขึ้นทีละหนึ่งหรือเพิ่มขึ้น (หากระบุ)
5. ทำซ้ำขั้นตอนที่ 2 ถึง 4
รหัสต่อไปนี้พิมพ์ชื่อแบบอักษรบนหน้าจอที่ถูกต้องทั้งหมด:
PRivateSubForm_Click()
DimIAsInteger
Fori=0ToScreen.FontCount
PrintScreen.แบบอักษร(i)
ต่อไป
สิ้นสุดย่อย
ในแอปพลิเคชันตัวอย่าง VCR ขั้นตอน HighlightButton ใช้ลูป For...Next เพื่อก้าวผ่านคอลเลกชันการควบคุมของฟอร์ม VCR และแสดงการควบคุมรูปร่างที่เหมาะสม:
ปุ่มไฮไลท์ย่อย (MyControlAsVariant)
DimiAsInteger
Fori=0TofrmVCR.Controls.Count-1
IfTypeOffrmVCR.Controls (i) IsShapeThen
IffrmVCR.Controls(i).Name=MyControlแล้ว
frmVCR.Controls(i).Visible=True
อื่น
frmVCR.Controls(i).Visible=False
สิ้นสุดถ้า
สิ้นสุดถ้า
ต่อไป
สิ้นสุดย่อย
สำหรับแต่ละ...ถัดไป
ลูป ForEach...Next คล้ายกับลูป For...Next แต่จะทำซ้ำชุดคำสั่งสำหรับแต่ละองค์ประกอบในอาร์เรย์หรือคอลเลกชันของอ็อบเจ็กต์ แทนที่จะทำซ้ำคำสั่งตามจำนวนครั้งที่กำหนด ForEach...Next loop มีประโยชน์หากคุณไม่ทราบว่าคอลเลกชันมีองค์ประกอบจำนวนเท่าใด
ไวยากรณ์ของ ForEach...Next loop เป็นดังนี้:
สำหรับแต่ละองค์ประกอบIngroup
งบ
ถัดไปองค์ประกอบ
ตัวอย่างเช่น รูทีนย่อยต่อไปนี้จะเปิด Biblio.mdb และเพิ่มชื่อของแต่ละตารางลงในกล่องรายการ
รายการย่อยTableDefs()
DimobjDbAsDatabase
DimMyTableDefasTableDef
SetobjDb=OpenDatabase(c:/vb/biblio.mdb,_
จริง, เท็จ)
ForEachMyTableDefInobjDb.TableDefs()
List1.AddItemMyTableDef.Name
ถัดไปMyTableDef
สิ้นสุดย่อย
โปรดคำนึงถึงข้อจำกัดบางประการเมื่อใช้ ForEach...ถัดไป:
1. สำหรับคอลเลกชัน องค์ประกอบสามารถเป็นได้เฉพาะตัวแปร Variant, ตัวแปร Object ทั่วไป หรือวัตถุที่แสดงอยู่ใน "Object Browser"
2. สำหรับอาร์เรย์ องค์ประกอบต้องเป็นตัวแปร Variant เท่านั้น
3.ForEach...Next ไม่สามารถใช้กับอาร์เรย์ของประเภทที่ผู้ใช้กำหนดได้ เนื่องจาก Variant ไม่สามารถมีประเภทที่ผู้ใช้กำหนดได้
ใช้โครงสร้างการควบคุม
โครงสร้างการควบคุมที่ซ้อนกันจะวางโครงสร้างการควบคุมภายในโครงสร้างการควบคุมอื่น (เช่น บล็อก If...Then ในวง For...Next) โครงสร้างการควบคุมที่มีโครงสร้างการควบคุมอื่นเรียกว่ารัง ใน Visual Basic ไม่มีการจำกัดจำนวนระดับที่ซ้อนกันของโครงสร้างการควบคุม ตามกฎทั่วไป เพื่อให้โครงสร้างการตัดสินและโครงสร้างลูปสามารถอ่านได้ง่ายขึ้น ข้อความของโครงสร้างการตัดสินหรือลูปจะถูกเขียนด้วยการเยื้องเสมอ
ตัวอย่างเช่น กระบวนการต่อไปนี้จะพิมพ์ชื่อแบบอักษรทั้งหมดที่ใช้กับเครื่องพิมพ์และหน้าจอ:
แบบฟอร์มย่อยส่วนตัว_คลิก()
DimSFont, PFont
ForEachSFontInScreen.Fonts()
ForEachPFontInPrinter.Fonts()
IfSFont=PFontแล้ว
พิมพ์ SFont
สิ้นสุดถ้า
NextPFont
ถัดไปSFont
สิ้นสุดย่อย
โปรดทราบว่าวง Next วงแรกจะปิดวง For ภายใน และวง For สุดท้ายจะปิดวง For ภายนอก ในทำนองเดียวกัน ในคำสั่ง If ที่ซ้อนกัน คำสั่ง EndIf จะถูกจับคู่โดยอัตโนมัติกับคำสั่ง If ก่อนหน้าที่ใกล้เคียงที่สุด Nested Do...โครงสร้าง Loop ทำงานในลักษณะเดียวกัน โดยคำสั่ง Loop ที่อยู่ด้านในสุดจะตรงกับคำสั่ง Do ที่อยู่ด้านในสุด
โครงสร้างการควบคุมทางออก
ใช้คำสั่ง Exit เพื่อออกจาก For loop, Do loop, subprocess หรือ function process โดยตรง ไวยากรณ์ของคำสั่ง Exit นั้นง่ายมาก: ไม่มีการจำกัดจำนวนครั้งที่ ExitFor สามารถปรากฏในลูป For และไม่มีการจำกัดจำนวนครั้งที่ ExitDo สามารถปรากฏในลูป Do
Forcounter=startToend
[ขั้นบันได]
[บล็อกคำสั่ง]
[ออกเพื่อ]
[บล็อกคำสั่ง]
ถัดไป[เคาน์เตอร์[,เคาน์เตอร์][,...]]
ทำ[{ในขณะที่|จนกระทั่ง}เงื่อนไข]
[บล็อกคำสั่ง]
[ออกทำ]
[บล็อกคำสั่ง]
วนซ้ำ
คำสั่ง ExitDo สามารถใช้ได้ในทุกเวอร์ชันของไวยากรณ์ลูป Do
ExitFor และ ExitDo มีประโยชน์เพราะบางครั้งมันก็เหมาะสมที่จะออกจากลูปทันทีโดยไม่ต้องดำเนินการวนซ้ำหรือคำสั่งเพิ่มเติมภายในลูป ตัวอย่างเช่น ในตัวอย่างก่อนหน้าของแบบอักษรที่ใช้ร่วมกันระหว่างหน้าจอการพิมพ์และเครื่องพิมพ์ โปรแกรมยังคงเปรียบเทียบแบบอักษรของเครื่องพิมพ์กับแบบอักษรบนหน้าจอที่กำหนด แม้ว่าจะพบแบบอักษรเครื่องพิมพ์ดีดที่ตรงกันแล้วก็ตาม มีฟังก์ชันเวอร์ชันที่มีประสิทธิภาพมากกว่าที่จะออกจากลูปทันทีที่พบแบบอักษรที่ตรงกัน:
แบบฟอร์มย่อยส่วนตัว_คลิก()
DimSFont, PFont
ForEachSFontInScreen.Fonts()
ForEachPFontInPrinter.Fonts()
IfSFont=PFontแล้ว
PrintSfont
ExitFor 'ออกจากวงใน
สิ้นสุดถ้า
NextPFont
ถัดไปSFont
สิ้นสุดย่อย
ตามตัวอย่างนี้ คำสั่ง Exit มักจะปรากฏภายในคำสั่ง If หรือคำสั่ง SelectCase ซึ่งซ้อนกันอยู่ภายในลูป
เมื่อลูปถูกขัดจังหวะด้วยคำสั่ง Exit ค่าของตัวแปรตัวนับจะแตกต่างกันขึ้นอยู่กับวิธีการออกจากลูป:
1. เมื่อวงจรเสร็จสิ้น ค่าตัวนับจะเท่ากับค่าขีดจำกัดบนบวกกับค่าสเต็ป
2. เมื่อออกจากลูปก่อนเวลา ตัวแปรตัวนับจะคงค่าของมันไว้ ขึ้นอยู่กับกฎทั่วไปเกี่ยวกับช่วงค่า
3. เมื่อวนซ้ำนอกคอลเลกชัน หากตัวแปรตัวนับเป็นประเภท Object ค่าของตัวแปรจะเป็น Nothing หากตัวแปรตัวนับเป็นประเภท Variant ค่าของตัวแปรจะเป็น Empty
ออกจากรูทีนย่อยหรือขั้นตอนการทำงาน
นอกจากนี้ยังสามารถออกจากขั้นตอนจากภายในโครงสร้างการควบคุมได้อีกด้วย ไวยากรณ์ของ ExitSub และ ExitFunction คล้ายกับ ExitFor และ ExitDo ในส่วนก่อนหน้า "โครงสร้างการควบคุมการออก" ExitSub สามารถปรากฏที่ใดก็ได้ภายในเนื้อความของกระบวนการย่อย บ่อยเท่าที่ต้องการ
ExitSub และ ExitFunction จะมีประโยชน์เมื่อขั้นตอนเสร็จสิ้นแต่ละงานและสามารถส่งคืนได้โดยตรง ตัวอย่างเช่น หากคุณต้องการเปลี่ยนตัวอย่างก่อนหน้านี้เพื่อให้พิมพ์เฉพาะแบบอักษรแรกที่พบสำหรับเครื่องพิมพ์และหน้าจอ คุณสามารถใช้ ExitSub:
แบบฟอร์มย่อยส่วนตัว_คลิก()
DimSFont, PFont
ForEachSFontInScreen.Fonts()
ForEachPFontInPrinter.Fonts()
IfSFont=PFontแล้ว
PrintSfont
ExitSub 'ออกจากกระบวนการ
สิ้นสุดถ้า
NextPFont
ถัดไปSFont
สิ้นสุดย่อย
-