แสดงกระทู้

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 - TTT

หน้า: [1] 2 3 4 5
1
จะพยามอธิบายให้เข้าใจนะครับ เผื่อเป็นประโยชน์กับท่านอื่นๆด้วย
- ฟังก์ชั่นนี้เป็นการเปลี่ยนพาธของ Linked Table ที่มีอยู่แล้วในไฟล์เดิม ดังนั้นจะใช้ได้ต่อเมื่อมีการทำ Linked Table ในไฟล์ MS Access อยู่ก่อนแล้ว
- โดยฟังก์ชั่นนี้จะยึดชื่อตารางที่มีอยู่เดิมในการเปลี่ยนพาธตามที่กำหนดเท่านั้น ไม่ใช่เป็นการลิ้งค์พาธชื่อตารางใหม่
- สร้างฟังก์ชั่นขึ้นใหม่ดังนี้:
โค๊ด: [Select]
Public Function ChangeLinkedMDB()
    Dim DB As DAO.Database
    Dim TD As DAO.TableDef
On Error GoTo Err_Handler
    Set DB = CurrentDb
'---หากไม่ต้องการลูป ต้องการแค่ชื่อตารางเป้าหมายเพียงชื่อเดียว-----------------------------------------
    'Set TD = DB.TableDefs("ชื่อตารางเป้าหมาย")
        'If (TD.Attributes And dbAttachedTable) = dbAttachedTable Then
            'TD.Connect = ";DATABASE=" & CurrentProject.Path & "\1.accdb"
            'TD.Connect = ";DATABASE=" & CurrentProject.Path & "\1.accdb" & ";pwd=1234"
            'หากไฟล์มี password
            'TD.RefreshLink
        'End If
'--------------------------------------------------------------------------------------
    For Each TD In DB.TableDefs
        If (TD.Attributes And dbAttachedTable) = dbAttachedTable Then
            TD.Connect = ";DATABASE=" & CurrentProject.Path & "\1.accdb" '1.accbd ชื่อไฟล์ Back End เป้าหมาย
            'TD.Connect = ";DATABASE=" & CurrentProject.Path & "\1.accdb" & ";pwd=1234"
            'หากไฟล์มี password
            TD.RefreshLink
        End If
    Next TD
Exit_Handler:
    DB.Close: Set DB = Nothing
    Exit Function
Err_Handler:
    Select Case Err.Number
        Case 3024&, 3044&
            MsgBox "ไม่พบไฟล์ในพาธที่กำหนด", , "พาธไฟล์ผิดพลาด"
        Case 3011&
            MsgBox "ไม่พบชื่อตารางเป้าหมายในไฟล์ที่กำหนด", , "ชื่อตารางผิดพลาด"
    End Select
End Function

* ส่วนเสริมฟังก์ชั่นสำหรับการอ่านค่าลิ้งค์ของตารางก่อน หากไม่ตรงกับที่อยู่ปัจจุบันค่อยใช้ฟังก์ชั่นเปลี่ยน โปรแกรมจะได้ไม่ต้องเปลี่ยนลิ้งค์ทุกครั้งที่เปิดไฟล์
โค๊ด: [Select]
Private Function GetLinkedDBName(TableName As String) As String
    Dim db As DAO.Database
    Dim Ret As String
On Error GoTo DBNameErr
    Set db = CurrentDb() 'Set db = DAO.OpenDatabase("PathFileName", False, False, ";pwd=Password")
    Ret = db.TableDefs(TableName).Connect
    GetLinkedDBName = Right(Ret, Len(Ret) - (InStr(1, Ret, "DATABASE=") + 8))
    db.Close: Set db = Nothing
    Exit Function
DBNameErr:
    GetLinkedDBName = 0
    db.Close: Set db = Nothing
End Function

- การใช้งานฟังก์ชั่นร่วมกัน
โค๊ด: [Select]
Public Function iStartup()
    If GetLinkedDBName("Table1") <> CurrentProject.Path & "\1.accdb" Then
        ChangeLinkedMDB
    End If
        'DoCmd.OpenForm "ชื่อฟอร์ม" 'หากต้องการเปิดฟอร์มเป้าหมายอัตโนมัติ
