บทความ

เทคนิคการใช้ Recordset ในการเปิดตารางฐานข้อมูล ของ Access VBA

เทคนิคการใช้ Recordset ของ MS Access ใช้ DAO หรือ ADO ทั้ง DAO และ ADO ต่างก็มีวัตถุ Recordset เหมือนกัน แต่มี method properties และ options ต่างกัน แต่ DAO เป็น native library ที่ของ ACCESS MS Access แต่ละรุ่นมีการตั้งค่า Default ของ Library ต่างกัน ดังนั้น ในการกำหนด Dim ต้องกำหนดให้ชัดเจน เช่น Dim rst as DAO.Recordset ไม่ใช่ Dim rst as Recordset ควรกำหนด Type ให้กับ Recordset เสมอ โดยปกติ Access จะกำหนด Type เป็นแบบ Dynaset (dbOpenDynaset) เมื่อเปิด Query หรือ ตารางเชื่อมโยง และกำหนด Type  เป็นแบบ Table (dbOpenTable)เมื่อเปิดตารางในฐานข้อมูลเดียวกัน ซึ่งทั้งสองประเภทนี้มี Method ที่ต่างกัน เช่น dbOpenTable มี Seek แต่ไม่มี FindFirst เป็นต้น ดังนั้น ถ้าไม่กำหนด Type และเมื่อมีการแยกตารางออกเพื่อให้มี Front End และ Back End จะทำให้เกิด Error ได้ - ควรกำหนด Type เป็นแบบ Dynaset จะครอบคลุมได้ทุกกรณี - dbOpenTable มี Seek method ที่ทำงานได้เร็วมาก แต่จะใช้กับ SQL Statement ไม่ได้ - ถ้าต้องการความเร็ว และไม่ต้องการแก้ไขข้อมูล ให้กำหนด Type เป็น dbOpenSnapshot ตัวอย่าง

ฟังก์ชัน like ของ Excel

รูปภาพ
ขึ้นต้นว่า ฟังก์ชัน like ของ Excel ก็ผิดเสียแล้ว เพราะ Excel ไม่มีฟังก์ชัน likeถ้าต้องการเปรียบเทียบ เหมือนกับการใช้ like ของ Excel จะทำอย่างไร วันก่อนผมต้องการนับอาชีพของคน จำนวน 24,000 คน จะนับทีละเซลล์คงไม่ไหว ปัญหาคือว่า บางคนเขียนอาชีพเดียวกัน ต่างกัน เช่น ลูกจ้าง รับจ้าง ลูกจ้างบริษัท ลูกจ้างชั่วคราว เป็นต้น อาชีพพวกนี้ ถือเป็นอาชีพรับจ้างทั้งหมด จึงต้องนับเป็นอาชีพเดียวกัน วิธีการ สร้างสูตร โดยใช้หน้าต่าง VBA เขียนโค้ดเหมือนกับสูตร like เพื่อนับว่า อาชีพดังกล่าว มีคำว่า จ้าง หรือไม่ ใช้ฟังก์ชัน Countif() เพื่อนับจำนวนที่เป็นจริง คือ มีคำว่า จ้าง การสร้าง ฟังก์ชัน like เพิ่ม Developer Tab บนริบบิ้น (Excel 2010 ไปที่ File > Option > Customize Ribbon > Developer) เปิดหน้าจอเขียนโค้ด (ไปที่ Developer Tab >  Visual Basic หรือกด Alt + F11) ถ้าไม่เห็นหน้าจอเขียนโค้ด ให้เลือกเมนู View > Code พิมพ์ฟังก์ชัน ดังภาพ Function isLike(myText As String, myWord As String) As Boolean       isLike = " " & myText & " " Like "*"

การปัดเศษขึ้น เป็นเลขจำนวนเต็ม ของ Access VBA

