Page 2 of 3

Re: รบกวนตรวจ Code ให้ด้วยครับ

Posted: Tue Apr 04, 2017 11:07 pm
by snasui
:D ผมทดสอบไฟล์ที่แนบมาแล้ว ไม่เกิด Error ในบรรทัดที่จับภาพมาครับ

Re: รบกวนตรวจ Code ให้ด้วยครับ

Posted: Tue Apr 04, 2017 11:32 pm
by rich37
snasui wrote::D ผมทดสอบไฟล์ที่แนบมาแล้ว ไม่เกิด Error ในบรรทัดที่จับภาพมาครับ
รบกวนอาจารย์อัพไฟล์ส่งให้ผมหน่อยครับ เพราะผมลองอีกกี่รอบมันก็เออเร่อครับ

Re: รบกวนตรวจ Code ให้ด้วยครับ

Posted: Tue Apr 04, 2017 11:37 pm
by snasui
:D ผมใช้หลายเครื่องและหลายที่และแม้จะเป็นเครื่องเดิมก็จะไม่ได้ Save ไฟล์เอาไว้

กรณีนี้ก่อนทีจะโพสต์ผมทดสอบแล้วว่าใช้ได้ หากจะทำเลียนแบบ ให้นำ Code ที่ผมตอบไปวาง ไม่ต้องมีการเพิ่มลด Code ใดเข้าไปแล้วทดสอบดูใหม่ ติดแล้วค่อยแนบไฟล์นั้นมาถามกันอีกทีครับ

ไฟล์ล่าสุดที่นแนบมาไม่ได้ติดในบรรทัดนั้น ผมจึงไม่จำเป็นต้องแนบไฟล์นี้กลับไปแต่อย่างใดครับ

รบกวนช่วยปรับปรุง Code Vba ครับ

Posted: Wed Apr 05, 2017 2:51 pm
by rich37

Code: Select all

Private Sub TextBox6_Change()
    Dim i As Long
    Dim n As Long
    Dim Str As String
    Str = Me.TextBox6.Text
    n = Me.ListBox1.ListCount
    For i = 0 To n - 1
        If Left(Me.ListBox1.List(i), Len(Str)) = Str Then
            Me.ListBox1.ListIndex = i
            Exit Sub
        End If
    Next i
End Sub
จากCodeด้านบนเวลากดค้นหา จะดึงเอาข้อมูลที่ตรงมาใส่ใน ช่องข้อมูลต่างๆแต่หากไม่ตรง จะนำข้อมูลใกล้เคียงมาใส่แทน ซึ่งไม่ตรงกับความต้องการ สิ่งที่ต้องการคือ
1.เวลาค้นหาข้อมูลหากไม่ตรงก็ไม่ต้องใส่ข้อมูล ให้ Listbox เป็นค่าว่าง
2.หากข้อมูลที่ค้นหาตรงก็ให้ใส่ข้อมูล
ได้แนบไฟล์มาด้วยแล้ว ขอบคุณครับ

Re: รบกวนช่วยปรับปรุง Code Vba ครับ

Posted: Wed Apr 05, 2017 4:24 pm
by puriwutpokin
ปรับเป็น

Code: Select all

If Me.ListBox1.Selected(i) = True Or TextBox1.Text = "" Then

Re: รบกวนช่วยปรับปรุง Code Vba ครับ

Posted: Wed Apr 05, 2017 4:35 pm
by rich37
puriwutpokin wrote:ปรับเป็น

Code: Select all

If Me.ListBox1.Selected(i) = True Or TextBox1.Text = "" Then
ปรับแล้วก็ยังเหมือนเดิมครับ

Re: รบกวนช่วยปรับปรุง Code Vba ครับ

Posted: Wed Apr 05, 2017 5:23 pm
by puriwutpokin
ลองปรับเป็น

Code: Select all

Private Sub TextBox6_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim i As Long
    Dim n As Long
    Dim Str As String
    Str = Me.TextBox6.Text
    n = Me.ListBox1.ListCount
    For i = 0 To n - 1
        If Left(Me.ListBox1.List(i), Len(Str)) > 1 Then
            Me.ListBox1.ListIndex = i
            Exit Sub
        End If
    Next i
End Sub

Re: รบกวนช่วยปรับปรุง Code Vba ครับ

Posted: Wed Apr 05, 2017 5:43 pm
by rich37
puriwutpokin wrote:ลองปรับเป็น

Code: Select all

