แสดงกระทู้

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

หน้า: [1] 2 3 4
1
โทษทีครับ พอดีไม่ได้อ่าน ขอบคุณ คุณ 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

2
เห็นคำถามนี้น่าสนใจตรงเราสามารถใช้งานตัวแปรอาร์เรย์แบบ 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

3
ใช้ Tab Control เถอะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown

4
น่าจะใช้ การเคลื่อนย้ายเม้าส์ และ การกำหนดเวลา ครับ  อาจใช้ทั้ง 2 ร่วมกัน หรือ อย่างใดอย่างหนึ่ง

Private Sub MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
   เงื่อนไข
      ตรงเงื่อนไข ก็เปิดฟอร์ม
End Sub

Private Sub Form_Timer()
  เงื่อนไข
     ตรงเงื่อนไข ก็เปิดฟอร์ม
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown

5
ตย. แกะเอาเด้อ
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown

6
ทำได้แล้วค่ะ
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown

7
ใช้งานได้ปกติ มีการ Update ใหม่เป็นระยะๆ ทำให้โปรแกรม 365 ทันสมัยอยู่เสมอ ไม่มีปัญหากับรุ่นอื่นๆ ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown

8
เหมือนจะง่าย  แต่กว่าจะเข้าใจ  นำมาฝากครับ  วินโดว์ 7 ขึ้นมา ใช้ SendKeys "{HOME}" และ  SendKeys "{END}" ไม่ได้แล้ว

Option Compare Database

#If Win64 Or VBA7 Then
    Private Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    Private Declare PtrSafe Function GetKeyState Lib "user32.dll" (ByVal nVirtKey As Long) As Integer
#Else
    Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    Private Declare Function GetKeyState Lib "user32.dll" (ByVal nVirtKey As Long) As Integer
#End If

    Private Const VK_HOME = &H24
    Private Const VK_END = &H23
    Private Const VK_F2 = &H71
   
Private Sub Command2_Click() 'SendKeys HOME
    Me.Text0.SetFocus
    keybd_event VK_F2, 1, 0, 0
    keybd_event VK_F2, 1, KEYEVENTF_KEYUP, 0
    keybd_event VK_HOME, 1, 0, 0
    keybd_event VK_HOME, 1, KEYEVENTF_KEYUP, 0
End Sub

Private Sub Command3_Click() 'SendKeys END ใช้ F2 แทน
    Me.Text0.SetFocus
    keybd_event VK_F2, 1, 0, 0
    keybd_event VK_F2, 1, KEYEVENTF_KEYUP, 0
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown

9
ถามเองตอบเองอีกแล้ว :cry: :sweat: :dizzy: :ouch:


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

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

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

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

12
ตรงส่วนของตั้งค่าหน้ากระดาษของรายงาน
สามารถกำหนด 2 column ได้ครับ แต่หัวเรื่องแบบนั้นจะมีอันเดียวครับ

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

14
ส่งตัวอย่างที่ทำไว้ มาให้หน่อยได้ไหมครับ
เดี่ยว เขียนเป็นโค้ดให้ครับ
ผมต้องการดูขั้นตอนการ ทำงานเพื่อแสดงผล

ช่วงนี้ไม่ค่อยได้ตอบด้วย ภาระงานเพิ่มขึ้นครับที่โรงพยาบาลมีผู้ป่วยโควิดเพิ่มมากขึ้นด้วย
งานที่ต้องประสานเลยเยอะขึ้นครับเลยไม่ค่อยได้มาตอบ แต่มีหลายๆท่านช่วยตอบอยู่ครับ

หมายเหตุ แต่ช่วงนี้ไม่ค่อยเห็นอาจารย์สันติสุขเลย คิดถึงเลยครับ
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown

15
ลอง Compile / DeCompile ดูหรือยังครับ
ลอง compact and repair ด้วยครับ
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown

16
Me.rank คืออะไรครับ​ รับค่าจาก​ TextBox​ หรือเปล่า
แล้วตัวแปร​ rank ประกาศเพื่ออะไร
ส่งรูปมาให้ดูดีกว่าครับ​ นึกภาพไม่ออก
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown

17
ใน Access ไม่มีความสามารถนี้ครับ
มีเฉพาะในฐานข้อมูลใหญ่ๆ อย่าง Oracle

ขออธิบายให้เข้าใจง่ายๆ ถึงการทำงานที่แตกต่างกันนะครับ
ใน Oracle นั้น เวลาที่เราสั่ง Delete Data นั้น จะเป็นการปิด Record ที่ลบเท่านั้น (ใส่ Time Stamp เอาไว้ด้วย) แต่ข้อมูลยังไม่ถูกลบ จึงสามารถสั่ง Rollback ได้ แต่ก็ต้องแลกมาด้วยการใช้พื้นที่ ที่เพิ่มขึ้นมาเรื่อยๆ
การสั่งลบข้อมูลจริงๆ ของ Oracle ต้องใช้คำสั่ง Pack เพื่อทำการลบข้อมูลออกจริงๆ

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

18
สมมุติตาราง A ชื่อ Mytable
1.สร้างคิวรี่ใส่ SQL เข้าไป ตั้งชื่อ Q1
SELECT Idnumber, LV  FROM MyTable GROUP BY Idnumber, LV HAVING ((Not (LV) Is Null));

2.สร้างปุ่มขึ้นมา 1 ปุ่ม
ใส่โค้ดนี้เข้าไป
Private Sub Command0_Click()
Dim rst As DAO.Recordset
    Set rst = CurrentDb.OpenRecordset("Mytable", dbOpenDynaset)
   
    rst.MoveFirst
    Do Until rst.EOF
    If IsNull(rst!LV) Or rst!LV = "" Then
    rst.Edit
    rst!LV = DLookup("LV", "Q1", "Idnumber =" & rst!Idnumber & "")
    rst.Update
    End If
       rst.MoveNext
    Loop
   
    rst.Close: Set rst = Nothing
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown

หน้า: [1] 2 3 4