วิธีสร้างและเรียกใช้มาโครใน LibreOffice Calc บน Linux

LibreOffice คือคำตอบของโลก FOSS สำหรับ Microsoft Office Suite หลักและเป็นกรรมสิทธิ์ พัฒนาโดยนักพัฒนาซอฟต์แวร์และผู้สนับสนุนซอฟต์แวร์ Office Productivity ชั้นนำ โดยสามารถทดแทน Microsoft Office ได้อย่างสมบูรณ์บนระบบปฏิบัติการหลายระบบ

แอป LibreOffice ที่เทียบเท่ากับ Microsoft Excel เรียกว่า LibreOffice Calc มันมาพร้อมกับคุณสมบัติมากมายและอินเทอร์เฟซที่คล้ายกับ Excel มีเอ็นจิ้นมาโครในตัวเพื่อพัฒนาและเรียกใช้ Macros สำหรับระบบอัตโนมัติ อย่างไรก็ตาม ไม่รองรับ Visual Basic แต่รองรับภาษาของตัวเอง LibreOffice Basic สำหรับการเขียนโปรแกรมมาโคร

ชุดโปรแกรม LibreOffice ติดตั้งมาล่วงหน้าแล้วในลีนุกซ์ส่วนใหญ่ รวมถึง Ubuntu, Debian, Fedora และ CentOS

การสร้างและเรียกใช้แมโครใน LibreOffice Calc

ขั้นแรก มาสร้างเวิร์กชีตที่มีข้อมูลตัวอย่างกันก่อน

หากต้องการเปิดตัวจัดระเบียบ Macros ให้ไปที่ เครื่องมือ » มาโคร » จัดระเบียบมาโคร » LibreOffice Basics. มันจะเปิด LibreOffice Basic Macros หน้าต่างตามที่แสดงในภาพหน้าจอด้านล่าง

ป้อนชื่อใหม่สำหรับมาโคร จากนั้นคลิกปุ่มใหม่ ที่ด้านล่างขวาของหน้าต่าง

ตอนนี้คุณควรเห็นหน้าจอตัวแก้ไขมาโครใน LibreOffice Basic

ดังที่เราเห็น Macros ที่สร้างขึ้นด้วยตนเองนั้นสร้างโดยค่าเริ่มต้นภายใต้ “My Macros & Dialogs -> Standard -> Module1”

ขณะนี้มีมาโครสองรายการ: หนึ่งคือ หลักซึ่งเป็นมาโครว่างเริ่มต้น และ is . อื่นๆ ทดสอบ, มาโครที่เราสร้างไว้ด้านบน ตอนนี้เราจะปรับปรุงมาโครทดสอบ

มาโครของเราจะทำหน้าที่ดังต่อไปนี้:

  • ตรวจสอบว่าทุกคนมีอาชีพนักเขียน
  • สร้างแผ่นงานใหม่
  • ย้ายรายการทั้งหมดสำหรับนักเขียนในชีตใหม่

ต่อไปนี้เป็นมาโครของเรา:

Sub test rem ย้ายรายการด้วยอาชีพ Writer ไปยังแผ่นงานใหม่ dim crs(8) เป็นวัตถุ dim j เป็น Integer dim prof เป็นวัตถุ dim i เป็นจำนวนเต็ม dim sh เป็นวัตถุ dim sh2 เป็นวัตถุ sh = ThisComponent.Sheets(0) crs(0) = sh.getCellRangeByPosition(0, 0, 3, 0) j = 1 for i = 1 ถึง 5 x = 1 prof = sh.GetCellByPosition(3, i) rem เก็บแถวทั้งหมดไว้ในตัวแปร ถ้า prof.string = "Writer" แล้ว crs(j) = sh.getCellRangeByPosition(0, i, 3, i) j = j + 1 End If next i rem ตอนนี้สร้างชีตใหม่และเขียนข้อมูลนี้ที่นั่น ThisComponent.Sheets.insertNewByName("Writers", 1) sh2 = ThisComponent.Sheets(1) i = 0 Do while not IsNull(crs(i)) sh2range = sh2.getCellRangeByPosition(0, i, 3, i) sh2range.setDataArray(crs(i).getDataArray) i = i + 1 วงจบย่อย

ให้ฉันอธิบายมาโครด้านบนให้คุณฟังทีละส่วน

การทดสอบย่อย . . จบซับ

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

เรม 

ความคิดเห็นทั้งหมดใน LibreOffice Basic เริ่มต้นด้วยคำสำคัญ เรม. บรรทัดสมบูรณ์ที่ขึ้นต้นด้วย rem ถือเป็นความคิดเห็น อีกวิธีหนึ่งคือการใช้ ' (เครื่องหมายจุลภาคกลับด้านเดียว) ที่จุดเริ่มต้นของบรรทัด

สลัว crs (8) เป็นวัตถุสลัว j เป็นจำนวนเต็ม สลัว prof เป็นวัตถุหรี่ i เป็นจำนวนเต็มสลัว sh เป็นวัตถุสลัว sh2 เป็นวัตถุ

นี่คือการประกาศตัวแปรใน LibreOffice Basic ไวยากรณ์ทั่วไปคือ ติ่มซำ . ในการประกาศอาร์เรย์ ให้ใช้ไวยากรณ์ที่คล้ายกับตัวแปร crs โดยที่ 8 คือความยาวของอาร์เรย์

