วันจันทร์ที่ 24 พฤศจิกายน พ.ศ. 2557

Tab บนริบบิ้นที่สร้างเอง (custom ribbon) เปลี่ยน Focus เมื่อเปิดฟอร์ม หรือรายงาน

Tab บนริบบิ้นที่สร้างเอง (custom ribbon) เปลี่ยน Focus เมื่อเปิดฟอร์ม หรือรายงาน

เรียกฟอร์มบนริบบิ้น จัดทำรายงาน (ชื่อTab4) เพื่อเปิดรายงาน
เปิดรายงาน Focus เปลี่ยนไปที่ Tab ธนาคารโรงเรียน

การแก้ไข

เริ่มจากใน Access 2010 มี Method ชื่อ ActivateTab ซึ่งสามารถเปลี่ยน Focus ของ Tab บน Ribbon ให้อยู่ที่ Tab ที่ต้องการได้ โดยหลังจากสั่งเปิดรายงาน แล้ว สั่งให้ Focus ที่ Tab4 เช่น

gobjRibbon.ActivateTab "Tab4"    จะเปลี่ยน Focus มาที่ Tab4




วันพฤหัสบดีที่ 20 พฤศจิกายน พ.ศ. 2557

การเปิดไฟล์ Access แบบเต็มหน้าจอ (Full screen)

โดยปกติ เราเปิดไฟล์ Access จะเห็นมีริบบิ้น และองค์ประกอบอื่น ๆ ของโปรแกรมอยู่ด้วย เช่น


ในกรณีที่เราต้องให้แสดงเฉพาะส่วนของโปรแกรมที่สร้างขึ้น โดยการซ่อนไม่ให้เห็นริบบิ้น และอื่น ๆ ก็สามารถทำได้เช่นกัน

หลักการ

สร้างฟอร์มเป็นฉากหลัง ซึ่งเป็นฟอร์ว่าง ๆ หรืออาจจะมีลวดลายเป็นพื้น ก็ได้ และกำหนดให้เป็นฟอร์มชนิด popup พร้อมทั้งกำหนดให้ Maximize ให้เต็มหน้าจอ แล้วเรียกฟอร์มอื่น ๆ ให้มาปรากฎซ้อนที่ฟอร์มนี้ ดังตัวอย่าง

วิธีการ

  1. สร้างฟอร์มเปล่าชื่อ background และกำหนด Property ของฟอร์ม คือ Pop up เป็น Yes และ Modal เป็น No (เพราะต้องการให้เปิดฟอร์มนี้ และสามารถทำกิจกรรมอย่างอื่น ๆ ได้อีก ถ้ากำหนด Modal เป็น Yes จะไม่สามารถทำกิจกรรมใด ๆ ได้ จนกว่าจะปิดฟอร์มนี้เสียก่อน)
  2. กำหนด Border Style เป็น None และ กำหนด Record Selector เป็น No เพื่อไม่ให้มีขอบและเป็นหน้าว่างเปล่า
  3. สร้างฟอร์มที่จะให้แสดง ในตัวอย่างนี้คือ Form1
  4. กำหนดคุณสมบัติคือ
                  Pop Up เป็น Yes
                  Modal เป็น Yes (เพื่อให้อยู่หน้าฟอร์ม background มิฉะนั้นจะถูกซ่อนอยู่ด้านหลัง)
                  Border Style เป็น None
                  Record Selector เป็น  No
  5. เขียนโค้ดที่ On load ของฟอร์ม backgroiund เพื่อให้เปิดแบบเต็มจอ และเรียกใช้งาน Form1 ดังนี้
  6. กำหนดให้เปิดฟอร์ม background เมื่อเริ่มต้น 
  7. ไปที่ File > Options > Current Database และกำหนด Display Form ให้เป็นฟอร์ม background
  8. บันทึก ปิด และเปิดไฟล์ใหม่ จะเห็นเต็มหน้าจอ ถ้าต้องการออก ให้คลิกขวา และเลือกดูแบบมุมมองออกแบบ หรือกด Alt + F4

วันอังคารที่ 18 พฤศจิกายน พ.ศ. 2557

การสร้าง Shortcut เพื่อเรียกใช้งาน Macro หรือ Procedure ใน Access 2010

ใน Access 2007 มีหน้าจอสร้าง Macro ซึ่งมีตัวเลือก AutoKeys สำหรับกำหนด shortcut เพื่อเรียกให้ Macro ที่สร้างขึ้น ทำงานได้ โดยไม่ต้องใช้เมาส์คลิก แต่ใช้การกดปุ่มที่แป้น ที่กำหนดเป็น Shortcut

