แสดงกระทู้

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - มาลี

หน้า: 1 2 3 [4] 5 6
55
ห้อง MS Access / : access 2003 to windows 10 64 bit
« เมื่อ: 09 ต.ค. 62 , 19:32:05 »
ต้องทำ code เพิ่มอีกนิดหน่อย จาก Private Declare Function  เป็น  Private Declare PtrSafe Function

Option Compare Database
      Private Const LOCALE_SSHORTDATE = &H1F
      Private Const WM_SETTINGCHANGE = &H1A
      Private Const HWND_BROADCAST = &HFFFF&
#If VBA7 Then 'access 64บิต
      Private Declare PtrSafe Function SetLocaleInfo Lib "kernel32" Alias "SetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String) As Boolean
      Private Declare PtrSafe Function PostMessage Lib "User32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
      Private Declare PtrSafe Function GetSystemDefaultLCID Lib "kernel32" () As Long
#Else
      Private Declare Function SetLocaleInfo Lib "kernel32" Alias "SetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String) As Boolean
      Private Declare Function PostMessage Lib "User32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
      Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long
#End If
 

Function setdate()  'ตรวจสอบรูปแบบวันที่ dd/mm/yyyy
    Dim dwLCID As Long
            dwLCID = GetSystemDefaultLCID()
           
        If SetLocaleInfo(dwLCID, LOCALE_SSHORTDATE, "dd/MM/yyyy") = False Then
            MsgBox "ผิดพลาด", vbCritical, "Error"
        End If
            PostMessage HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0
End Function
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

56
ห้อง MS Access / : access 2003 to windows 10 64 bit
« เมื่อ: 21 ก.ย. 62 , 13:26:47 »
ค้นหาในเวปด้วยคำว่า "64 bit"  มีถามกันพอสมควร
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

57
ห้อง MS Access / access 2003 to windows 10 64 bit
« เมื่อ: 21 ก.ย. 62 , 13:22:57 »
มีทานไหนเจอปัญหาการนำเอา File .MDB ที่เป็นของ2003 ไป run กับ Windows รุ่นใหม่ ที่เป็น 64 bit บ้างมั้ยครับ
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

58
แต่ถ้าเราเขียนคำสั่งที่จะทำ ให้อยู่ในบรรทัดเดียวกับ If ... Then ได้ เราก็ไม่ต้องมี End If ครับ เช่น

If A=1 Then B=2: C=3 Else B=4: C=5

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

59
มิน่าล่ะ เวลาหนูเขียนคำสั่งตรวจสอบหลายเงื่อนไข มันจึงฟ้องให้ต้องใส่ End if ซ้อนกันในตอนท้ายเสมอ

เขาจึงนิยมใช้ ElseIf กันมากกว่านะครับ
> vba if else - ค้นหาด้วย Google
> คำสั่งเลือกเงื่อนไข If Else ElseIf และ Select Case ในภาษา Visual Basic - MarcusCode

โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

60
If เงื่อนไข Then
   ทำคำสั่งเมื่อเงื่อนไขเป็นจริง
Else
   ทำคำสั่งเมื่อเงื่อนไขไม่เป็นจริง
End If


If เงื่อนไขที่1 Then
   ทำคำสั่งเมื่อเงื่อนไขที่1เป็นจริง
ElseIf เงื่อนไขที่ 2 Then
   ทำคำสั่งเมื่อเงื่อนไขที่1ไม่เป็นจริง แต่เงื่อนไขที่2เป็นจริง
ElseIf เงื่อนไขที่ 3 Then
   ทำคำสั่งเมื่อเงื่อนไขที่1และ2ไม่เป็นจริง แต่เงื่อนไขที่3เป็นจริง
ElseIf ...
   ...
Else
   ทำคำสั่งเมื่อเงื่อนไขทั้งหมดข้างบนไม่เป็นจริง
End If

การใช้ ElseIf ทำให้ลดรูปการเขียนคำสั่งด้วย If ... Then ... Else ซ้อนกันให้สั้นลงและอ่านง่ายขึ้นเท่านั้นเองครับ ไม่งั้นเราก็ต้องเขียนเป็น

