แสดงกระทู้

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

หน้า: 1 2 [3] 4 5
37
เราจะเขียนโค๊ดอย่างไร เพื่อให้ใน textbox ไม่ให้พิมพ์ตัวอักษรต้องห้ามในการตั้งชื่อไฟล์ เช่น / * ? ครับ
สีแดงคือชื่อ textbox นะครับ
KeyAscii = 47 คือ /
KeyAscii = 42 คือ *
KeyAscii = 63 คือ ?


Private Sub TextboxName_KeyPress(KeyAscii As Integer)
If (KeyAscii = 47 Or KeyAscii = 42 Or KeyAscii = 63) Then
        KeyAscii = 0
        Else
        KeyAscii = KeyAscii
 End If
End Sub

ุถ้าอยากจะเพิ่มคีย์อื่นๆ อีกก็ดู ASCII Characters ในเว็บนี้ครับ
https://bettersolutions.com/vba/strings-characters/ascii-characters.htm

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

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

39
ได้ข้อมูลมาจากเฟสบุ๊กเพจ "โปรแกรมเมอร์ไทย Thai programmer" ครับ

https://goalkicker.com/?fbclid=IwAR1TjcRyaWd6r_xdj510qNJOu_3B2c9EV_AWjkJ0_lyZqxdBS3bYFHCZERo

แนะนำเพิ่มเติมว่า สำหรับคนที่ชอบเขียนโปรแกรม ให้ศึกษาวิชา Data Structure (ส่วนนึงอยู่ในหนังสือ Algorithms) และ Algorithms เพราะจะช่วยให้ขยับโลกทัศน์ในการวิเคราะห์และหาวิธีตอบโจทย์ที่ซับซ้อนยิ่งขึ้นได้
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

40
ถ้าอยาก ระบุพิกัดเอง ผมจำได้ว่าเคยใช้ในลักษณะนี้

DoCmd.MoveSize {Right}, {Down}, {Width}, {Height}
ที่ Form_Open() หรือ ..

โดย..
{Right}    ระยะห่างจากขอบซ้ายไปทางขวา  |  ไม่ระบุค่า คือ ตามค่าที่คุณ PNR แนะนำไว้
{Down}   ระยะห่างจากขอบบนไปด้านล่าง    |  ไม่ระบุค่า คือ ตามค่าที่คุณ PNR แนะนำไว้
{Width}   ความกว้่างของฟอร์ม                |  ไม่ระบุค่า คือ ตามความกว้างของฟอร์ม
{Height}  ความสูงของฟอร์ม                   |  ไม่ระบุค่า คือ ตามความสูงของฟอร์ม
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

41
แบบที่ 1
ถ้าท่านกำหนด txtGroup1A0 1 2 3 4 5 6 ....  / txtGroup1B 1 2 3 4 5 6 ...... / txtGroup2A 1 2 3 4 5 6 ... ไปแบบนี้ ใช้การกำหนดเงื่อนไขจากชื่อของตัว Control เอาก็ได้คับเช่น

โค๊ด: [Select]
Private Sub Command1_Click() 'เลือก Event ที่ต้องการครับ
    Dim ctl As Control
    For Each ctl In Me
        If ctl.ControlType = acTextBox Then
            If Left$(ctl.Name, 10) = "txtGroup1A" Then 'Left 10 เพราะต้องการเช็คตัวอักษรทางซ้าย 10 ตัวซึ่งเป็นชื่อที่เหมือนกันของกลุ่ม
                ctl.Visible = False 'หรือ ctl.Visible = true หรือจะสร้างเงื่อนไขให้กลุ่มอื่นๆด้วยก็ได้เช่นกัน
            End If
        End If
    Next ctl
End Sub

แบบที่ 2
อีกวิธีอาจจะง่ายกว่าคือการกำหนดชื่อของกลุ่มที่ Tag ของกล่องข้อความแล้วกำหนดเงือนไขการซ่อนและแสดง
ผมสมมุติ textbox 6 ตัวชื่อกลุ่ม Group1


โค๊ด: [Select]
Private Sub Command1_Click()
    Dim ctl As Control
    For Each ctl In Me
        If ctl.Tag = "Group1" Then
                ctl.Visible = False
        End If
    Next ctl

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