แต่ใน Access 2010 หน้าจอการสร้าง Macro หายไป แต่ความจริงยังคงสนับสนุน การใช้ AutoKeys เพื่อให้สามารถเรียกใช้ Shortcut ให้ Macro ทำงานได้เหมือนเดิม

หน้าจอการสร้าง Macro ของ Access 2010

หลักการคือ สร้าง Macro และตั้งชื่อเป็น AutoKeys และ สร้าง Subform เพื่อกำหนด Shortcut และเรียกใช้ฟังก์ชัน Macro หรือเรียกฟังก์ชัน runcode เพื่อเรียกใช้งานฟังก์ชันที่สร้างเอง ให้ทำงาน ก็ได้

ในตัวอย่างนี้ จะเป็นการสร้าง Shortcut คือ Ctrl + K เพื่อให้แสดงข้อมูล ในฟิลด์ถัดไปของตาราง

วิธีการ

  1. สร้างตารางให้มีข้อมูลและโครงสร้าง ดังภาพ
  2. สร้างฟอร์ม และกำหนด Record Source ของฟอร์ม เป็น Table1 ที่สร้างขึ้น เมื่อเวลานำ Textbox มาวาง จะได้กำหนดให้แสดงข้อมูลในฟิลด์ของตารางนี้ได้
  3. สร้างกล่องข้อความ หรือ Textbox และกำหนด Control Source ให้เป็น Field1 (ถ้าไม่กำหนด Control Source ของฟอร์มนี้ เมื่อคลิก Control Source ของ Textbox จะไม่เห็นข้อมูลใด ๆ)
  4. กำหนดขนาดตัวอักษรของ Textbox เป็น 127 เพื่อให้มีขนาดใหญ่ขึ้น
  5. กดปุ่ม Alt + F11 เพื่อเปิดหน้าจอ VBA
  6. คลิก Insert > Module
  7. สร้างฟังก์ชันให้เรียกข้อมูลใน Record ถัดไป แล้วบันทีกไว้
  8. กลับไปที่หน้าจอออกแบบ และเลือก Create > Macro
  9. ลาก Submacro มาวาง
  10. จะได้หน้าจอการสร้าง Submacro
  11. เปลี่ยนชื่อ Submacro name ให้เป็น Shortcut ที่ต้องการ ในตัวอย่างคือ Ctrl + K (เครื่องหมาย ^ คือสัญญลักษณ์ที่ใช้แทนปุ่ม Ctrl)
  12. ที่ช่อง Add New Action ให้เลือก Macro ที่ต้องการ ซึ่งจะมีแบบสำหรับให้ระบุค่าเกิดขึ้น
  13. ในกรณีนี้ เราจะเรียกใช้ฟังก์ชันที่สร้างขึ้น ให้พิมพ์หรือเลือก RunCode
  14. เมื่อกด Enter จะมีแบบให้ระบุฟังก์ชัน ให้เลือกฟังก์ชัน MoveNext() ที่สร้างขึ้น
  15. จะสังเกตเห็นว่า การระบุฟังก์ชัน ต้องมีเครื่องหมายวงเล็บ () ต่อท้ายที่ชื่อฟังก์ชันด้วย ในกรณ๊ที่ต้องส่งค่าผ่านเข้าฟังก์ชัน ต้องระบุค่าในวงเล็บด้วย แต่ในกรณีตัวอย่างนี้ ไม่มีค่าใด ๆ ที่ต้องระบุ จึงมีเพียงวงเล็บว่าง ๆ เอาไว้
  16. ขณะนี้ชื่อ Macro ยังเป็น Macro1 และยังไม่ได้บันทึก ให้บันทึกและใช้ชื่อ Macro นี้ว่า AutoKeys
  17. ปิด Macro โดยคลิกที่เครื่องหมายกากบาท
  18. จะกลับมาทีหน้าจอออกแบบ
  19. ให้กำหนดมุมมองแบบ ฟอร์ม (Form View) เมื่อกดปุ่ม Ctrl + K จะเห็นตัวเลขเปลี่ยนไป ซึ่งเป็นข้อมูลของฟิลด์ ใน Record ถัดไป ตามคำสั่งในฟังก์ชันที่เขียนขึ้น

เพิ่มเติม
  • ชื่อที่ใช้เป็นชื่อ Submacro สำหรับใช้เป็น Shortcut มีรูปแบบ ดังข้างล่างนี้
  • ถ้าต้องการสร้าง Shortcut ที่ใช้เรียก Procedure หรือ Macro อื่น ๆ สามารถสร้างเป็น Submacro เพิ่มเติมได้ แต่ต้องอยู่ภายใน Macro ที่ชื่อ AutoKeys

