เร่งความเร็วมาโคร Calc ด้วยการอ่านและเขียนข้อมูลเป็นชุด

วิธีที่น่าเชื่อถือที่สุดในการเพิ่มความเร็วให้กับมาโคร Calc ที่ทำงานช้า คือการแทนที่การอ่านและเขียนข้อมูลทีละเซลล์ซ้ำๆ ด้วยการอ่านช่วงข้อมูลเพียงครั้งเดียว การวนลูปในหน่วยความจำ และการเขียนช่วงข้อมูลเพียงครั้งเดียว วิธีนี้จะลดการเรียกใช้ฟังก์ชันระหว่าง Basic และ Calc แต่ไม่รับประกันว่าความเร็วจะเพิ่มขึ้นอย่างแน่นอน เพราะสูตร การจัดรูปแบบ ขนาดไฟล์ และตรรกะของมาโครก็อาจส่งผลต่อเวลาการทำงานได้เช่นกัน ตัวอย่างด้านล่างแสดงการเปลี่ยนแปลงคอลัมน์สถานะและแสดงวิธีการวัดทั้งความเร็วและความถูกต้อง รายละเอียด API ได้รับการตรวจสอบกับเอกสาร LibreOffice 26.8 เมื่อวันที่ 9 ตุลาคม 2026

อะไรที่ควรปรับปรุง และคุณจะวัดผลอย่างไร?

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

ฟังก์ชัน ของ LibreOffice Basic Timerจะรายงานจำนวนวินาทีตั้งแต่เที่ยงคืนLongหากต้องการได้ค่าเป็นตัวเลขวินาที ให้กำหนดค่าให้กับตัวแปร สำหรับการทำงานระยะสั้น ให้บันทึกค่าเริ่มต้นและค่าสิ้นสุด แล้วนำมาลบกัน ถ้าค่าสิ้นสุดต่ำกว่า แสดงว่าการทำงานผ่านเที่ยงคืนไปแล้ว ให้บวก 86,400 วินาทีเข้าไปในผลต่าง ตัวจับเวลาจะรายงานค่าเป็นวินาทีเต็ม หากต้องการScriptForgeความแม่นยำระดับมิลลิวินาที ให้ใช้บริการ Timer ของ ScriptForge ดูเอกสารประกอบของ LibreOffice Basic Timerและเอกสารประกอบของบริการ Timer ของ ScriptForgeควรหลีกเลี่ยงการเปิด บันทึก และตรวจสอบเวิร์กบุ๊กด้วยตนเองในช่วงเวลาที่วัดได้ เว้นแต่ว่ากิจกรรมเหล่านั้นเป็นส่วนหนึ่งของงานหลัก

แผ่นงาน Calc ที่มีคอลัมน์ ID, Region และ Status พร้อมช่วงข้อมูลที่เลือกไว้
เริ่มต้นด้วยช่วงข้อมูลต่อเนื่องและเงื่อนไขเวิร์กบุ๊กเดียวกันสำหรับการทดสอบจับเวลาทุกครั้ง

เหตุใดมาโครขนาดใหญ่ใน Calc จึงทำให้การทำงานช้าลง?

ลูปที่เรียกgetCellByPosition()หรืออ่านและเขียนคุณสมบัติของเซลล์แต่ละรายการซ้ำๆ จะทำให้ Calc ต้องเรียกใช้ API ข้ามอินเทอร์เฟซ Basic-to-Calc สำหรับแต่ละการดำเนินการ ด้วยจำนวนแถวและคอลัมน์จำนวนมาก การเรียกใช้ API เหล่านั้นอาจเพิ่มขึ้นเรื่อยๆ แม้ว่าการแปลงข้อมูลนั้นจะง่ายก็ตาม ลูปที่วนซ้ำในอาร์เรย์ในหน่วยความจำยังคงเข้าถึงแต่ละแถว แต่จะหลีกเลี่ยงการเรียกใช้ API ของเซลล์แยกต่างหากสำหรับทุกค่า

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

คุณประมวลผลช่วงข้อมูลให้เป็นอาร์เรย์ได้อย่างไร?

ใช้ช่วงสี่เหลี่ยมผืนผ้าที่มีเฉพาะค่าที่มาโครของคุณต้องการเปลี่ยนแปลง ตัวอย่างนี้สมมติว่ามีชีตชื่อ `sheet_name` Dataแถวส่วนหัวอยู่ในแถวที่ 1 และค่าสถานะอยู่ในคอลัมน์ C เปลี่ยนชื่อชีตและช่วงให้ตรงกับเวิร์กบุ๊กของคุณ API getDataArray()จะส่งคืนช่วงเป็นแถวที่มีค่า และsetDataArray()เขียนอาร์เรย์ขนาดเดียวกันกลับไปยังช่วงนั้น