End Function

<การใช้งาน>
- เนื่องจากการเปลี่ยนพาธลิ้งค์เทเบิ้ล ต้องทำก่อนการเรียก ตาราง คิวรี่ ฟอร์ม หรือ รายงาน ดังนั้นจึงต้องเรียกตั้งแต่ตอนเปิดไฟล์ MS Access
1. เลือกเมนูหัวข้อ Create > Macro
2. เลือกหัวข้อคำสั่ง RunCode
3. ใส่คำสั่ง iStartup() ลงในช่องว่าง
4. เซฟ Macro เป็นชื่อ Autoexec เท่านั้น (หากมีชื่อนี้อยู่แล้ว ให้ไปเพิ่มคำสั่งใหม่ที่ Macro Autoexec แทน)
 
<อธิบาย>
- For each TD .... ก็เป็นการวนลูป โดยกำหนด object variable TD ให้เป็นทีละเทเบิลในฐานข้อมูล
 
- TD.Attributes จะให้ค่าเท่ากับ dbAttachedTable เมื่อเทเบิลนั้นเป็น Linked Table ที่ลิงค์มาจากฐานข้อมูลประเภท Access ด้วยกันเอง (พวก .accdb, .mdb, .mda) แต่ถ้าลิ้งค์มาจาก ODBC จะให้เป็นค่า dbAttachedODBC โดยปกติคิดว่า 99.99% เราสามารถทดสอบด้วยคำสั่ง If TD.Attributes = dbAttachedTable then ได้โดยตรง แต่เนื่องจาก .Attributes อาจมีค่าเกิดจากการรวมหลายๆ option เข้าด้วยกัน ด้วย logical OR (แต่ก็ไม่ทราบเหมือนกันว่ามันจะรวมกับ option อื่นอย่างไรได้บ้าง) ดังนั้นเพื่อให้แน่ใจเต็ม 100% เวลาจะทดสอบกรองเอาเพื่อดูว่ามีค่าของ dbAttachedTable อยู่ในส่วนผสมนั้นหรือไม่ ก็ต้องทดสอบด้วย logical AND (ตรงนี้คิดว่าหลายๆท่านก็คงจะทราบดีอยู่แล้ว) คำสั่ง If ที่เขียนให้ดูเลยออกมาเป็นอย่างนั้น
 
- TD.Connect ก็เป็นการกำหนดชื่อพาธและไฟล์ที่จะลิ้งค์เข้ามา เนื่องจากเราลิงค์มาจากเทเบิลต้นทางที่ชื่อเดิมเสมอ (ชื่อเดียวกันกับที่เราลิงค์มาครั้งแรก) ดังนั้นจึงไม่ต้องบอกมันอีกว่ามาจากเทเบิลชื่ออะไร
 
- TD.RefreshLink เป็นการสั่งให้ทำการอ่านค่าใหม่ทั้งหมด
 
- DB.Close: Set DB = Nothing สั่งให้ปิด Database และยกเลิกการเซ็ท DB
 
<หมายเหตุ>
* การใช้ฟังก์ชั่นนี้ ต้องมีการสร้าง Link Table ของเดิมอยู่ก่อนแล้ว ลักษณะของฟังก์ชั่นจะเป็นการแก้ไขพาธของ Link Table ใหม่ให้เท่านั้น ไม่ใช่การสร้าง Link Table ขึ้นมาใหม่ แต่หากต้องการทำลิ้งค์ตารางขึ้นมาใหม่จากไฟล์ MS Access ภายนอกให
 
* หากไฟล์ข้อมูลที่ทำการลิ้งค์มีการตั้งรหัสผ่านไว้ จะทำให้การเปลี่ยนลิ้งค์ช้ากว่าปกติ

ลองทำความเข้าใจและปรับใช้ดูนะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: prajak, accesskid