Private Sub TextBox6_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim i As Long
    Dim n As Long
    Dim Str As String
    Str = Me.TextBox6.Text
    n = Me.ListBox1.ListCount
    For i = 0 To n - 1
        If Left(Me.ListBox1.List(i), Len(Str)) > 1 Then
            Me.ListBox1.ListIndex = i
            Exit Sub
        End If
    Next i
End Sub
ไม่รู้ว่าผมทำผิดตรงไหนครับ ลองปรับตามที่แจ้งมาแล้วก็ยังเหมือนเดิม

Re: รบกวนช่วยปรับปรุง Code Vba ครับ

Posted: Wed Apr 05, 2017 5:55 pm
by puriwutpokin
ยกเลิกอันล่างครับ ใช้ตัวที่ผมให้ครับ ใช้ซ้อนกันไม่ได้ครับ

Re: รบกวนช่วยปรับปรุง Code Vba ครับ

Posted: Wed Apr 05, 2017 7:26 pm
by rich37
puriwutpokin wrote:ยกเลิกอันล่างครับ ใช้ตัวที่ผมให้ครับ ใช้ซ้อนกันไม่ได้ครับ
จุดประสงค์จริงๆคืออยากได้ตามรูปด้านล่างนี้ครับ มีกี่รายการก็โชว์ขึ้นมา จากรูปในช่องค้นหา พิมพ์ 12 ในListbox มี 2 รายการที่ มี 12 เพราะหมายเลขคดีแดงสามารถซ้ำกันได้ แต่ชื่อศาลจะไม่มีซ้ำกัน ครับ
อ้างอิงของเดิม
1.เวลาค้นหาข้อมูลหากไม่ตรงก็ไม่ต้องใส่ข้อมูล ให้ Listbox เป็นค่าว่าง
2.หากข้อมูลที่ค้นหาตรงก็ให้ใส่ข้อมูล

Re: รบกวนตรวจ Code ให้ด้วยครับ

Posted: Wed Apr 05, 2017 8:47 pm
by snasui
:D เรื่องเดียวกันไม่ควรตั้งกระทูใหม่ครับ

ตัวอย่าง Code การนำค่าตรงตัวมาแสดงตามด้านล่างครับ

Code: Select all

Private Sub TextBox6_Change()
    Dim i As Long
    Dim n As Long
    Dim Str As String
    Str = Me.TextBox6.Text
    n = Me.ListBox1.ListCount
    For i = 0 To n - 1
        If Me.ListBox1.List(i) = Str Then
            Me.ListBox1.ListIndex = i
            Exit Sub
        End If
    Next i
End Sub
แต่หากจะให้แสดงเฉพาะค่าที่คล้ายกับค่าที่ต้องการค้นหา แนวทางนี้มาผิดทางครับ การทำเช่นนั้นควรจะ Loop จาก Database มาวางใน ListBox ไม่ใช่ให้เลือกรายการใน ListBox ที่ตรงกันกับค่าที่ต้องการค้นหาเช่น Code ด้านบน

การแสดงค่าใน ListBox ควรจะนำค่าจากต้นทางมาแสดง ไม่ใช่นำค่าใน ListBox เองมาแสดง เพราะหากทำเช่นนั้น เมื่อมีการค้นหาไปรอบนึงแล้ว ListBoxt จะเหลือเพียงบางจำนวนที่ตรงกับเงื่อนไขในครั้งนั้น หากคีย์ค้นหาครั้งต่อไปก็จะไม่เหลือรายการที่ตรงกับค่าที่ค้นหาอีก เช่นนี้เป็นต้นครับ

Re: รบกวนตรวจ Code ให้ด้วยครับ

Posted: Wed Apr 05, 2017 9:05 pm
by rich37
snasui wrote::D เรื่องเดียวกันไม่ควรตั้งกระทูใหม่ครับ

ตัวอย่าง Code การนำค่าตรงตัวมาแสดงตามด้านล่างครับ

Code: Select all

Private Sub TextBox6_Change()
    Dim i As Long
    Dim n As Long
    Dim Str As String
    Str = Me.TextBox6.Text
    n = Me.ListBox1.ListCount
    For i = 0 To n - 1
        If Me.ListBox1.List(i) = Str Then
            Me.ListBox1.ListIndex = i
            Exit Sub
        End If
    Next i