รูปภาพ
วันก่อนผมเขียนโปรแกรมสำหรับพิมพ์ใบปะหน้าซองข้อสอบ และต้องการคำนวณจำนวนกล่องที่ใช้ในการบรรจุข้อสอบ วิธีการคือ เอาจำนวนแผ่นกระดาษเป็นตัวตั้ง และหารด้วยจำนวนกระดาษในกล่องแต่ละขนาดที่สามารถบรรจุกระดาษได้ เช่น กล่องขนาดใหญ่ บรรจุกระดาษได้ 2,500 แผ่น ถ้ามีกระดาษ 5,000 แผ่น ก็ต้องใช้กล่อง 2 กล่อง ทีนี้ ถ้าในกรณีที่มีกระดาษ 2,600 แผ่น  ก็จะเหลือเศษไม่ถึงครึ่ง ถ้าใช้การปัดเศษธรรมดา ก็จะได้เป็น 2 กล่อง แต่ความจริงแม้จะเหลือเศษนิดหน่อยก็ต้องใช้กล่องอีกกล่องหนึ่ง ดังนั้นจึงต้องมีการปัดเศษขึ้นเป็นจำนวนเต็ม ไม่ว่าจะเหลือเศษเท่าไรก็ตาม Access ไม่มีฟังก์ชันการปัดเศษขึ้นเสมอ ถ้าจะใช้ฟังก์ชัน Round() ก็จะไม่ได้ผลที่ต้องการ อย่างนี้ต้องใช้ฟังก์ชัน int() แต่มีวิธีการเขียนเสียใหม่ เพื่อให้ได้เศษปัดขึ้นเสมอ เช่น 22 หารด้วย หารด้วย 3 จะได้ เท่ากับ 7.33 ปัดเศษ เป็น 8 สูตรมีดังนี้ -int(-ตัวตั้ง/ตัวหาร) ตัวอย่าง 22 หารด้วย 3 จะได้ค่าเป็น  7.33 ถ้าปัดเศษธรรมดา จะได้ 7 แต่ถ้าต้องการให้ได้ 8 ต้องเขียน -int(-22/3) ซึ่งถ้าพิมพ์ใน immediate window จะได้ผลดังภาพ ฟังก์ชัน Round() การปัดเศษธรร

ตัวแปร global ของ MS Access VBA

รูปภาพ
VBA มี Scope ของค่าตัวแปร ที่จำกัดอยู่ใน Procedure หรือ Module ซึ่งเมื่อออกจาก scope นั้น ๆ ไปแล้ว ค่าของตัวแปรจะหมดไปด้วย ถ้าต้องการรักษาค่านั้นไว้ เพื่อนำไปใช้ใน procedure หรือที่อื่น ๆ ในฐานข้อมูล ต้องประกาศให้เป็นตัวแปรแบบ Global ซึ่งทำได้ ดังนี้ ไปที่แถบ Modules สร้างโมดุลใหม่ หรือจะใช้โมดุลที่มีอยู่แล้วก็ได้ เปิดโมดูล และประกาศค่าตัวแปรให้ใช้งานได้ทั้งฐานข้อมูล โดยใช้ว่า Public นำหน้า เรียกใช้งานตัวแปรนี้ ในที่ต่าง ๆ โดยไม่ต้องประกาศ Dimension (Dim) ของตัวแปรนั้น ๆ ถ้าต้องการกำหนดค่าของตัวแปรไปด้วย ก็สามารถทำได้ เช่น Public Const previousForm as String = "frmMain" มีข้อควรระวังคือ เมื่อเกิดมี Error ค่าของตัวแปรจะหมดไปด้วย ควรมีการ Trap Error ไว้เพื่อตรวจสอบในทุก procedure ด้วย

การใช้ VBA สั่งเปิดรายงานแบบมีเงื่อนไข (MS Access)

รูปภาพ
รายงานที่นำข้อมูลมาจาก Query สามารถกำหนดเงื่อนไขในการแสดงข้อมูลได้ ดังนี้ กำหนดเงื่อนไขโดยตรงในช่อง Criteria ของ Query นั้น ๆ  เช่น ถ้าเราต้องการให้นำข้อมูลของอำเภอนครหลวงมาแสดง ให้พิมพ์ข้อความในเครื่องหมายคำพูดในช่อง Criteria ดังภาพ ถ้าเป็นการสั่งจากฟอร์ม เราสามารถกำหนดให้นำข้อความจาก กล่องข้อความ list box หรือ combo box มาเป็นเงื่อนไขได้ โดยการอ้างอิงถึง กล่องข้อความในช่องเงื่อนไข ในภาพ เป็นการอ้างอิงข้อความชื่อวิชา ที่อยู่ใน กล่องข้อความ ในแบบฟอร์มชื่อ frmShowAll_by_Subject (อ่านวิธีการอ้างอิงถึง Object  คลิกที่นี่ ) ใช้ stLinkcriteria เพื่อกำหนดเงื่อนไขในการเปิดฟอร์ม  วิธีนี้เหมาะสำหรับการกำหนดเงื่อนไขที่มีการใช้สูตร เช่น ถ้าต้องการให้แสดงชื่อวิชาทั้งหมด หรือให้เลือกเฉพาะวิชาใดวิชาหนึ่งที่ต้องการ เราสามารถกำหนดเงื่อนไข ใน stLinkCriteria ได้ ตัวอย่างนี้ เป็นการกำหนดเงื่อนไข ให้นำข้อความใน list box ชื่อ lstSubNames มาเป็นเงื่อนไขในการเปิดรายงาน ตามที่ระบุ แต่ถ้าหาก ข้อความใน lstSubNames เป็นเครื่องหมายดอกจัน (*) ก็ให้นำข้อมูลทุกวิชามาแสดง         If Me.lstSubNames.Valu