2
โทษทีครับ พอดีไม่ได้อ่าน ขอบคุณ คุณ UnKnow ครับ ที่ช่วยตอบ
แก้บรรทัดนี้ครับ
โค๊ด: [Select]
tDay(o, iCount) = cThaiNumber(Day(i)) & " " & MonthNameThai(i) & " " & cThaiNumber(IIf(Year(i) = Format(i, "yyyy"), Year(i) + 543, Format(i, "yyyy")))
เป็น
โค๊ด: [Select]
tDay(o, iCount) = cThaiNumber(Day(i)) & " " & MonthNameThai(i) & " " & cThaiNumber(IIf(Year(i) = Val(Format(i, "yyyy")), Year(i) + 543, Format(i, "yyyy")))
ใส่ฟังก์ชั่น Val() ลงไป เพราะสองค่ามันเป็น Data Type คนละอย่าง อันนึงเป็นตัวเลข อันนึงเป็นตัวอักษร เลยเทียบค่าแล้วไม่เท่ากัน ฟังก์ชั่น Val() จะตัดคำทั้งหมดทางขวาที่เป็น String ออก ให้เหลือแต่ตัวเลข แล้ว Return ค่ากลับมาเป็น Number จึงจะเทียบค่าตัวเลขกันได้ครับ
เปลี่ยนอย่างนี้ไม่ว่าเครื่องจะกำหนดปีเป็น ค.ศ. หรือ พ.ศ. ก็จะใช้ได้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown, sjs, mtaccess