End Sub
ขอโทษครับเรื่องการตั้งกระทู้ใหม่ ตามCode ที่อาจารย์ปรับปรุงมาให้ยังไม่ตรงกับความต้องการเท่าไหร่ครับ อยากให้เหมือนในรูปด้านล่างมากกว่าครับ ด้วยเหตุผลที่ว่า หากมีคดีที่ซ้ำกัน การ Vlookup ที่ใช้อยู่จะนำข้อมูลบนสุดมาแสดง ทำให้รายการต่อไปไม่สามารถแก้ไขได้
( หมายเลขคดีซ้ำกันได้ ) หากรายการขึ้นตามรูป ก็สามารถคลิกที่ Listbox เพื่อเลือกรายการที่ต้องการได้ทันที หากไม่มีตรงก็จะได้เพิ่มคดีใหม่เข้าไปได้ทันที่ครับ

Re: รบกวนตรวจ Code ให้ด้วยครับ

Posted: Wed Apr 05, 2017 9:24 pm
by snasui
:D ผมตอบไว้หมดแล้วตามที่ต้องการ ลองอ่านทบทวนอีกครั้งและเขียนมาใหม่เพราะได้แนะนำไว้แล้วว่าต้องใช้วิธีใด เมื่อเขียนมาเองแล้วติดตรงไหนค่อยถามกันต่อ

Code ที่ผมโพสต์ไปนั้นไม่ใช่เป็นการตอบเพื่อแก้ในส่วนที่เป็นปัญหา เพียงแต่ตอบว่า หากต้องการจะหาแบบตรงตัวจะต้องเขียนเช่นไร เป็นเพียงใจความประกอบ ไม่ใช่ใจความหลักครับ ใจความหลักคือให้ Loop จาก Database มาใช้ใน ListBox ครับ

หลักการทำงานลักษณะนี้มีลำดับคือ

เมื่อมีการเปลี่ยนค่าใน TextBox ให้ลบค่าใน ListBox ทิ้งก่อน แล้ว Loop ค่าจาก Database ที่ตรงกับค่าใน TextBox มาใส่ หากไม่ตรงเลยก็จะไม่มีเลย

Re: รบกวนตรวจ Code ให้ด้วยครับ

Posted: Wed Apr 05, 2017 9:29 pm
by rich37
:thup: ขอบคุณครับ

Re: รบกวนตรวจ Code ให้ด้วยครับ

Posted: Wed Apr 05, 2017 11:20 pm
by puriwutpokin
ผมลองทำแบบไฟล์เก่าของคุณ rich37 ได้ประมาณนี้ตามไฟล์แนบครับ ใช้แบบดั่งเดิม

Re: รบกวนตรวจ Code ให้ด้วยครับ

Posted: Wed Apr 05, 2017 11:33 pm
by rich37
puriwutpokin wrote:ผมลองทำแบบไฟล์เก่าของคุณ rich37 ได้ประมาณนี้ตามไฟล์แนบครับ ใช้แบบดั่งเดิม
รบกวนขอดูด้วยครับผม ขอบคุณครับ

Re: รบกวนตรวจ Code ให้ด้วยครับ

Posted: Wed Apr 05, 2017 11:40 pm
by puriwutpokin
ส่งไม่ผ่านครับ ใช้มือถือต่อเน็ตสัญญาณอ่อน ส่งผ่านแล้วครับดูที่กระทู้บนครับ

Re: รบกวนตรวจ Code ให้ด้วยครับ

Posted: Wed Apr 05, 2017 11:55 pm
by rich37
puriwutpokin wrote:ส่งไม่ผ่านครับ ใช้มือถือต่อเน็ตสัญญาณอ่อน ส่งผ่านแล้วครับดูที่กระทู้บนครับ
ขอบคุณครับ โหลดมาดูแล้วได้ผลแบบไหนจะแจ้งให้ทราบอีกครั้งหนึ่งครับ

Re: รบกวนตรวจ Code ให้ด้วยครับ

Posted: Thu Apr 06, 2017 8:14 am
by rich37
snasui wrote: แต่หากจะให้แสดงเฉพาะค่าที่คล้ายกับค่าที่ต้องการค้นหา แนวทางนี้มาผิดทางครับ การทำเช่นนั้นควรจะ Loop จาก Database มาวางใน ListBox ไม่ใช่ให้เลือกรายการใน ListBox ที่ตรงกันกับค่าที่ต้องการค้นหาเช่น Code ด้านบน