การสร้าง QAT บนริบบิ้น ของ Access 2010

รูปภาพ
เมื่อมี การสร้างริบบิ้นขึ้นใช้เอง โดยสร้างตาราง USysRibbons และเขียน XML กำหนดค่า ต่าง ๆ จะไม่พบว่ามี Quick Access Toolbar (QAT) ที่ทำให้เข้าถึงคำสั่งต่าง ๆ ที่ใช้บ่อย ๆ ได้ ถ้าต้องการให้มี QAT ต้องเขียนเพิ่มเข้าไปใน XML ดังนี้ <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" > <ribbon startFromScratch="true"> <qat> <documentControls> <button idMso="FileSave"/> <control idMso="Undo" /> <control idMso="Redo" /> <button idMso="Paste"/> <button idMso="PrintDialogAccess"/> </documentControls> </qat> <tabs> <tab idMso="TabHomeAccess" visible="true" /> ... ภาพที่ได้ จะเป็นดังนี้ มีข้อสังเกตคือ FileSave เป็นปุ่ม (Button) ส่วน Redo และ Undo เป็น Control

ไม่สามารถคัดลอก และวาง จาก Excel มาที่ Access

รูปภาพ
โดยปกติ โปรแกรม MS Access และ MS Excel สามารถถ่ายโยงกันได้ เช่น ลากดำ และกดปุ่ม คัดลอก หรือ Copy จากโปรแกรม MS Excel และมาวาง ในโปรแกรม MS Access ได้ทันที ไม่มีปัญหา แต่บางทีสิ่งที่ไม่คาดคิดก็เกิดขึ้น นั้นคือ ไม่สามารถวางสิ่งที่คัดลอกจาก Excel มาไว้ใน Access ได้ โดยมีข้อความแจ้งให้ทราบว่า ข้อมูลที่คัดลอกไปที่คลิปบอร์ดเสียหาย ไม่สามารถวางได้ ลองปิดโปรแกรม แล้วเปิดใหม่ ปิดเครื่องแล้วเปิดใหม่ ก็ไม่หาย สาเหตุหลักเกิดมาจากการ update ของไมโครซอฟท์ ทำให้เกิดปัญหาด้านความปลอดภัยของ Excel เลยทำให้ไม่สามารถคัดลอก และวาง ใน Access ได้  อ่าน KB958437  และ KB967699 การแก้ไข วิธีที่ 1 คัดลอกแล้วปิดโปรแกรม Excel คัดลอกจาก Excel แล้วปิดโปรแกรม Excel เมื่อเขาถามว่า จะเอาสิ่งที่คัดลอกไว้ในคลิปบอร์ดเก็บไว้เพื่อให้สามารถเอาไปใช้กับโปรแกรมแกรมอื่น หรือไม่ ต้องตอบว่าใช่ คลิกที่ Access และกดปุ่ม วาง หรือ Paste เท่านี้ก็สามารถวางได้ วิธีที่ 2 คัดลอกจาก Excel แล้วมาที่ Access และ Paste จาก คลิกปบอร์ด คัดลอกจาก Excel มาที่ Access คลิกเพื่อเปิด คลิปบอร์ด จะเห็นสิ่งที่คัดลอกจาก Excel ค

เทคนิค Access VBA

รูปภาพ
เทคนิค เกร็ด การใช้ VBA กับ Microsoft Access การสั่งไม่ให้ใช้ คลิกขวา ที่ฟอร์ม หรือ รายงาน เปิดฟอร์มหรือรายงานแบบ มุมมองออกแบบ หรือ Design View ที่ on load เขียนคำสั่งเพิ่ม ดังนี้ Forms("ชื่อฟอร์ม หรือชื่อรายงาน").ShortcutMenu = False เมื่อเปิดฟอร์ม จะไม่สามารถใช้คลิกขวาได้ การใช้ Combo box กำหนด Row Source Type เป็น Table/Query เมื่อต้องการนำข้อมูลจากตารางหรือ Query มาแสดง ถ้าจะใส่ข้อมูลเอง ให้กำหนด Row Source Type เป็น Value list ถ้าจะเคลียข้อมูลใน Combo box ให้ใช้คำสั่ง me.ชื่อ combo box. RowSource = "" ในกรณีที่ต้องการสร้าง Comob box 2 อัน เมื่อเลือกอันที่หนึ่งแล้ว ให้เป็นเงื่อนไขที่จะนำตัวเลือกมาแสดงใน combo box อันที่ 2 เช่น เมื่อเลือกจังหวัดแล้ว ให้นำชื่ออำเภอของจังหวัดที่เลือก มาให้เลือกใน Combo box อันที่ 2 ทำดังนี้ - สร้างตาราง 2 ตาราง สำหรับเป็นข้อมูลจังหวัด และ อำเภอ ตารางจังหวัด ตารางอำเภอ - สร้าง combo box 2 อัน สมมุติชื่อ cboProvince และ cboAmphur -กำหนด Row Source Type ทั้งสอง เป็น Table/Query เพราะต้องเอาข้อมูลมาจาก ตาราง เนื่