3
เห็นคำถามนี้น่าสนใจตรงเราสามารถใช้งานตัวแปรอาร์เรย์แบบ 2 มิติได้ เลยลองทำดู แต่ไม่รู้ว่าเข้าใจความต้องการของเจ้าของกระทู้ถูกหรือป่าวนะครับ
โค๊ด: [Select]
Public Function Seminar(sDate As Date, eDate As Date) As String
    Dim i As Long, o As Long, iCount As Long, iSun As Long, mCount As Long
    Dim tDay() As String ' กำหนดตัวแปรอาร์เรย์ จำทำแบบ 2 มิติ มิติแรกใช้เก็บตัดช่วงวันอาทิตย์ มิติสองใช้เก็บวันที่ไม่ใช่วันอาทิตย์
    ' หาช่วงเวลาเป้าหมายว่ามีวันอาทิตย์ทั้งหมดกี่วัน เพิ่มใช้กำหนดค่าตัวแปรอาร์เรย์ในมิติแรก----------------------
    For i = sDate To eDate 'ลูปหาตั้งแต่วันเริ่มต้นจนวันสิ้นสุด
        If Weekday(i) = 1 Then 'วันไหนมี Weekday เท่ากับ 1 คือวันอาทิตย์ ตาม Default ของฟังก์ชั่น
            iSun = iSun + 1 'นับจำนวนวันอาทิตย์ไปเรื่อยๆ
        End If
    Next
    '--------------------------------------------------------------------------------------------------
    'เก็บวันที่เป้าหมายทั้งหมดที่ไม่ใช่วันอาทิตย์ ลงในตัวแปรอาร์เรย์แบบไดนามิก-----------------------------------
    For i = sDate To eDate 'ลูปหาตั้งแต่วันเริ่มต้นจนวันสิ้นสุด
        If Weekday(i) <> 1 Then ' เมื่อไม่ใช่วันอาทิตย์ (1 คือ วันอาทิตย์)
            mCount = IIf(iCount > mCount, iCount, mCount) 'หาตัวเลขขยายมากขึ้นในแต่ละลูปเพื่อนำมาปรับขนาดความยาวของอาร์เรย์
            'ขยายความยาวของอาร์เรย์ให้มากขึ้น ตามข้อมูลวันที่ ที่ต้องจัดเก็บลงตัวแปร เพราะข้อมูลมีจำนวนมากน้อยไม่แน่นอนจึงต้องใช้ตัวแปรแบบไดนามิก
            ReDim Preserve tDay(iSun, mCount) 'ขยายมากขึ้นได้ แต่ทำให้น้อยลงไม่ได้ เพราะข้อมูลค่าเก่าจะหาย
            'แปรงข้อมูลวันที่เป้าหมายที่ไม่ตรงกับวันอาทิตย์ ไล่ใส่ลงไปในตัวแปรอาร์เรย์แบบ 2 มิติ
            tDay(o, iCount) = cThaiNumber(Day(i)) & " " & MonthNameThai(i) & " " & cThaiNumber(IIf(Year(i) = Format(i, "yyyy"), Year(i) + 543, Format(i, "yyyy")))
            iCount = iCount + 1
        Else 'หากเป็นวันอาทิตย์
            o = o + 1 'หากเป็นวันอาทิตย์ ให้เลื่อนตัวแปรอาร์เรย์ในมิติแรกขึ้นไปอีกลำดับ เพื่อแยกชั้นตัวแปรระหว่างช่วงวันที่ติดวันอาทิตย์
            iCount = 0 'ปรับมิติที่สองให้เป็นลำดับ 0 เริ่มใหม่
        End If
    Next i
    '---------------------------------------------------------------------------------------------------
    'เรียกแสดงค่าตัวแปรอาร์เรย์ออกมาตามรูปแบบที่เราต้องการ------------------------------------------------
    Dim firstDay As Long 'เก็บค่าลำดับของมิติตัวแปรลำดับแรกที่จะแสดง
    Dim lastDay As String 'เก็บข้อมูลวันที่วันสุดท้ายก่อนถึงวันอาทิตย์
    Dim endDay As String 'เก็บวันที่สุดท้ายไว้ใช้ในข้อความ ให้ไว้ ณ วันที่
    Dim strDay As String 'ไล่เก็บรวบรวมสรุปข้อมูลแสดงทั้งหมด
    firstDay = -1 'เก็บค่าลำดับมิติตัวแปรแรกที่ไม่ตรงกับวันอาทิตย์ (กันไว้กรณีที่วันแรกของข้อมูลเป็นวันอาทิตย์พอดี ทำให้ตัวแปรมิติแรกอาจไม่ได้เริ่มต้นที่ 0 ก็ได้)
    For i = 0 To UBound(tDay, 1) 'ลูปตัวแปรอาร์เรย์ในมิติแรกที่มีการจัดเก็บ ตั้งแต่ลำดับแรกจนลำดับสุดท้าย
        lastDay = "" 'ล้างค่าวันที่สุดท้ายทุกครั้งเมื่อขึ้นมิติตัวแปรใหม่
        For o = 0 To UBound(tDay, 2) 'ลูปตัวแปรอาร์เรย์ในมิติสองที่มีการจัดเก็บ ตั้งแต่ลำดับแรกจนลำดับสุดท้าย
            If tDay(i, o) & "" <> "" Then 'ถ้าค่าตัวแปรอาร์เรย์ในมิตินั้นไม่ใช่ค่าว่าง (แสดงว่ามีข้อมูล)
                lastDay = tDay(i, o) ' ให้บันทึกในตัวแปร lastDay ไปเรื่อยๆ จนข้อมูลลูปไปถึงสุดท้ายเราก็จะได้วันที่วันสุดท้าย ของตัวแปรอาร์เรย์ในชั้นมิตินั้น
                endDay = lastDay
                If firstDay = -1 Then
                    firstDay = i 'หากตัวแปรอาร์เรย์ลำดับนั้นไม่ใช่ค่าว่าง ก็แสดงว่าให้เริ่มต้นวันที่ที่ลำดับมิตินั้น จึงบันทึกลงไปในตัวแปร fristDay
                End If
            End If
        Next o
        If i = firstDay Then 'ถ้า i เท่ากับค่าในตัวแปร firstDay แสดงว่าเป็นค่าวันที่แรกที่จะแสดง
            If tDay(i, 0) <> lastDay Then ' ถ้าวันที่นั้นไปใช่วันที่สุดท้ายในมิตินั้น แสดงว่าต้องมีวันที่ 2 ช่วง
                strDay = "วันที่ " & tDay(i, 0) & " - วันที่ " & lastDay ' บรรทัดแรกของวันที่ ที่จะแสดงให้ขึ้นต้นคำว่า วันที่
            Else
                strDay = "วันที่ " & tDay(i, 0) ' ถ้าวันที่นั้นเท่ากับวันที่สุดท้ายในมิตินั้นด้วย แสดงว่าจะมีวันที่แค่วันเดียว
            End If
        Else 'ถ้าเป็นบรรทัดต่อๆไป
            If tDay(i, 0) & "" <> "" And lastDay <> "" Then 'ถ้ามีข้อมูล
                If tDay(i, 0) <> lastDay Then ' ถ้าวันที่นั้นไปใช่วันที่สุดท้ายในมิตินั้น แสดงว่าต้องมีวันที่ 2 ช่วง
                    strDay = strDay & vbCrLf & "และ " & tDay(i, 0) & " - วันที่ " & lastDay 'บรรทัดต่อๆไปจะแสดงขึ้นต้นด้วยคำว่า และ
                Else
                    strDay = strDay & vbCrLf & "และ " & tDay(i, 0) ' ถ้าวันที่นั้นเท่ากับวันที่สุดท้ายในมิตินั้นด้วย แสดงว่าจะมีวันที่แค่วันเดียว
                End If
            End If
        End If
    Next i
    '---------------------------------------------------------------------------------------------------
    strDay = strDay & vbCrLf & "ให้ไว้ ณ วันที่ " & endDay 'เก็บข้อมูลในรูปแบบที่เราต้องการในตัวแปร strDay
    Seminar = strDay