If เงื่อนไขที่1 Then
   ทำคำสั่งเมื่อเงื่อนไขที่1เป็นจริง
Else
   If เงื่อนไขที่ 2 Then
      ทำคำสั่งเมื่อเงื่อนไขที่1ไม่เป็นจริง แต่เงื่อนไขที่2เป็นจริง
   Else
      If เงื่อนไขที่ 3 Then
         ทำคำสั่งเมื่อเงื่อนไขที่1และ2ไม่เป็นจริง แต่เงื่อนไขที่3เป็นจริง
      Else
         If ... Then
            ...
         Else
            ทำคำสั่งเมื่อเงื่อนไขทั้งหมดข้างบนไม่เป็นจริง
         End If
      End If
   End If
End If
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

61
ใช้โปรแกรม 2003 มานาน ถ้าจะพัฒนาไปใช้บน Access 2013 หรือ 2016 ต้องไปแปลงตรงไหน ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

62
ผมได้ปรับปรุงโปรแกรมให้มีการจัดเก็บเป็นหมวดหมู่ นะครับ
ตารางมีดังนี้


Tbl_GroupNum ตารางนี้เก็บรหัสประจำกลุ่มของรูปภาพ สมมุติกลุ่ม 1 มีภาพ 1 2 3 4 5 6 ไปเรื่อยๆ ครับ
Tbl_Picture       ตารางนี้เก็บรหัสของกลุ่มไว้ และเก็บตำแหน่ง Path เดิมที่รูปภาพอยู่ และ ตำแหน่งรูปภาพใหม่ ที่เรา Copy ไปเก็บไว้โฟลเดอร์
TempPath        ตารางนี้เก็บตำแหน่ง Floder ที่ใช้ในการเก็บรูปภาพที่เราต้องการ โดยไปสร้าง Floder ไว้ให้เรียบร้อยแล้ว กำหนด Path ใน       
                      Combobox ครับ

การใช้งาน

1.เมื่อเราเปิดโปรแกรมมาโดยยังไม่ได้มีการเพิ่มข้อมูล NO จะเริ่มต้นให้เองที่เลข 1
2.กำหนด ตำแหน่งจัดเก็บไปยัง Floder ปลายทางให้เรียบร้อย
3.กด Import เลือกรูปที่ต้องการจัดเก็บ
4.กด Add เพื่อบันทึกรูปภาพไปยังตาราง และข้อมูลจะแสดงที่ ตารางด้านขวาขึ้นทันที
5.เมื่อเพิ่มรูปภาพใน Group เดิมเสร็จแล้ว ต้องการสร้าง Group ใหม่ สามารถกดที่ New Group ได้เลยครับ
6.ถ้าต้องการค้นหาหรือเรียกดู Group อื่น ก็ใส่รหัส Group ที่ textbox GOTO GROUP แล้วกด OK
7.เมื่อเลือกรูปภาพแล้วอยาก Clear Form เพื่อเอารูปภาพใหม่ กดปุ่ม Clear
8.คลิ๊กที่เลขลำดับด้านขวา จะแสดงรูปตัวอย่างของรูปภาพที่เรา Add ไปแล้ว


[info]อัพเดท ตัวใหม่ล่าสุดใช้การรันลำดับการนำเข้าด้วยครับ สะดวกต่อการตรวจสอบ[/info]
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

63
ขออนุญาตใช้กระทู้นี้ต่อคำถามเพิ่มเติมนะคะ
 หนูมีโปรเจ็คชื่อ Sample หนูลองนำคำสั่งในนี้ไปประยุกต์ใช้เป็นดังนี้
โค๊ด: [Select]
oFSO.CopyFile CurrentProject.Path & "\" & CurrentProject.Name, "D:\" & "Backup " & CurrentProject.Name
ซึ่งมันก็ใช้ได้ดีเลยทีเดียว โดยจะได้ไฟล์สำรองเป็น BackupSample ตามที่ต้องการ
ประเด็นปัญหาก็คือ หากเราไปเปิดตัวไฟล์สำรอง BackupSample แล้วสั่งสำรองข้อมูล
มันก็จะได้ไฟล์สำรองตัวใหม่เป็น BackupBackupSample