พื้นที่ฟรี บนอินเทอร์เน็ต (cloud) กับ skydrive

รูปภาพ
หลายคนพูดเรื่อง Cloud (ก้อนเมฆบนฟ้า) หรือ พื้นที่เก็บไฟล์บน อินเทอร์เน็ต เพราะ นอกจากจะสะดวกที่ไปอยู่ที่ไหน ๆ ที่เข้าอินเทอร์เน็ตได้ ก็เรียกไฟล์มาใช้งานได้ และยังใช้เป็นที่เก็บสำรองไฟล์ได้ด้วย เผื่อว่า เครื่องคอมพิวเตอร์ที่ใช้อยู่ มีปัญหา ก็ยังมีไฟล์สำรอง ไม่หายไปพร้อมกับฮาร์ดดิสก์ ที่ถูกไวรัสโจมตีได้ บางคนเขาบอกว่า เขาเก็บไฟล์โดยใช้บริการ Cloud ทั้งหมดเลย ยกเว้นข้อมูลที่เกี่ยวกับการเงินเท่านั้น นี่ก็แสดงให้เห็นแล้วว่า บริการนี้ กำลังได้รับความนิยมกันมากทีเดียวนะครับ เพราะ ประหยัดและปลอดภัย (ระดับหนึ่ง ในกรณีใช้เป็นการ สำรองไฟล์) ด้วยนะครับ ผม เคยพูดเรื่องการเก็บไฟล์ บนเว็บ ของ Dropbox แล้วครั้งหนึ่ง Dropbox ก็เป็น Cloud ที่เก็บไฟล์แนวหน้าเว็บหนึ่ง วันนี้ จะมีทางเลือก คือ ใช้ SkyDrive ของ Hotmail นี่ก็ฟรีเหมือนกัน ของฟรีอื่น ๆ ที่เก็บข้อมูลบน Cloud ก็มีอีกหลายตัว เช่น ของ Google ก็มี  Google Docs นอกจากนี้ ก็มีอีกเยอะ เช่น  Evernote   CloudApp   SpiderOak , Box , Wuala  และ SugarSync  เป็นต้น SkyDrive ให้พื้นที่ฟรี 25 GB เยอะมากเหมือนกัน ข้อดีอย่างหนึ่ง ก็คือ เนื่องจากว่า เป็

โทษของถั่วเหลือง

รูปภาพ
วันก่อน ฟังวิทยุ WDCF-AM 1350 TAMPA BAY รายการ  Sustainable Health ของ Lord Rudi C. Loehwing ได้ความรู้ใหม่ว่า อาหารที่ทำจากถั่ว (soy) เช่น ถั่วเหลือง โดยผ่านกระบวนการหมักดอง มีประโยชน์มากกว่าที่ไม่ผ่านกระบวนการหมักดอง อาหารจากถั่วที่ไม่ผ่านกระบวนการหมักดอง กินเข้าไปแล้ว สามารถเกิดโทษได้หมือนกัน เพราะ ถั่วเหลือง (soy) เป็น หนึ่งในแปดของกลุ่มอาหารที่มักเป็นสาเหตุก่อโรคภูมิแพ้ ( Allergens ) สามารถเกิดอาการแพ้ได้ทันที เช่น ไอ จาม น้ำมูกไหล ท้องร่วง ท้องเสีย เป็นต้น อาการแพ้อาจจะไม่แสดงผลในทันที แต่อาจจะแสดงหลังจากกินแล้ว หลายชั่วโมง หรือหลายวัน ก็ได้ ผมตรวจสอบกับเว็บของ สำนักงานมาตรฐานสินค้าเกษตรและอาหารแห่งชาติ พบว่า สินค้าสำคัญ 8 กลุ่ม ที่เป็นต้นเหตุของการก่อภูมิแพ้อาหาร 90% ได้แก่ นม ไข่ สัตว์น้ำ สัตว์ไม่มีกระดูกสันหลังที่มีเปลือก ถั่วประเภท tree nuts ถั่วลิสง แป้งข้าวสาลี และถั่วเหลือง ต้องยอมรับว่าเป็นความรู้ใหม่จริง ๆ ผมก็เลยต้อง Google ดู พบว่ามีการพูดถึงเรื่องนี้กันมาหลายปีแล้ว ข้อมูลเท่าที่ผมพบ มีตั้งแต่ปี 2004 (พ.ศ. 2547) Loehwing บอกว่า  เราเชื่อว่าอาหารที่มาจากถั่ว