EXCEL TOOLS
Excel Add-ins ที่พัฒนาโดยคุณสันติพงศ์ ณสุย (MVP Excel 2010-2020) ด้วยภาษา C# เพื่อแก้ไขปัญหาไฟล์ใหญ่ คำนวณนาน ทำงานช้า จัดการข้อมูลต่าง ๆ ที่ทำงานประจำวันได้อย่างสะดวกรวดเร็ว สนใจคลิกไปดูได้ที่นี่ครับ => Excel Tools
Excel Add-ins ที่พัฒนาโดยคุณสันติพงศ์ ณสุย (MVP Excel 2010-2020) ด้วยภาษา C# เพื่อแก้ไขปัญหาไฟล์ใหญ่ คำนวณนาน ทำงานช้า จัดการข้อมูลต่าง ๆ ที่ทำงานประจำวันได้อย่างสะดวกรวดเร็ว สนใจคลิกไปดูได้ที่นี่ครับ => Excel Tools
[code]
และปิดด้วย [/code]
ตัวอย่างเช่น [code]dim r as range[/code]
เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)รบกวนอาจารย์อัพไฟล์ส่งให้ผมหน่อยครับ เพราะผมลองอีกกี่รอบมันก็เออเร่อครับsnasui wrote: ผมทดสอบไฟล์ที่แนบมาแล้ว ไม่เกิด Error ในบรรทัดที่จับภาพมาครับ
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: Select all
If Me.ListBox1.Selected(i) = True Or TextBox1.Text = "" Then
ปรับแล้วก็ยังเหมือนเดิมครับpuriwutpokin wrote:ปรับเป็นCode: Select all
If Me.ListBox1.Selected(i) = True Or TextBox1.Text = "" Then
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
ไม่รู้ว่าผมทำผิดตรงไหนครับ ลองปรับตามที่แจ้งมาแล้วก็ยังเหมือนเดิม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
จุดประสงค์จริงๆคืออยากได้ตามรูปด้านล่างนี้ครับ มีกี่รายการก็โชว์ขึ้นมา จากรูปในช่องค้นหา พิมพ์ 12 ในListbox มี 2 รายการที่ มี 12 เพราะหมายเลขคดีแดงสามารถซ้ำกันได้ แต่ชื่อศาลจะไม่มีซ้ำกัน ครับpuriwutpokin wrote:ยกเลิกอันล่างครับ ใช้ตัวที่ผมให้ครับ ใช้ซ้อนกันไม่ได้ครับ
1.เวลาค้นหาข้อมูลหากไม่ตรงก็ไม่ต้องใส่ข้อมูล ให้ Listbox เป็นค่าว่าง
2.หากข้อมูลที่ค้นหาตรงก็ให้ใส่ข้อมูล
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 ที่ใช้อยู่จะนำข้อมูลบนสุดมาแสดง ทำให้รายการต่อไปไม่สามารถแก้ไขได้snasui wrote: เรื่องเดียวกันไม่ควรตั้งกระทูใหม่ครับ
ตัวอย่าง 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
รบกวนขอดูด้วยครับผม ขอบคุณครับpuriwutpokin wrote:ผมลองทำแบบไฟล์เก่าของคุณ rich37 ได้ประมาณนี้ตามไฟล์แนบครับ ใช้แบบดั่งเดิม
ขอบคุณครับ โหลดมาดูแล้วได้ผลแบบไหนจะแจ้งให้ทราบอีกครั้งหนึ่งครับpuriwutpokin wrote:ส่งไม่ผ่านครับ ใช้มือถือต่อเน็ตสัญญาณอ่อน ส่งผ่านแล้วครับดูที่กระทู้บนครับ
ผมได้ทำการปรับ Code เป็นตัวด้านล่างนี้snasui wrote: แต่หากจะให้แสดงเฉพาะค่าที่คล้ายกับค่าที่ต้องการค้นหา แนวทางนี้มาผิดทางครับ การทำเช่นนั้นควรจะ Loop จาก Database มาวางใน ListBox ไม่ใช่ให้เลือกรายการใน ListBox ที่ตรงกันกับค่าที่ต้องการค้นหาเช่น Code ด้านบน
การแสดงค่าใน ListBox ควรจะนำค่าจากต้นทางมาแสดง ไม่ใช่นำค่าใน ListBox เองมาแสดง เพราะหากทำเช่นนั้น เมื่อมีการค้นหาไปรอบนึงแล้ว ListBoxt จะเหลือเพียงบางจำนวนที่ตรงกับเงื่อนไขในครั้งนั้น หากคีย์ค้นหาครั้งต่อไปก็จะไม่เหลือรายการที่ตรงกับค่าที่ค้นหาอีก เช่นนี้เป็นต้นครับ
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
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
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
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