อ้างอิง

http://www.utteraccess.com/forum/Create-Macro-Keyboard-Sho-t1964101.html
http://office.microsoft.com/en-ca/access-help/run-an-access-macro-by-using-a-keyboard-shortcut-HA010239111.aspx




วันอาทิตย์ที่ 16 พฤศจิกายน พ.ศ. 2557

การเปลี่ยนสีภาพ ด้วย Photoshop CS5

การเปลี่ยนสีภาพจากสีน้ำเงิน เป็นสีเหลือง ดังตัวอย่างภาพก่อนเปลี่ยน และหลังเปลี่ยนข้างล่างนี้


การปรับสีสามารถทำได้หลายวิธี เช่น การใช้ Hue/Saturation หรือ อื่น ๆ แต่ในตัวอย่างนี้ ใช้ Channel Mixer ซึ่งได้ผลดี เป็นที่น่าพอใจ

วิธีการ

  1. นำเข้าภาพที่ต้องการเปลี่ยนสี
  2. ไปที่ Image > Adjustment > Channel Mixer...

  3. การเปลี่ยนสีของภาพ ในตัวอย่างนี้ จะทำ 2 ครั้งคือ ครั่งแรก ปรับสีแดง ก่อน จากนั้น จึงปรับสีน้ำเงินอีกครั้งหนึ่ง
  4. ปรับครั้งที่ 1 ตั้งค่า Output Channel เป็น สีแดง (Red) และปรับค่า Source Channels สีแดง (Red) เป็น +200% และสีเขียว (Green) เป็น +78%


  5. ปรับครั้งที่ 2 ตั้งค่า Output Channel เป็นสีน้ำเงิน (Blue) และปรับค่า Source Channels สีแดง (Red) เป็น -144% สีเขียว (Green) เป็น -50% และสีน้ำเงิน เป็น +60%

  6. จะได้ภาพตามต้องการ ถ้ายังไม่ถูกใจ สามารถปรับค่าได้ ตามใจชอบ
  7. ถ้าต้องการเปลี่ยนสีเฉพาะบางส่วนของภาพ เช่น สีเสื้อ หรือสีหมวก เท่านั้น ก็ให้ Mask หรือเลือกเฉพาะส่วนนั้น ๆ จากนั้น จึงทำการเปลี่ยนสี ก็จะได้ตามต้องการ

วันศุกร์ที่ 7 พฤศจิกายน พ.ศ. 2557

การแก้ไขข้อมูลจากหลายตาราง

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

ในตัวอย่างต่อไปนี้ มีข้อมูล 3 ตาราง โดยมีตารางหลักคือ tblCourseSchedule ซึ่งเชื่อมโยงจาก 2 ตาราง
แต่ละตาราง มีข้อมูลดังนี้
ต้องการให้ผู้ใช้แก้ไขข้อมูลในตาราง tblCourseSchedule ซึ่งมีแต่ตัวเลข จำเป็นต้องนำข้อมูลจากตารางอื่นมาแสดงให้เห็น โดยใช้ Listbox แสดงข้อมูลให้เลือก เพื่อแก้ไขอีกทีหนึ่ง หน้าจอ มีดังนี้

หลักการ
  1. สร้าง Query โดยใช้ข้อมูลจาก 3 ตาราง เพื่อให้แสดงข้อความของแต่ละ Record ในตาราง tblCourseSchedule
  2. สร้าง Listbox โดยกำหนดให้ใช้ Query ที่สร้่าง เป็น Row Source ของ Listbox
  3. เมื่อมีการคลิก ให้นำค่าไปไว้ใน Textbox และ Combobox 
  4. เมื่อคลิกปุ่มแก้ไข หรือ ลบ ให้ปรับข้อมูลในตาราง tblCourseSchedule
ปัญหา

          Combobox นำข้อมูลมาจากตาราง tblVenue เพื่อให้ผู้ใช้เลือกสถานที่ การนำชื่อสถานที่มาแสดง ทำอย่างไร จึงจะให้ตรงกับสถานที่ ที่อยู่ใน Listbox ที่ผู้ใช้ระบุว่าต้องการแก้ไข
           ทางออกคือ ใช้ id ของสถานที่จากใน Listbox และวน loop ใน Combox โดยใช้ Property Column() เพื่อหาว่า id นั้นอยู่ในแถวที่เท่าไรของ Combobox จากนั้น จึงใช้เป็นข้อมูล เพื่อนำมาแสดงใน Combox ด้วย Property itemData() ของ Combox อีกครั้งหนึ่ง