End Function

การใช้งาน: Seminar(วันที่เริ่มต้น, วันที่สิ้นสุด)
Seminar(#3/1/2024#, #3/15/2024#)
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown, sjs, Su, mtaccess

4
หากรู้ url เป้าหมายที่จะทำการใส่แล้วดาวโหลดไฟล์ได้เลย เราสามารถเขียนฟังก์ชั่นสำหรับ Download ไฟล์นั้นด้วย VBA โดยไม่ต้องเปิดเว็บเบราว์เซอร์ (web browser) เพื่อดาวน์โหลด

'----------------Code Start----------------
Public Function DownloadFileB(ByVal URL As String, ByVal DownloadPath As String, ByRef Username As String, ByRef Password, Optional Overwrite As Boolean = True) As Boolean
On Error GoTo Failed
    Dim WinHttpReq As Object
    Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
    WinHttpReq.Open "GET", URL, False, Username, Password
    WinHttpReq.send
    If WinHttpReq.Status = 200 Then
        Dim oStream As Object: Set oStream = CreateObject("ADODB.Stream")
        oStream.Open
        oStream.Type = 1
        oStream.Write WinHttpReq.responseBody
        oStream.SaveToFile DownloadPath, Abs(CInt(Overwrite)) + 1
        oStream.Close
        DownloadFileB = Len(Dir(DownloadPath)) > 0
        Exit Function
    End If
Failed:
    DownloadFileB = False
End Function
'-----------------Code End-----------------
 
<การใช้งาน>
DownloadFileB("ที่อยู่ url เป้าหมาย", "ที่อยู่พาธและชื่อไฟล์ที่ต้องการเซฟ", "ชื่อผู้ใช้(ถ้ามี)", "รหัสผ่าน(ถ้ามี)", เขียนทับไฟล์เดิม ) As Boolean
 
<ตัวอย่าง>
DownloadFileB("https://wallpapersflix.com/cool/wp-content/uploads/2020/07/Cool-Wallpaper-PC.jpg", "C:\TEMP\Pic.jpg", "", "")
โพสต์นี้ได้รับคำขอบคุณจาก: PookPuy, kamondanai syrup

5
ลองดูคลิปตัวอย่างเผื่อช่วยเป็นไอเดียได้ครับ

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

6
ถ้าโค้ดที่สแกนเป็นรูปแบบเดียวกันหมด แล้วเราต้องการเก็บเฉพาะอักษรที่อยู่หน้าตัว , แรก เป็นรูปแบบๆนี้ตลอดเลยก็ใช้ฟังก์ชั่น Left() กับ Instr() ในการตัดคำได้ครับ โดยใส่โค้ดใน Event > After Update ของตัว TextBox

left("S2201234, A1,1",instr(1,"S2201234, A1,1",",")-1)

แทนค่าด้วยชื่อ TextBox สมมุติชื่อ Text1
left(Me.Text1,instr(1,Me.Text1,",")-1)

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

7
ผมพอมีโค๊ด Capture และเซฟเป็นไฟล์อยู่ ไว้ผมทำคลิปตัวอย่างให้ดูอาจเป็นแนวทางได้นะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Un

8
ตัวอย่างที่ผมเคยทำและเก็บไว้นะครับ แต่ผมใช้กับ SQL SERVER ไม่เคยลองกับ MySQL นะครับ

- ต้องการลิ้งค์ตารางชื่อ Table1 จาก SQL Server เข้ามายัง MS Access 
- ข้อมูล SQL SERVER
--------------------------
Server Name  : ASPIRE-ONE
Database Name: Demo
Login        : sa
Password     : Abc!23
--------------------------
 
<DAO>
'----------------Code Start----------------
Sub LinkSQL_DAO()
    Dim db As DAO.Database
    Dim tdf As DAO.TableDef
    Set db = CurrentDb
    Set tdf = db.CreateTableDef("dbo_Table1") 'ชื่อตารางที่ลิ้งค์เข้ามาใหม่
    tdf.Connect = "ODBC;Driver=SQL SERVER;SERVER=ASPIRE-ONE;UID=sa;PWD=Abc!23;Database=Demo;"
    tdf.SourceTableName = "Table1" 'ชื่อตารางเป้าหมายที่เครื่อง SQL Server
    db.TableDefs.Append tdf
'-------- หากต้องการลิ้งค์เพิ่มอีกตาราง  -------------------- 
'    Set tdf = db.CreateTableDef("dbo_Table2")
'    tdf.Connect = "ODBC;Driver=SQL SERVER;SERVER=ASPIRE-ONE;UID=sa;PWD=Abc!23;Database=Demo;"
'    tdf.SourceTableName = "Table_2"
'    db.TableDefs.Append tdf
'--------------------------------------------------
'-------- หากต้องการลบลิ้งค์ตาราง  --------------------
'    db.TableDefs.Delete "dbo_Table1"
'--------------------------------------------------
    db.Close: Set db = Nothing
End Sub
'-----------------Code End-----------------
 
* หมายเหตุ: คำสั่งนี้จะไม่สามารถเซฟรหัสผ่านได้ ทุกครั้งที่เปิดไฟล์ฐานข้อมูล MS Access ใหม่แล้วเรียกลิ้งค์ตารางที่สร้างจะต้องใส่รหัสผ่านใหม่ในครั้งแรกเสมอ จึงเหมาะกับการใช้งานชั่วคราว หรืออาจต้องใช้คำสั่งลบลิ้งค์ตารางแล้วสร้างใหม่ทุกครั้งเมื่อเปิดไฟล์แทน
โพสต์นี้ได้รับคำขอบคุณจาก: chai, sjs, Max

9
เหมือนเคยตอบไปนานแล้ว ไม่รู้ว่าแนวเดียวกันหรือเปล่านะครับ ลองดูกระทู้นี้ครับ
https://www.thai-access.com/index.php?topic=344.0
โพสต์นี้ได้รับคำขอบคุณจาก: Max, aphichet.p@gmail.com

10
จำได้ว่ามันมีหลายแบบมาก ทั้ง api wmi แต่ที่ผมมีในเครื่องเป็นแบบง่ายๆ ไม่ได้แสดงค่าอะไรแค่ให้ค่า True กับ False เท่านั้น แต่ฟังก์ชั่นนี้ตอบสนองเร็วใช้ได้ดีกว่าการ Ping แต่แม่นยำป่าว ต้องลองดูนะครับ

Function SystemOnline(ByVal ComputerName As String) As Boolean
    Dim colPingResults As Variant
    Dim oPingResult As Variant
    Dim strQuery As String
    strQuery = "SELECT * FROM Win32_PingStatus WHERE Address = '" & ComputerName & "'"
    Set colPingResults = GetObject("winmgmts://./root/cimv2").ExecQuery(strQuery)
    For Each oPingResult In colPingResults
        If Not IsObject(oPingResult) Then
            SystemOnline = False
        ElseIf oPingResult.StatusCode = 0 Then
            SystemOnline = True
        Else
            SystemOnline = False
        End If
    Next
End Function
-----------------------------------------------------
การใช้งาน
SystemOnline("192.168.1.3")
หรือ
SystemOnline("ชื่อคอมเป้าหมาย")
โพสต์นี้ได้รับคำขอบคุณจาก: pondniizz, Max

11
ก่อนอื่น เท่าที่ดู ผมว่าถ้าจะเทียบค่าต้องเขียนอ้างให้ตัวเลข โดยการใช้ มากว่า น้อยกว่า เทียบ String มันจะเพียนไปจากที่ตั้งใจไว้ และอีกอย่าง ผมว่าลองใช้ Between มันจะดูง่ายกว่าป่าวครับ

strCriteriaM = "([Month] between " & Me.FROMmonthtxt.Value & " and " & Me.TOmonthtxt.Value & ") and ([Year] between " & Me.FROMyeartxt.Value & " and " & Me.TOyeartxt.Value & ")"

ไม่รู้ว่าได้ตามต้องการป่าวนะครับ เป็นไอเดีย
โพสต์นี้ได้รับคำขอบคุณจาก: SSukHaveq

12
เสริมหน่อยนะครับ คือ Unix Timestamp ในการแปลง เวลาจะเป็นมาตรฐาน GMT ซึ่งหากต้องการให้แสดงเป็นเวลาไทยต้อง GMT+7:00 ขึ้นอยู่กับว่าข้อมูลบันทึกมาจากไหนถ้าบันทึกเวลาเป็นไทยอยู่แล้วก็ไม่ต้องแปลง แต่ส่วนใหญเวลาเขาแปลงแสดงในสาธารณะเขาจะใช้ GMT ถ้าอย่างนั้น หากเราอยากจะรู้ว่าเป็นเวลาไทยเท่าไหร่ก็ต้องบวกอีก 7 ชั่วโมงด้วยนะครับ ไม่งั้นเวลาจะไม่ตรง ต้องตรวจสอบความถูกต้องของข้อมูลด้วยนะครับ
https://www.epochconverter.com/
โพสต์นี้ได้รับคำขอบคุณจาก: sjs, Max

13
มันเป็นลักษณะคำสงวนของ MS Access (Wildcard Characters) ลองเพิ่ม single quote เป็นสองตัวดูครับว่าเจอป่าว
SQL = "SELECT Title, Name, Surname " _
        & "FROM Employee " _
        & "WHERE Name = N''" & Me.txtSearchName & "''"
โพสต์นี้ได้รับคำขอบคุณจาก: mtaccess

14
การยกเลิกการตั้งค่า Security Warning Macro Setting ของ Ms Access ให้ใช้งานคำสั่ง VBA ได้
 
1. คลิ๊กเมาส์ขวาที่ Desktop เลือกเมนู New > Text Document
 
2. จะได้ไฟล์ New Text Document.txt เปล่าๆมา คลิ๊กๆเปิดไฟล์ขึ้นมา ใส่โค๊ดนี้ลงไป
'----------------Code Start----------------
On Error Resume Next
 
Dim WshShell
Set WshShell = CreateObject("WScript.Shell")
Dim objVer
Set objVer = CreateObject("Access.Application")
 
Dim strRegPath
Dim Application_Version
Application_Version = objVer.Version 'Return 14.0, 15.0, etc.
 
strRegPath = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application_Version & "\Access\Security\VBAWarnings"
If WshShell.RegRead(strRegPath) <> 1 then
    If MsgBox("Click OK to Enable all macros.", vbQuestion + vbOKCancel, "Security VBA Warnings") = vbOK Then
        WshShell.RegWrite strRegPath, 1, "REG_DWORD"
    End If
Else
    'WScript.echo "กำหนดใช้งาน Macros ไว้อยู่แล้ว"
    MsgBox "กำหนดใช้งาน Macros ไว้อยู่แล้ว", ,"Security VBA Warnings"
End If
Wscript.Quit

3. จากนั้นไปที่เมนู File > Save As: เป็นชื่ออะไรก็ได้แต่นามสกุล vbs เช่น Macro.vbs และ Encoding: ANSI เซฟ แล้วปิดโปรแกรม notepad ไป
 
4. จะเห็นไฟล์ชื่อ Macro.vbs อยู่บน Desktop คลิ๊กๆเพื่อเรียกไฟล์ จะมีหน้าต่างข้อความ Click OK to Enable all macros. ให้กด OK ไปจนเสร็จ จะเป็นการแก้ค่ารีจีสตี้ในเครื่องเรื่องของการแจ้งเตือน หรือต้องการกำหนดแก้ไขอย่างอื่นก็แก้โค้ดเอาได้เลยครับ

5. ส่งไฟล์ไปให้เครื่องอื่นโดยรูปแบบ .zip แล้วลองให้เค้ารันไฟล์ที่ทำนี้ดูครับ

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

15
ห้อง MS Access / : โปรแกรม Access error Query " is corrupt
« เมื่อ: 21 พ.ย. 62 , 13:53:29 »
ลองวิธี Uninstall ตัวอัพเดทออกตามวิธีนี้ดูว่าได้ไม๊ครับ
http://fmsinc.com/MicrosoftAccess/Errors/query_is_corrupt/index.htm
โพสต์นี้ได้รับคำขอบคุณจาก: mtaccess

16
โพสต์นี้ได้รับคำขอบคุณจาก: OddyWriter, Mercury

17
เราก็สามารถสร้างเงื่อนไขต่อไปได้ครับว่า ถ้าฟิลด์ TerminateDate มีค่าก็ให้เทียบค่าวันที่ฟิลด์นี้ แต่ถ้าไม่มีค่าก็เทียบค่าวัน ที่วันที่ปัจจุบัน
คำนวณวัน
CompanyHiringDate_Day:
IIf(isnull([TerminateDate]),
IIf(DateDiff("d",DateAdd("m",DateDiff("m",[CompanyHiringDate],Date()),[CompanyHiringDate]),Date())<0,DateDiff("d",DateAdd("m",DateDiff("m",[CompanyHiringDate],Date())-1,[CompanyHiringDate]),Date()),DateDiff("d",DateAdd("m",DateDiff("m",[CompanyHiringDate],Date()),[CompanyHiringDate]),Date())),
IIf(DateDiff("d",DateAdd("m",DateDiff("m",[CompanyHiringDate],[TerminateDate]),[CompanyHiringDate]),[TerminateDate])<0,DateDiff("d",DateAdd("m",DateDiff("m",[CompanyHiringDate],[TerminateDate])-1,[CompanyHiringDate]),[TerminateDate]),DateDiff("d",DateAdd("m",DateDiff("m",[CompanyHiringDate],[TerminateDate]),[CompanyHiringDate]),[TerminateDate])))

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

18
ลองใช้เว็บเบราเซอร์ดูไม๊ครับ
https://youtu.be/bEY-l75nGqM?t=1332
โพสต์นี้ได้รับคำขอบคุณจาก: nonc31

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