sh = ThisComponent.Sheets(0) crs(0) = sh.getCellRangeByPosition(0, 0, 3, 0) j = 1

ส่วนประกอบนี้ หมายถึงเอกสารปัจจุบัน ในกรณีนี้คือแผ่นงานคำนวณ เราโหลดชีตที่มีดัชนี 0, เช่นชีตแรกในตัวแปร sh นอกจากนี้ยังมีฟังก์ชันในการโหลดชีตโดยใช้ชื่อ

ต่อไปเราจะเรียกฟังก์ชัน getCellRangeByPosition ของ object sh และโหลดลงใน array crs Cell Range หมายถึงกลุ่มของเซลล์ในชีตตามตำแหน่ง

สังเกตว่าข้อโต้แย้ง 0, 0 (คอลัมน์ 0, แถว 0) แสดงถึงเซลล์เริ่มต้นของช่วง และ 3, 0 (คอลัมน์ 3 แถว 0) แสดงถึงเซลล์สิ้นสุดของช่วง ดังนั้น 0, 0, 3, 0 หมายถึงแถวแรก (หัวเรื่อง) ของแผ่นงานตัวอย่างของเรา

สำหรับ i = 1 ถึง 5 x = 1 prof = sh.GetCellByPosition(3, i) rem เก็บแถวทั้งหมดไว้ในตัวแปร ถ้า prof.string = "นักเขียน" แล้ว crs(j) = sh.getCellRangeByPosition(0, i, 3, i ) j = j + 1 End ถ้าต่อไป i

เราใช้ a สำหรับ คำสั่งวนรอบแถว ดิ สำหรับ บล็อกลงท้ายด้วย a ต่อไป คำสั่งซึ่งเพิ่มตัวแปร i เมื่อสิ้นสุดการวนซ้ำแต่ละครั้ง

ต่อไปเราจะเรียกฟังก์ชัน GetCellByPosition ของวัตถุ sh. เราส่งผ่านพารามิเตอร์ (3, ผม)กล่าวคือ ในการวนซ้ำแต่ละครั้ง วัตถุของเซลล์ในคอลัมน์ 3 และแถว i จะถูกดึงข้อมูลในตัวแปร prof

จากนั้นเราใช้ an ถ้า คำสั่งตรวจสอบว่าค่าในเซลล์ prof คือ "Writer" หรือไม่ ถ้าใช่ เราจะเรียกฟังก์ชันนี้อีกครั้ง getCellRangeByPosition, ครั้งนี้, กับ ผม แทนที่หมายเลขแถวเริ่มต้นและสิ้นสุด อีกครั้งเราเก็บไว้ในอาร์เรย์ crs.

ThisComponent.Sheets.insertNewByName("นักเขียน", 1) sh2 = ThisComponent.Sheets(1)

ก่อนอื่นเราสร้างแผ่นงานใหม่ด้วยชื่อ นักเขียน, ณ ตำแหน่ง 1ซึ่งเป็นตำแหน่งที่ 2 เนื่องจากดัชนีเริ่มต้นที่ 0 จากนั้นเราได้วัตถุของแผ่นงานที่สร้างขึ้นใหม่นี้ เพื่อที่เราจะสามารถป้อนข้อมูลของผู้เขียนในแผ่นงานนี้

ผม = 0 ทำในขณะที่ไม่ใช่ IsNull(crs(i)) sh2range = sh2.getCellRangeByPosition(0, i, 3, i) sh2range.setDataArray(crs(i).getDataArray) i = i + 1 Loop

ดิ ทำในขณะที่ คำสั่งลูปใช้เมื่อเราต้องการวนซ้ำตามเงื่อนไขซึ่งตรงข้ามกับการวนซ้ำในช่วงของค่าจำนวนเต็มซึ่งใช้ สำหรับ ดังที่แสดงไว้ก่อนหน้านี้ ที่นี่เราวนจนถึง crs(ผม) ไม่เป็นโมฆะ

ต่อไปเราจะโทรอีกครั้ง getCellRangeByPosition ในลักษณะเดียวกันกับเมื่อก่อนเพื่อรับวัตถุช่วงในแผ่นงานใหม่

ในที่สุด เราเรียกสองฟังก์ชัน: getDataArray ซึ่งส่งคืนข้อมูลจาก crs(ผม)นั่นคือ ข้อมูลหนึ่งแถว (เกี่ยวกับผู้เขียน) จากชีตแรก และเราเขียนข้อมูลนี้ไปยังช่วงเซลล์ในชีตใหม่โดยใช้ setDataArray.

สุดท้ายให้บันทึกมาโครจาก ไฟล์ » บันทึกทั้งหมด ตัวเลือก.

ในการเรียกใช้แมโคร ไปที่ เครื่องมือ » มาโคร » เรียกใช้ Macro และเลือกมาโครของคุณจากไดเร็กทอรี "My Macros" ในไลบรารี Macro Selector คลิก วิ่ง ปุ่มหลังจากเลือกชื่อมาโคร

การเรียกใช้มาโครด้านบนในสเปรดชีตตัวอย่างของเรา ได้ผลลัพธ์ดังต่อไปนี้

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

? ไชโย!