การแสดงค่าใน ListBox ควรจะนำค่าจากต้นทางมาแสดง ไม่ใช่นำค่าใน ListBox เองมาแสดง เพราะหากทำเช่นนั้น เมื่อมีการค้นหาไปรอบนึงแล้ว ListBoxt จะเหลือเพียงบางจำนวนที่ตรงกับเงื่อนไขในครั้งนั้น หากคีย์ค้นหาครั้งต่อไปก็จะไม่เหลือรายการที่ตรงกับค่าที่ค้นหาอีก เช่นนี้เป็นต้นครับ
ผมได้ทำการปรับ Code เป็นตัวด้านล่างนี้

Code: Select all

Private Sub TextBox6_Change()
   Dim x, i As Long, ii As Long, iii As Integer
    x = [_Data]
    With ListBox1
        If TextBox6 = "" Then
            .RowSource = "_Data"
        Else
            .RowSource = ""
            For i = 1 To UBound(x, 1)
                If LCase(x(i, 1)) Like LCase(TextBox6) & "*" Then
                    For ii = 1 To 9
                        .AddItem
                        .List(iii, ii - 1) = x(i, ii)
                    Next
                    iii = iii + 1
                End If
            Next
        End If
    End With
End Sub
สามารถค้นหาได้ตามต้องการแต่ ปัญหาที่ตามมาคือ จากที่สามารถแก้ไขรายการจากการเลือกรายการในListbox ได้ หลังจากใส่ Code แล้วเกิด Error 1004 ตามรูปนี้ครับ รบกวนช่วยดูให้หน่อยนะครับ

Code: Select all

Private Sub CommandButton4_Click() ' edit
Dim sonsat As Long
If ListBox1.ListIndex = -1 Then
        MsgBox "คุณยังไม่ได้ใส่ข้อมูล", vbInformation, "ระบบค้นหาสำนวน"
        Me.TextBox6.SetFocus
Exit Sub
End If
    lastrow = Sheets("Database").Cells(Rows.Count, 1).End(xlUp).Row
    Sheets("Database").Range("A2:I" & lastrow).Find(What:=ListBox1.Text, LookIn:=xlValues, LookAt:=xlWhole).Activate
    sonsat = ActiveCell.Row
        Cells(sonsat, 1) = Me.TextBox1.Value
        Cells(sonsat, 2) = Me.TextBox2.Value
        Cells(sonsat, 3) = Me.TextBox3.Value
        Cells(sonsat, 4) = Me.TextBox4.Value
        Cells(sonsat, 5) = Me.ComboBox3.Value
        Cells(sonsat, 6) = Me.ComboBox4.Value
        Cells(sonsat, 7) = Me.ComboBox1.Value
        Cells(sonsat, 8) = Me.ComboBox2.Value
        Cells(sonsat, 9) = Me.TextBox5.Value
        Me.TextBox6.SetFocus
        MsgBox "แก้ไขข้อมูลเรียบร้อย", vbInformation, "ระบบค้นหาสำนวน"
        ListBox1.List = Sheets("Database").Range("A2:I" & Sheets("Database").Cells(Rows.Count, 1).End(xlUp).Row).Value
        Me.TextBox7.Value = ListBox1.ListCount
        ActiveWorkbook.Save
End Sub

Re: รบกวนตรวจ Code ให้ด้วยครับ

Posted: Thu Apr 06, 2017 10:27 am
by rich37
สอบถามการปรับCodeด้านล่าง โดยการเลือก Option Button หากเลือก Option Button1 ให้ลือก Codeนี้

Code: Select all

Private Sub TextBox6_Change()
   Dim x, i As Long, ii As Long, iii As Integer
    x = [_Data]
    With ListBox1
        If TextBox6 = "" Then
            .RowSource = "_Data"
        Else
            .RowSource = ""
            For i = 1 To UBound(x, 1)
                If LCase(x(i, 1)) Like LCase(TextBox6) & "*" Then
                    For ii = 1 To 9
                        .AddItem
                        .List(iii, ii - 1) = x(i, ii)
                    Next
                    iii = iii + 1
                End If
            Next
        End If
    End With
End Sub
หากเลือก Option Button2 ให้ลือก Codeนี้

Code: Select all

Private Sub TextBox6_Change()
   Dim x, i As Long, ii As Long, iii As Integer
    x = [_Data]
    With ListBox1
        If TextBox6 = "" Then
            .RowSource = "_Data"
        Else
            .RowSource = ""
            For i = 1 To UBound(x, 1)
                If LCase(x(i, 4)) Like LCase(TextBox6) & "*" Then
                    For ii = 1 To 9
                        .AddItem
                        .List(iii, ii - 1) = x(i, ii)
                    Next
                    iii = iii + 1
                End If
            Next
        End If
    End With
End Sub