หนูจึงอยากได้ว่า หากมีการเปิดไฟล์โปรเจ็คที่ มีชื่อขึ้นต้นว่า Backup
ก็ให้มีข้อความบอกผู้ใช้ว่า"ไฟล์นี้เป็นไฟล์สำรองไม่ควรเปิดใช้งานจนกว่าจะเปลี่ยนชื่อไฟล์ใหม่" ประมาณนี้ค่ะ
ไม่ทราบว่าต้องทำอย่างไรคะ

สร้าง Function มาเช็คดูก็ได้คับ ว่าไฟล์เปิดใช้งานจริงหรือไม่

โค๊ด: [Select]
Function checkFileOpen(FilePath As String)
    Dim iFile As Long
    Dim OnErr As Long
    On Error Resume Next
    iFile = FreeFile()
    Open FilePath For Input Lock Read As #iFile

    Close iFile
    OnErr = Err
    On Error GoTo 0
     
    Select Case OnErr
    Case 0:    checkFileOpen = False
    Case 70:   checkFileOpen = True
    End Select
     
End Function

Private Sub Command0_Click()
Dim oFSO As Object
Set oFSO = CreateObject("Scripting.FileSystemObject")

If checkFileOpen("D:\" & "Backup " & CurrentProject.Name) = False Then
   oFSO.CopyFile CurrentProject.Path & "\" & CurrentProject.Name, "D:\" & "Backup " & CurrentProject.Name
   Set oFSO = Nothing
   
Else
    MsgBox "ไฟล์นี้เป็นไฟล์สำรองไม่ควรเปิดใช้งานจนกว่าจะเปลี่ยนชื่อไฟล์ใหม่", vbInformation, "แจ้งเตือน"
End If
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

64
เนื่องจาก Message Box ไม่อนุญาตให้โค้ดบรรทัดต่อไปทำงาน จนกว่าจะปิดกล่องข้อความที่แสดงไป ดังนั้นเราจึงต้องไปใช้อย่างอื่นทำหน้าที่แสดงข้อความแทน เช่น สร้างฟอร์มเพื่อทำหน้าที่เป็น Message Box, แสดงข้อความบน Textbox หรือ Command Button ภายในฟอร์มของตัวของเขาเองครับ ส่วนตัวผมเอง ผมหาพื้นที่สักส่วนนึงบนฟอร์มแล้วสร้าง Textbox เพื่อแสดงข้อความครับ ง่ายดี พอทำงานเสร็จ จะ Invisible มันไปด้วยก็ได้ หรือจะเคลียร์ข้อความใน Textbox ทิ้งก็ได้ ตย.เช่น

    Dim oFSO As Object
    Dim strDestination As String
    strDestination = "\\server\"
    DBEngine.Idle
    Set oFSO = CreateObject("Scripting.FileSystemObject")
   
    Me.[ชื่อ Textbox].Visible = True
    Me.[ชื่อ Textbox] = "ข้อความ"

    oFSO.CopyFile CurrentProject.Path & "Data1.accdb", strDestination   
    Set oFSO = Nothing
   
    Me.[ชื่อ Textbox].Visible = False
    Me.[ชื่อ Textbox] = ""

    MsgBox ("สำรองข้อมูลเสร็จแล้ว"), vbOKOnly + vbInformation, "Process Completed"

แต่ถ้าต้องการสร้างเป็นฟอร์มแทน Message Box ก็ไปสร้างฟอร์มโดยกำหนด Property ของฟอร์มเป็นค่าเหล่านี้
Pop up เป็น Yes
Scroll bars เป็น Neither
Record Selector เป็น No
Navigation Button เป็น No
Auto Resize เป็น Yes
Auto Center เป็น Yes
Border Style เป็น Thin หรือจะเป็น None ก็ได้ ลองดูเอาแบบที่ชอบครับ
Control เป็น None
แล้วก็สร้าง Textbox เพื่อไว้แสดงข้อความ พอจะใช้งาน ก็เพียงเปิดฟอร์มนี้ ใส่ข้อความลง Textbox แล้วปิดเมื่อทำงานเสร็จ เท่านี้เองครับ

โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

65
ขณะสำรองข้อมูลอยากให้มี msgbox แจ้งว่าตอนนี้กำลังทำการสำรองข้อมูลอยู่
หลังจากสำรองข้อมูเสร็จ ก็อยากให้ขึ้นข้อความแจ้งว่า สำรองข้อมูลเสร็จแล้ว ตอนนี้ผมมีแจ้งแค่ตอนทำเสร็จแล้วเท่านั้นครับ
ไม่ทราบว่าต้องทำเช่นไรครับผม  :question:

    Dim oFSO As Object
    Dim strDestination As String
    strDestination = "\\server\"
    DBEngine.Idle
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    oFSO.CopyFile CurrentProject.Path & "Data1.accdb", strDestination   
    Set oFSO = Nothing

    MsgBox ("สำรองข้อมูลเสร็จแล้ว"), vbOKOnly + vbInformation, "Process Completed"
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

66
ถ้าจะเขียนในลักษณะเดียวกับที่คุณมาลีเขียนมา ก็เขียนเป็น Forms!Main!Text2 = Text1

แต่โดยปกติผมจะเขียนเป็น Me.Parent!Text2 = Me.Text1 ครับ โดยที่ Parent หมายถึงเมนฟอร์มของฟอร์มปัจจุบันที่โค้ดเราอาศัยอยู่  (Me) ซึ่งตอนนี้เราอยู่ที่ซับฟอร์ม
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

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

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

68


ใช้วิธีการเดียวกับการแสดง  อำเภอ  ตำบล นั้นละครับ เมื่อเรากดเลือก Geo แล้วพอจะเลือกจังหวัด เราก็กำหนดให้เลือก Geo_ID จากCombobox  Cb_geography ที่เรากำหนด
วิธีการคือ
1.สร้าง Combobox เพิ่มตั้งชื่อว่า Cb_Geography โดยกำหนด RowSource ของ Cb_geography ดังนี้
โค๊ด: [Select]
SELECT tb_geography.GEO_ID, tb_geography.GEO_NAME FROM tb_geography;
2.ในส่วนของ Combobox Cb_Province ก็กำหนด Rowsource ดังนี้
โค๊ด: [Select]
SELECT tb_province.province_id, tb_province.Province_th, tb_province.GEO_ID FROM tb_province INNER JOIN tb_geography ON tb_province.geo_id = tb_geography.GEO_ID WHERE (((tb_province.GEO_ID)=[Forms]![Form1]![Cb_geography]));
ส่วน Code ให้แก้เป็นแบบนี้ครับ
โค๊ด: [Select]
Option Compare Database
Option Explicit

Private Sub Cb_geography_AfterUpdate()
    Me.cb_province.Requery
    Me.cb_province = Null
    Me.cb_amphur = Null
    Me.cb_district = Null
    Me.txt_zipcode = Null
End Sub

Private Sub cb_province_AfterUpdate()
    Me.cb_amphur.Requery
    Me.cb_amphur = Null
    Me.cb_district = Null
    Me.txt_zipcode = Null
End Sub
Private Sub cb_province_GotFocus()
Me.cb_province.Requery
End Sub

Private Sub cb_amphur_AfterUpdate()
    Me.cb_district.Requery
    Me.cb_district = Null
    Me.txt_zipcode = Null
End Sub
Private Sub cb_district_AfterUpdate()
    Me.txt_zipcode = DLookup("post_code", "tb_district", "district_th= '" & Me.cb_district & "' AND amphur_id = " & Me.cb_amphur.Column(0, Me.cb_amphur.ListIndex))
End Sub

Private Sub cb_amphur_GotFocus()
    Me.cb_amphur.Requery
End Sub
Private Sub cb_district_GotFocus()
    Me.cb_district.Requery
End Sub
Private Sub Form_Load()
Me.Cb_geography.SetFocus
End Sub

สามารถดูตัวอย่างที่แก้ไข ด้านล่างครับ
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

69
ผมได้ไฟล์ตัวอย่างพร้อมคำสั่ง VBA ในการทำแบบฟอร์มกรอกที่อยู่ที่สามารถเลือกรหัสไปรษณีย์ได้อัติโนมัติเมื่อพิมพ์ชื่อจังหวัด อำเภอ ตำบล เข้าไป  ผมนำไปปรับใช้การทำทะเบียนประวัติสมาชิกในหน่วยงาน  ได้ผลดีมากครับ  ทำงานได้รวดเร็วขึ้น  แต่ทางหัวหน้างานอยากให้เพิ่มช่องภูมิภาคถิ่นที่อยู่เข้าไปโดยอัตโนมัติเพื่อพิมพ์ชื่อจังหวัด  โดยในมีไฟล์ geo_id อยู่แล้วใน tb_province และ tb_district ผมไม่มีความรู้ทางด้าน VBA นัก ลองเขียนคำสั่งเพิ่มเข้าไปคำสั่งที่มีอยู่เดิม
แต่ไม่สำเร็จ  รบกวนช่วยนำทางให้ด้วยครับ ผมเพิ่มคอลัมน์ locate ในไฟล์ table1 แล้ว


คำสั่งเก่า...
Option Compare Database
Option Explicit

Private Sub Form_Load()
    Me.cb_province.RowSource = "SELECT tb_province.province_id, tb_province.Province_th FROM tb_province;"
    Me.cb_amphur.RowSource = "SELECT tb_amphur.amphur_id, tb_amphur.amphur_th FROM tb_province INNER JOIN tb_amphur ON tb_province.province_id = tb_amphur.province_id WHERE (((tb_province.Province_th)=[Forms]![Form1]![cb_province]));"
    Me.cb_district.RowSource = "SELECT tb_district.district_id, tb_district.district_th FROM tb_district INNER JOIN tb_amphur ON tb_district.amphur_id = tb_amphur.amphur_id WHERE (((tb_amphur.amphur_th)=[Forms]![Form1]![cb_amphur]));"
End Sub

Private Sub cb_province_Change()
    Me.cb_amphur.Requery
    Me.cb_amphur = Null
    Me.cb_district = Null
    Me.txt_zipcode = Null
End Sub

Private Sub cb_amphur_Change()
    Me.cb_district.Requery
    Me.cb_district = Null
    Me.txt_zipcode = Null
End Sub

Private Sub cb_district_Change()
    Me.txt_zipcode = DLookup("post_code", "tb_district", "district_th= '" & Me.cb_district & "' AND amphur_id = " & Me.cb_amphur.Column(0, Me.cb_amphur.ListIndex))
End Sub

Private Sub cb_amphur_GotFocus()
    Me.cb_amphur.Requery
End Sub

Private Sub cb_district_GotFocus()
    Me.cb_district.Requery
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

70
ห้อง MS Access / อยากทำ progress meter
« เมื่อ: 09 ธ.ค. 61 , 10:34:22 »
เวลา import ข้อมูลเยอะแล้ว จะขึ้นเป็นนาฬิกาทราย ผู้ใช้อาจจะคิดว่า error หรือไม่ทราบว่าต้องรอนานขนาดไหน ถ้าเปลี่ยนนาฬิการทรายเป็น Progress meter น่าจะดีกว่า ต้องทำอย่างไรบ้างครับ :prettiness: :prettiness: :prettiness:
แบบรูปที่แนบมาครับ
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

71
ใช้ Query Wizard > Find Duplicated Query ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

72
ผมทำปุ่มประตูหลังเอาไว้ที่ฟอร์มแรกหลัง Login แล้วนะครับ

คุณสั่ง Disable ปุ่ม Shift เอาไว้ เลยใช้ไม่ได้ คราวหน้าจะทำอย่างนี้ ต้องเตรียมประตูหลังเอาไว้ด้วยนะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

หน้า: 1 2 3 [4] 5 6