โปรแกรมแก้ไข LibreOffice Basic อ่านช่วงข้อมูลที่เลือกจาก Calc ลงใน aData โดยใช้ getDataArray
อ่านช่วงสี่เหลี่ยมที่ต้องการหนึ่งครั้งก่อนเริ่มลูปในหน่วยความจำ
Sub UpdateStatuses
    Dim oSheet As Object
    Dim oRange As Object
    Dim aData As Variant
    Dim i As Long

    oSheet = ThisComponent.Sheets.getByName("Data")
    oRange = oSheet.getCellRangeByName("A2:C10001")
    aData = oRange.getDataArray()

    For i = LBound(aData) To UBound(aData)
        If aData(i)(2) = "pending" Then
            aData(i)(2) = "review"
        End If
    Next i

    oRange.setDataArray(aData)
End Sub

อาร์เรย์แถวเริ่มต้นที่ศูนย์: aData(i)(2)โดยอ้างอิงถึงคอลัมน์ที่สามในแต่ละแถว ในที่นี้คือคอลัมน์ C เนื่องจากช่วงที่เลือกเริ่มต้นที่ A ลำดับภายนอกของอาร์เรย์แสดงถึงแถว และลำดับภายในแต่ละลำดับแสดงถึงคอลัมน์ ช่วงที่ส่งผ่านsetDataArray()ต้องมีมิติเท่ากับอาร์เรย์ หากไม่ตรงกันจะทำให้เกิดข้อผิดพลาด โปรดดูข้อมูลอ้างอิง API XCellRangeData ของ LibreOfficeและเอกสารประกอบอาร์เรย์ของ LibreOffice ScriptForge

มาโคร LibreOffice Basic สำหรับเปลี่ยนค่าที่รอการตรวจสอบในอาร์เรย์ในหน่วยความจำ และเขียนอาร์เรย์กลับเข้าไปใหม่
ใช้กฎในหน่วยความจำ จากนั้นเขียนอาร์เรย์ที่เสร็จสมบูรณ์ลงใน Calc ในการเรียกเพียงครั้งเดียว

อย่าอัปเดตเซลล์สูตรด้วยค่าอย่างเดียว

getDataArray()ส่งคืนค่าเซลล์เป็นตัวเลขหรือสตริง ไม่ใช่ข้อความสูตรเดิม หากคุณอ่านช่วงที่มีสูตรและเขียนอาร์เรย์นั้นกลับด้วยsetDataArray()สูตรเหล่านั้นอาจถูกแทนที่ด้วยผลลัพธ์ปัจจุบัน จำกัดวิธีการใช้ค่าอาร์เรย์เฉพาะเซลล์อินพุต/เอาต์พุตที่ควรมีค่าเท่านั้น เมื่อมาโครต้องรักษาหรือแก้ไขสูตร ให้ใช้วิธีการอาร์เรย์สูตรgetFormulaArray()และsetFormulaArray()หรือทำงานเฉพาะกับช่วงที่ไม่มีสูตรเท่านั้นเอกสารอ้างอิง API ของ XCellRangeFormula อธิบาย ส่วนติดต่อที่แยกจากกันนั้น

คุณควรเปลี่ยนการตั้งค่าการคำนวณหรือการแสดงผลเมื่อใด?

ทดสอบตัวเลือกเหล่านี้หลังจากวัดเวอร์ชันของอาร์เรย์แล้วเท่านั้น หากการคำนวณสูตรใหม่ใช้เวลาส่วนใหญ่ในการทำงาน คุณสามารถสอบถามข้อมูลisAutomaticCalculationEnabled()ปิดใช้งานการคำนวณอัตโนมัติชั่วคราวด้วยenableAutomaticCalculation(False)จากนั้นคืนค่าการตั้งค่าเดิมและคำนวณเซลล์ที่เปลี่ยนแปลงใหม่เมื่อจำเป็น ใส่การคืนค่าไว้ในเส้นทางการล้างข้อมูล เพื่อป้องกันไม่ให้ข้อผิดพลาดทำให้เวิร์กบุ๊กอยู่ในโหมดการคำนวณด้วยตนเอง อย่าปิดใช้งานการคำนวณหากมาโครต้องการผลลัพธ์สูตรใหม่ระหว่างขั้นตอน เอกสาร LibreOffice calculate()ระบุว่าการคำนวณเซลล์ที่เปลี่ยนแปลงใหม่เป็นการcalculateAll()บังคับให้คำนวณใหม่ทั้งหมด และอาจมีค่าใช้จ่ายสูง โปรดดูข้อมูลอ้างอิง API ของ XCalculatable

lockControllers()สามารถระงับการแจ้งเตือนบางอย่างที่ใช้สำหรับการอัปเดตการแสดงผลในขณะที่มาโครเปลี่ยนแปลงเซลล์จำนวนมาก จับคู่การล็อกทุกครั้งกับunlockControllers()รวมถึงเมื่อมาโครออกจากระบบผ่านตัวจัดการข้อผิดพลาด วิธีนี้จะช่วยลดงานการอัปเดตการแสดงผล แต่จะไม่ปิดการคำนวณสูตรหรือเปลี่ยนตรรกะต่อเซลล์ให้เป็นการดำเนินการแบบกลุ่ม ใช้สำหรับปัญหาคอขวดในการรีเฟรชหน้าจอที่วัดได้ ไม่ใช่ใช้แทนอาร์เรย์ช่วง ดูข้อมูลอ้างอิง API ของ XModel