วิธีการ


  1. สร้าง Query ชื่อ qryEditCourseSchedule
  2. สร้างฟอร์ม โดยมี Textbox Combobox Listbox และปุ่ม ดังภาพ
    มีชื่อดังนี้ txtCourse_id, txtCourse_name, txtBeginDate, txtEndDate, cboVenue, lstCourseSchedule, cmdEdit และ cmdDelete
  3. กำหนด Row Source ของ lstCourseSchedule เป็น Query ที่สร้าง
  4. ที่ Event On Click ของ Listbox เขียน โค้ดดังนี้
    Private Sub lstCourseSchedule_Click()
    If Me.lstCourseSchedule.ListCount > 0 Then
        Me.txtCourse_id = Me.lstCourseSchedule.Column(1)
        Me.txtCourse_name = Me.lstCourseSchedule.Column(2)
        Me.txtBeginDate = Me.lstCourseSchedule.Column(3)
        Me.txtEndDate = Me.lstCourseSchedule.Column(4)
        Me.cboVenue.RowSource = "SELECT id, venue, address FROM tblVenue ORDER by venue"

    ' หาตำแหน่งของชื่อสถานที่ เพื่อนำไปแสดงใน Combobox
       Dim i As Long
       Dim thisItem As Long

       ' ตรวจหาข้อมูลทีละแถวใน Combobox เพื่อหาว่า id ของสถานที่ ที่เลือก อยู่แถวที่เท่าไร
       For i = 0 To Me.cboVenue.ListCount - 1
          If Me.cboVenue.Column(0, i) = Me.lstCourseSchedule.Column(6) Then
          ' id  ของสถานที่ใน Combobox อยู่ในคอลัมน์ที่ 1 แต่อยู่ในคอลัมน์ที่ 7 ใน listbox
          ' index เริ่มจาก 0 คอลัมน์ที่ 1 จึงเป็น 0 และ คอลัมน์ที่ 7 จึงเป็น 6
              thisItem = i
              Exit For
         End If
       Next i
         ' แสดงข้อมูลชื่อสถานที่ใน Combobox
         Me.cboVenue.Value = Me.cboVenue.ItemData(thisItem)
         Me.cboVenue.Requery
    Else
         Call MsgBox("ไม่พบข้อมูล")
    End If
    End Sub
  5. ที่ปุ่ม แก้ไข เขียนโค้ดที่ On Click ดังนี้

    Private Sub cmdEdit_Click()

    CurrentDb.Execute "UPDATE tblCourseSchedule " & _
                 "SET course_id = '" & Me.txtCourse_id.Value & _
                 "', begin_date = " & toSTR(Me.txtBeginDate) & _
                 ", end_date = " & toSTR(Me.txtEndDate) & _
                 ", venue_id = " & Me.cboVenue & _
                 " WHERE cs_id = " & Me.lstCourseSchedule.Column(0)
               
                 Me.lstCourseSchedule.Requery
                 Call MsgBox("แก้ไขข้อมูลเรียบร้อยแล้ว")

    End Sub

    'ใช้ฟังก์ชัน toStr() เพื่อปรับรูปแบบวันที่ภาษาไทย ให้ใช้กับ vba ได้
  6. ที่ปุ่ม ลบ เขียนโค้ดที่ On Click ดังนี้

    Private Sub cmdDelete_Click()

        CurrentDb.Execute "DELETE FROM tblCourseSchedule WHERE cs_id = " & Me.lstCourseSchedule.Column(0)
        Me.lstCourseSchedule.Requery
        Call MsgBox("ลบข้อมูลเรียบร้อยแล้ว")

    End Sub


    ดาวน์โหลดไฟล์ ตัวอย่าง (688 Kb)






วันอังคารที่ 4 พฤศจิกายน พ.ศ. 2557

sumproduct() ฟังก์ชันการรวมที่น่าสนใจ

