บทความ

กำลังแสดงโพสต์ที่มีป้ายกำกับ access vba

การตรวจสอบ เลขบัตรประจำตัวประชาชน ด้วย Access VBA

รูปภาพ
การตรวจสอบ เลขบัตรประจำตัวประชาชน การตรวจสอบหมายเลขบัตรประจำตัวประชาชน ใช้ตัวเลขหลักที่ 13 เป็นตัวตรวจสอบ ตัวเลขหลักที่ 13 เกิดจากการนำเอาตัวเลข 12 ตัวแรก มาคำนวณ ตามวิธีการที่กำหนด แล้วจะได้ตัวเลขหลักที่ 13 ซึ่งมีวิธีการคำนวณ ดังนี้ ขั้นที่ 1 หาผลคูณของตัวเลขหลักที่ 1-12 กับ ตัวเลข ตั้งแต่ 12 ถึง 1 ดังนี้             ตัวเลขหลักที่ 1 X 12             ตัวเลขหลักที่ 2 X 11             ตัวเลขหลักที่ 3 X 10             ตัวเลขหลักที่ 4 X 9             ตัวเลขหลักที่ 5 X 8             ตัวเลขหลักที่ 6 X 7             ตัวเลขหลักที่ 7 X 6             ตัวเลขหลักที่ 8 X 5             ตัวเลขหลักที่ 9 X 4             ตัวเลขหลักที่ 10 X 3             ตัวเลขหล...

การแยกชื่อไฟล์ ออกจาก Path ด้วย Access VBA

รูปภาพ
เมื่อมีการใช้ File Dialogue ให้ผู้ใช้เลือกไฟล์ในเครื่อง โดยให้แสดง File Dialog ดังภาพ เมื่อผู้ใช้เลือกไฟล์ที่ต้องการและเราต้องการแยกชื่อไฟล์ออกจาก Path มีฟังก์ชั่น ที่ dzone.com สามารถนำไปใช้ได้ทันที ตามโค้ดตามโค้ดข้างล่างนี้ Function GetFilenameFromPath ( ByVal strPath As String ) As String   If Right $( strPath , 1 ) <> "\" And Len ( strPath ) > 0 Then GetFilenameFromPath = GetFilenameFromPath ( Left $( strPath , Len ( strPath ) - 1 )) + Right $( strPath , 1 )     End If End Function ตัวอย่างการใช้งาน (บรรทัดที่มีตัวหนังสือสีแดง) Private Sub Command0_Click() On Error GoTo ErrHandler      Dim f As Object     Dim fileAddress As String     Dim selectedFileName As String      Set f = Application.FileDialog(3)          f.AllowMultiSelect = False       ...

การดาวน์โหลดไฟล์จาก อินเทอร์เน็ต ด้วย Access 2010 VBA

รูปภาพ
ก่อนการใช้ MS Access 2010 ดาวน์โหลดไฟล์จากอินเทอร์เน็ต ต้องตรวจสอบเสียก่อนว่า ขณะนี้สามารถเข้าอินเทอร์เน็ตได้หรือไม่ โดยใช้ฟังก์ชันต่อไปนี้ Function checkInternetConnection() As Integer 'code to check for internet connection 'by Daniel Isoje On Error Resume Next  checkInternetConnection = False  Dim objSvrHTTP As ServerXMLHTTP  Dim varProjectID, varCatID, strT As String  Set objSvrHTTP = New ServerXMLHTTP  objSvrHTTP.Open "GET", " http://www.google.com "  objSvrHTTP.setRequestHeader "Accept", "application/xml"  objSvrHTTP.setRequestHeader "Content-Type", "application/xml"  objSvrHTTP.send strT  If Err = 0 Then  checkInternetConnection = True  Else   MsgBox "Internet connection not estableshed: " & Err.Description & "", 64, "Additt !"  End If End Function ฟังก์ชันนี้ ต้องอ้างอิงถึง Microsoft XML, v6.0 เสียก่อน จึงจะใช้งานได้ โดยที่หน้าจอเขียนโค้ด ไปที่ Tool >...

การป้องกัน VBA Code ของ MS Access

รูปภาพ
ปัญหา MS Access 2007/2010 เมื่อ compile โดยจัดทำเป็น accde แล้วมีปัญหาเมื่อนำไปใช้กับ Windows ที่ต่างรุ่นกัน เช่นทำจาก Vista / Office 2010 เมื่อนำไปใช้กับ Windows 7 / Office 2010 หรือ Windows XP / Office 2010 มีปัญหา เปิดไม่ได้ บอกว่าไม่รู้จัก ทั้ง ๆ ที่เป็น Office 2010 ด้วยกันเอง การแก้ไข ไม่ต้อง compile เป็น accde แต่ ยังคงใช้เป็น accdb เหมือนเดิม แต่ใส่รหัสที่โค้ด เพื่อไม่ให้เปิดดูได้ เพราะถ้าเปิดได้ และแก้ไขโค้ด ก็จะทำให้โปรแกรมที่เขียน ทำงานไม่ได้ตามที่ต้องการ หรืออาจจะไม่ทำงานเลย วิธีการใส่รหัสเพื่อไม่ให้เปิดดูโค้ด ทำดังนี้ เปิดหน้าจอ VBA (กด Atl + F11) ไปที่ Tools > Database Properties ...จะเปิดหน้าจอข้างล่าง คลิกที่แถบ Protection พิมพ์รหัสตามต้องการ เมื่อปิดและจะเข้าไปแก้ไขโค้ด ต้องใส่รหัส

เทคนิคการใช้ 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 ตัวอย่า...

การปัดเศษขึ้น เป็นเลขจำนวนเต็ม ของ 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 ด้วย

เทคนิค 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 เพราะต้องเอาข้อมูลมาจาก ตาราง เนื่...