คุณจะตรวจสอบการเปลี่ยนแปลงและรู้ได้อย่างไรว่าเมื่อใดควรเปลี่ยนวิธีการ?

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

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

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

ฝากความเห็น

ตั้งค่า LibreOffice ให้รู้จัก Java Runtime ของคุณ

ตั้งค่า LibreOffice ให้รู้จัก Java Runtime ของคุณ

ติดตั้ง Java runtime ที่เข้ากันได้ เปิดใช้งานใน LibreOffice และแก้ไขปัญหาเมื่อรายการ JRE ว่างเปล่า โดยไม่ต้องเปลี่ยนแปลงการตั้งค่าที่ไม่เกี่ยวข้อง

เรียกใช้งาน LibreOffice Headless ใน Docker เพื่อแปลงไฟล์ PDF

เรียกใช้งาน LibreOffice Headless ใน Docker เพื่อแปลงไฟล์ PDF

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

ลดขนาดไฟล์ LibreOffice Impress โดยไม่ทำให้ภาพเบลอ

ลดขนาดไฟล์ LibreOffice Impress โดยไม่ทำให้ภาพเบลอ

ลดขนาดไฟล์งานนำเสนอ LibreOffice ที่มีขนาดใหญ่เกินไป โดยการบีบอัดรูปภาพที่ฝังอยู่ เลือกการตั้งค่าภาพที่เหมาะสม และตรวจสอบคุณภาพของสไลด์ก่อนแชร์

หยุดการตัดขอบภาพพิมพ์ขนาดกำหนดเองใน LibreOffice

หยุดการตัดขอบภาพพิมพ์ขนาดกำหนดเองใน LibreOffice

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

เร่งความเร็วมาโคร Calc ด้วยการอ่านและเขียนข้อมูลเป็นชุด

เร่งความเร็วมาโคร Calc ด้วยการอ่านและเขียนข้อมูลเป็นชุด

แทนที่การเข้าถึงเซลล์ซ้ำๆ ด้วยการอ่านและเขียนช่วงข้อมูลจำนวนมาก จากนั้นทำการวัดประสิทธิภาพผลลัพธ์และปกป้องสูตรในเวิร์กบุ๊ก Calc ขนาดใหญ่

จัดระเบียบหนังสือ LibreOffice ด้วยเอกสารหลักที่เชื่อมโยงกัน

จัดระเบียบหนังสือ LibreOffice ด้วยเอกสารหลักที่เชื่อมโยงกัน

แบ่งต้นฉบับยาวๆ ออกเป็นบทๆ รวบรวมบทเหล่านั้นในโปรแกรม Writer และรักษาความสม่ำเสมอของรูปแบบ เนื้อหา และการตรวจสอบการส่งออก

เชื่อมต่อ LibreOffice Base กับ PostgreSQL ด้วยตัวช่วยสร้างในตัว

เชื่อมต่อ LibreOffice Base กับ PostgreSQL ด้วยตัวช่วยสร้างในตัว

ใช้ตัวเลือกการเชื่อมต่อ PostgreSQL โดยตรงของ Base เพื่อป้อนรายละเอียดเซิร์ฟเวอร์ เข้าสู่ระบบ บันทึกไฟล์การเชื่อมต่อ ODB และแก้ไขปัญหาข้อผิดพลาดในการเข้าถึงทั่วไป

ทำให้ฟอนต์แบบกำหนดเองพร้อมใช้งานสำหรับ LibreOffice Flatpak

ทำให้ฟอนต์แบบกำหนดเองพร้อมใช้งานสำหรับ LibreOffice Flatpak

ติดตั้งฟอนต์ในโฟลเดอร์ฟอนต์ของผู้ใช้ Linux รีสตาร์ท LibreOffice Flatpak และตรวจสอบว่าฟอนต์ปรากฏใน Writer โดยไม่ลดระดับการรักษาความปลอดภัยแอป

แก้ปัญหาโปรแกรม LibreOffice Save ขัดข้องบน Sonoma: ทำงานในพื้นที่ก่อนเป็นอันดับแรก

แก้ปัญหาโปรแกรม LibreOffice Save ขัดข้องบน Sonoma: ทำงานในพื้นที่ก่อนเป็นอันดับแรก

ปกป้องงานของคุณและแยกปัญหาการบันทึกข้อมูลผิดพลาดบนไดรฟ์เครือข่ายใน LibreOffice บน macOS Sonoma ด้วยเวิร์กโฟลว์ที่เน้นการบันทึกในเครื่องเป็นหลัก การตรวจสอบสิทธิ์ และการทดสอบแบบเจาะจง

รักษารหัส CSV ไว้ใน Calc โดยการนำเข้าเป็นข้อความ

รักษารหัส CSV ไว้ใน Calc โดยการนำเข้าเป็นข้อความ

รักษาเลขศูนย์นำหน้าใน Calc โดยการตั้งค่าคอลัมน์ ID เป็นข้อความระหว่างการนำเข้า CSV ตรวจสอบการแสดงตัวอย่าง และตรวจสอบข้อมูลที่บันทึกไว้