42
ถ้าเป็นไฟล์พวก excel word access มันทำง่ายคับ ในการสั่งปิด แต่พอเป็นพวกไฟล์ PDF หรือ ไฟล์รูปภาพ คงยังหาวิธีไม่เจอเลยคับ
คือถ้าอยากจะปิดไฟล์พวกนี้จริงๆ คงต้องสั่งปิด Process ที่ทำงานอยู่กับโปรแกรมที่ใช้เปิดไฟล์รูปภาพ และโปรแกรม adobe reader ครับ

ส่วนปิดไฟล์ Word ก็ประมาณนี้ครับ

Dim sPath, sfilename, sLink, sCopyInto, myOutput As String
Dim fso As Object
Dim OpenDB As Object
Dim myFileOld As FileSystemObject
Dim appExtension As String
Dim ObjName As String

    Set fso = CreateObject("Scripting.FileSystemObject")
    sfilename = GetFileName
    myOutput = Right(sfilename, Len(sfilename) - InStrRev(sfilename, "."))
    sPath = GetFilePath
    sLink = sPath & sfilename
   
    sCopyInto = [Forms]![manHisInsu]![folderInsu] & "\" & [Forms]![manHisInsu]![Even2] & "." & myOutput  'แล้ว Copy File
    fso.CopyFile sLink, sCopyInto
    Set fso = Nothing
   
   appExtension = Right$(slink, Len(slink) - InStrRev(slink, ".") + 1) 'ดึงนามสกุลมา
   ObjName = Right(slink, Len(slink) - InStrRev(slink, "\")) 'ดึงชื่อไฟล์และนามสกุลมา

   If appExtension = ".doc" Or appExtension = ".docx" Then

   Set objWord = GetObject(, "word.application")
   Set objDocs = objWord.Documents

   For Each doc In objDocs
       If StrComp(doc.Name, ObjName, 1) = 0 Then
           doc.Close
           objWord.Application.Quit
           Exit For
       End If
   Next
   Set objDocs = Nothing
   Set objWord = Nothing
   End If


    Set myFileOld = New FileSystemObject 'สั่งลบไฟล์เดิม
    myFileOld.DeleteFile sLink
    Set myFileOld = Nothing
   
    MsgBox ("บันทึกเรียบร้อยแล้ว"), vbInformation, "ผลการทำงาน"

   
Exit_Command33_Click:
    Exit Sub

Err_Command33_Click:
    MsgBox " ไฟลนี้อาจเปิดอยู่ ให้ปิดไฟล์นี้เสียก่อน"
    Resume Exit_Command33_Click
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

43
ไฟล์ที่จะปิด คัดลอก และ ลบ ไม่ใช้ไฟล์ access แต่เป็นไฟล์ pdf หรืออื่น ๆ ได้ไหมครับ

สรุปมาให้ผมหน่อยครับ เป็นไฟล์ประเภทอะไรบ้าง
คงต้องทำเป็น Select Case ตามประเภทไฟล์ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

44
เช็ค path จากตัวแปร   sLink  เลยก็ได้คับถ้าเปิดอยู่ก็สั่งปิดแล้ว Copy พอ Copy เสร็จสั่งลบไฟล์เก่าเลย
ตรง Reference เพิ่ม microsoft scripting runtime ด้วยนะครับ

โค๊ด: [Select]
Dim sPath, sfilename, sLink, sCopyInto, myOutput As String
Dim fso As Object
Dim OpenDB As Object
Dim myFileOld As FileSystemObject

    Set fso = CreateObject("Scripting.FileSystemObject")
    sfilename = GetFileName
    myOutput = Right(sfilename, Len(sfilename) - InStrRev(sfilename, "."))
    sPath = GetFilePath
    sLink = sPath & sfilename
   
    sCopyInto = [Forms]![manHisInsu]![folderInsu] & "\" & [Forms]![manHisInsu]![Even2] & "." & myOutput  'แล้ว Copy File
    fso.CopyFile sLink, sCopyInto
    Set fso = Nothing
   
    Set OpenDB = GetObject(sLink) 'สั่งปิดไฟล์ก่อน
    OpenDB.Application.Quit
    Set OpenDB = Nothing

    Set myFileOld = New FileSystemObject 'สั่งลบไฟล์เดิม
    myFileOld.DeleteFile sLink
    Set myFileOld = Nothing
   
    MsgBox ("บันทึกเรียบร้อยแล้ว"), vbInformation, "ผลการทำงาน"

   
Exit_Command33_Click:
    Exit Sub

Err_Command33_Click:
    MsgBox " ไฟลนี้อาจเปิดอยู่ ให้ปิดไฟล์นี้เสียก่อน"
    Resume Exit_Command33_Click
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

45
คือเราอยากทำตัวหนังสือใน text box อยู่ข้างล่างบ้าง ตรงกลางบ้าง ค่ะ มันมีแต่ปุ่ม ชิดซ้าย ชิดขวา และกึ่งกลางแต่มันจะอยู่บนสุดตลอด  :cry: :cry: :cry:

กำหนด Topmargin เอาครับ ใส่ค่าตัวเลขยิ่งสูง ข้อความใน textbox ยิ่งลงมาต่ำครับเช่น การกำหนดแบบ เลือกตาม texbox ที่อยากกำหนดว่า แต่ละตัวกำหนดให้ข้อความอยู่ตรงไหน
โค๊ด: [Select]
Private Sub Form_Current()
Me.Textbox1.TopMargin = 100 'กำหนดตัวเลขได้ยิ่งสูงยิ่งต่ำ
End Sub

ถ้าอยากกำหนด textbox ทั้งหมดของฟอร์มกำหนดแบบนี้ครับ
โค๊ด: [Select]
Private Sub Form_Current()
Call SetMarginTextbox
End Sub
Sub SetMarginTextbox()
  Dim ctl As Control
    For Each ctl In Me.Controls
        If ctl.ControlType = acTextBox Then
            ctl.TopMargin = 100
        End If
    Next ctl
End Sub

หมายเหตุตรง
 If ctl.ControlType = acTextBox Then
สามารถกำหนดประเภทตัว control ที่ทำบ่อยๆ ได้ ดังนี้

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

46
ถ้าจะป้องกันการกดคีย์ภาษาไทยลงเท็กซ์บ็อกซ์ ก็ใส่โค้ดนี้ไว้ใน KeyPress event procedure
โค๊ด: [Select]
Private Sub xxx_KeyPress(KeyAscii As Integer)
    If KeyAscii >= 3585 And KeyAscii <= 3675 Then KeyAscii = 0
End Sub

ถ้าต้องการตรวจสอบว่ามีภาษาไทยอยู่ในเท็กซ์บ็อกซ์หรือไม่ ก็ใช้โค้ดนี้ครับ
โค๊ด: [Select]
    Dim i As Integer
    Dim c As String
   
    For i = 1 To Len(Me.Text2)
        c = Mid$(Me.Text2, i, 1)
        If AscW(c) >= 3585 And AscW(c) <= 3675 Then
            MsgBox "Found"
            Exit Sub
        End If
    Next i
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

47
จากกระทู้นี้ https://www.thai-access.com/index.php?topic=540.0 ครับ

Private Sub Command1_Click()
    Dim strPath As String
    Dim strFile As String
    Dim strTable As String
    Dim StrFileName As string

    strTable = "ชื่อตารางเป้าหมาย"     
    strPath = "d:\โฟลเดอร์ที่เก็บไฟล์ .txt"
    strFile = Dir(strPath & "*.txt")

    Do While strFile <> ""
    StrFileName = strPath & strFile       
    DoCmd.TransferText acImportDelim, "importdata", strTable, StrFileName ,False
           
    strFile = Dir
    Loop
End Sub

คือ strPath จะมีไฟล์ใหม่มาเพิ่มตลอด ต้องการไม่ให้ import ไฟล์เดิมซ้ำ(เพราะทำให้โปรแกรม importนานเกินจำเป็น) และไม่อยากลบไฟล์ต้นฉบับ(ต้องการเปลี่ยนจาก *.txt เป็น *.xxx หลักจาก import แล้ว) ต้องเขียนโค้ดเพิ่มอย่างไรครับ ขอบคุณครับ
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

49
ห้อง MS Access / : ลบไฟล์ที่เลือก
« เมื่อ: 29 ส.ค. 61 , 15:28:36 »
เพิ่มเป็นแบบนี้นะครับ
เวลาคุณกดบันทึกไฟล์ มันจะลบไฟล์เก่าต้นทางทิ้ง

Private Sub Command13_Click()
Call Copy
End Sub
Private Sub Import_Click()
Dim f As Object
Set f = Application.FileDialog(3)
f.AllowMultiSelect = True
f.Filters.Clear
f.Filters.Add "Picture Files", "*.bmp;*.jpg;*.gif;*.png"
If f.Show Then
    For i = 1 To f.SelectedItems.Count
        sFile = filename(f.SelectedItems(i), sPath)
        Me.GetFileName = sFile
        Me.GetFilePath = sPath
    Next
End If
End Sub

Sub Copy()
Dim sPath, sfilename, sLink, Snow, sCopyInto, myOutput As String
Dim fso As Object
Dim DeletePath As String

Set fso = CreateObject("Scripting.FileSystemObject")
Snow = Now
Snow = Format(Date, "YYYYMMDD")
sfilename = GetFileName
myOutput = Right(sfilename, Len(sfilename) - InStrRev(sfilename, "."))
sPath = GetFilePath
sLink = sPath & sfilename
sCopyInto = "D:\iDoc\" & Me.NewName & Snow & "." & myOutput
fso.CopyFile sLink, sCopyInto


    DeletePath = GetFilePath & GetFileName
    If fso.FileExists(DeletePath) Then
        fso.DeleteFile DeletePath
    End If


Set fso = Nothing
End Sub
Public Function filename(ByVal strPath As String, sPath) As String
    sPath = Left(strPath, InStrRev(strPath, "\"))
    filename = Mid(strPath, InStrRev(strPath, "\") + 1)
End Function
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

50
ห้อง MS Access / : ลบไฟล์ที่เลือก
« เมื่อ: 27 ส.ค. 61 , 13:17:51 »
รายละเอียดเพิ่มเติมด้วยครับ ไดอะล็อกบ๊อกซ์มาจากไหน เกี่ยวกับอะไร โค้ดที่ใช้คืออะไร และลบไฟล์ ณ ขั้นตอนไหน ลบในตัวไดอะล็อกบ๊อกซ์เองเลย หรือมาลบที่ไหน
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

51
ส่วนตัวไม่เคยใช้ Office 64 bits ครับ และไม่คิดจะใช้เพื่อตัดปัญหาเพราะยังไม่เห็นประโยชน์อะไรที่จะใช้ ลองอ่านบทความข้างล่างนี้ดูครับ

เลือกระหว่าง Office 32 หรือ 64 bits
support.office.com/en-us/article/choose-between-the-64-bit-or-32-bit-version-of-office-2dee7807-8f95-4d0c-b5fe-6c6f49b8d261

ความแตกต่างของโค้ด VBA สำหรับ Office 32 หรือ 64 bits
docs.microsoft.com/en-us/office/vba/Language/Concepts/Getting-Started/64-bit-visual-basic-for-applications-overview

อีกอย่างคือถ้าจะใช้ไฟล์ .accde บน Office 64 bits  ก็จะต้องสร้าง .accde ด้วย Office 64 bits ด้วย

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

52
ปัญหาที่เคยเจอมาคือ ชื่อ Module เป็นภาษาไทยครับ
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

53
ห้อง MS Access / : สร้างสายงาน
« เมื่อ: 14 ส.ค. 61 , 18:54:24 »
หลักการสร้างตารางข้อมูลคือ ต้องให้มีเซลล์ว่างๆ น้อยที่สุดหรือไม่มีเลยได้ยิ่งดี

แนะนำว่าควรแยกเป็นตารางย่อยๆ ดีกว่าครับโดย
1. ตารางเก็บชื่อคนที่เป็นตารางหลัก โดยเก็บข้อมูล กิติศักดิ์ จันทรา
2. ตารางเก็บข้อมูลคนอื่นๆ ที่สัมพันธ์กับตารางข้อมูลของชื่อหลัก (กิติศักดิ์ จันทรา)

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

54
ใช่เลยครับ
1. แต่ตรงนี้ผมไม่เคยตั้งชื่อมัน โปรแกรมมันจะตั้งอัตโนมัติเองใช่ไหมครับ
2. เป็นดังนี้ เราต้องแก้ไขชื่อ Project ไม่ให้ชื่อ Database ถูกต้องไหมครับ


ใช่ครับ แก้เป็นชื่ออื่นๆได้เลย
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

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