SUMPRODUCT เป็นสูตรที่ใช้สำหรับ การหาผลคูณของคอลัมน์ตั้งแต่ 2 คอลัมน์ขึ้นไป และเอาผลที่ได้จากการคูณนั้น มารวมกัน เช่น
จากภาพ ถ้าเราไม่ใช้ SUMMPRODUCT หาผลรวมของทั้งหมด เราอาจจะหาผลคูณ ของแต่ละรายการ แล้วนำมารวมกัน เป็นผลรวมทั้งหมด เช่น F3 เขียนสูตร D3*E3, F4เขียนสูตร D4*E4 ไปเรื่อย ๆ ...จากนั้น จึงหาผลรวม เช่น ที่ F8 เขียนสูตรว่า Sum(F3:F6) ก็จะได้ ดังนี้
จะเห็นว่า มีการทำงาน 2 ขั้นตอน คือต้องหาผลคูณก่อน แล้วจึงนำมารวมกันอีกครั้ง 

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

  • SUMPRODUCT ต้องการข้อมูลที่เป็น array หรือพูดง่าย ๆ ว่าเป็นข้อมูลชุดที่ติดต่อกัน เช่นในตัวอย่าง เป็นข้อมูลในคอลัมน์
  • ถ้ามีมากกว่า 1 คอลัมน์ ข้อมูลนั้น ต้องมีจำนวนเท่ากัน
  • เราสามารถเพิ่มความยืดหยุ่น โดยการกำหนดเงื่อนไขในแต่ละคอลัมน์ได้

วิธีการ

  1. กรอกข้อมูล ดังภาพ
  2. ที่ช่อง F8 พิมพ์สูตร และระบุข้อมูล คอลัมน์สินค้า (C3:C6) และราคา (D3:D6) ดังนี้ (ขอให้สังเกตว่า ระหว่างคอลัมน์ เราใช้เครื่องหมายคอมม่า คั่นกลาง ระหว่างช่วงข้อมูลในวงเล็บ)
  3. หกากากดปุ่ม ENTER จะได้ผลลัพธ์ ตามข้างต้น
  4. SUMPRODUCT สามารถยืดหยุ่นได้ โดยเราสามารถสร้างเงื่อนไขให้รวมเฉพาะรายการสบู่เท่านั้น เราเขียนคำสั่งดังนี้
  5. เงื่อนไขที่เพิ่มเข้ามา คือในช่วง C3:C6 ให้เอาข้อมูลมาเฉพาะที่มีค่าเท่ากับ สบู่ เท่านั้น จะสังเกตเห็นได้ว่า เราคร่อมคำว่า สบู่ ด้วยเครื่องหมายคำพูด และทั้งหมดอยู่ในวงเล็บ และใช้เครื่องหมายคูณ ซึ่งใน Excel ใช้เครื่องหมายดอกจันทร์ (*) เพื่อคูณกับข้อมูลเดิมของเรา
  6. เบื้องหลัง คือ โปรแกรมจะไปตรวจสอบก่อนว่า ในช่วง C3:C6 ตามที่เรากำหนดว่ามีตัวใดบ้างที่เท่ากับคำว่า สบู่ ถ้ามี ก็จะให้ค่าเป็นจริง หรือเท่ากับ 1 ถ้าไม่ใช่คำว่า สบู่ ก็จะให้ค่าเป็นเท็จ หรือ มีค่าเป็น 0 ซึ่งเมื่อนำค่าแต่ละแถวมาคูณกัน ถ้าเป็น 0 ผลลัพธ์ก็เป็น 0 ถ้าเป็น 1 ผลลัพธ์ก็จะเท่าเดิม แล้วจึงนำผลที่ได้ทั้งหมดมารวมกัน เป็นผลรวมของสบู่ ดังนี้

    หรือ
  7. ถ้าเราสั่งให้ประเมินสูตรในช่อง F8 (Office 2007-2010 ไปที่แถบ สูตร เลือกดูกลุ่ม ตรวจสอบสูตร และคลิกปุ่ม ประเมินสูตร) ซึ่งในช่อง F8 เราใช้สูตร SUMPRODUCT จะเห็นว่า มีการประเมินผล ก่อนที่จะนำไปคูณ ดังนี้
  8. จะเห็นว่า การประเมินข้อมูลก่อนที่จะนำไปคูณกัน คือ TRUE FALSE FALSE TRUE หรือ 1 0 0 1 นั่นเอง ซึ่งสอดคล้องกับที่กล่าวมาแล้วข้างต้น
ในกรณีที่มีเงื่อนไขมากกว่า 1 เงื่อนไข

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

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

สูตรที่ต้องการ จึงมีดังนี้

=SUMPRODUCT((B2:B7="สมหมาย")*(C2:C7="ม.ค."),E2:E7)

ผลการประเมินจากสูตร จะเป็นอย่างนี้
ผลที่ได้คือ
ถ้าคลิกที่ช่อง E10 และให้ประเมินสูตรดู ผลที่ได้ จะเป็น ดังนี้