กระทู้เก่าบอร์ด อ.Yeadram
17,070 19
URL.หัวข้อ /
URL
วิธีการทำฟอร์มค้นหาข้อมูล
ใครทราบวิธีการทำฟอร์มค้นหาข้อมูล รบกวนช่วยหน่อยนะค่ะ
คือแบบว่า เมื่อคีย์ชื่อลงไปใน text box แล้วกดปุ่มค้นหา(Command58) ดังรูป
ก็จะปรากฎข้อมูลขึ้นมาค่ะ
รบกวนหน่อยนะค่ะพอดีไม่ทรายวิธีเขียนโค้ด VBAเลยค่ะ
คือแบบว่า เมื่อคีย์ชื่อลงไปใน text box แล้วกดปุ่มค้นหา(Command58) ดังรูป
ก็จะปรากฎข้อมูลขึ้นมาค่ะ
รบกวนหน่อยนะค่ะพอดีไม่ทรายวิธีเขียนโค้ด VBAเลยค่ะ
19 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R14224
แล้วจะคลิกค้นหาข้อมูลยังไงอะค่ะ โคตรงงเลยตอนนี้มั่วหมดแล้ว ช่วยดูไฟล์นี้ให้หน่อยนะค่ะ
http://zidofile.com/mr0f0O
รบกวนหน่อยนะค่ะ (ขอบคุณค่ะ)
http://zidofile.com/mr0f0O
รบกวนหน่อยนะค่ะ (ขอบคุณค่ะ)
3 @R14225
มันเป็นวิธีที่ง่ายนะครับ การค้นก็แบบง่ายๆ คือ เราต้องเรียงลำดับชื่อด้วย
เช่น ชื่อแหม่ม พอเราพิมพ์ แห มันก็จะขึ้นชื่อที่มี แห มาก่อนพอเราเลือกปุ๊ป
มันก็จะส่งข้อมูล ไปตามคอนโทล ไม่ต้องพิมพ์
เช่น ชื่อแหม่ม พอเราพิมพ์ แห มันก็จะขึ้นชื่อที่มี แห มาก่อนพอเราเลือกปุ๊ป
มันก็จะส่งข้อมูล ไปตามคอนโทล ไม่ต้องพิมพ์
4 @R14226
คุณเข้าใจผิดไปนิดนึง อาจเพราะอธิบายไม่ละเอียด(เพราะผมไม่รู้ว่าคุณรู้แค่ไหน)
1.ให้เปลี่ยนเป็น Combo เฉพาะชื่อผู้ใช้
2.ใน Source ของ Combo ฟิลด์แรก ให้ใช้ฟิลด์ที่จะค้นหา ในที่นี้ใช้ชื้อผู้ใช้ ตามด้วยรหัส สำนัก ชั้น หมายเลข
3.กำหนด Bound Column , Column Count ,Column Width
4.ใส่ Event Afterupdate
ลองปรับดูนะครับ
1.ให้เปลี่ยนเป็น Combo เฉพาะชื่อผู้ใช้
2.ใน Source ของ Combo ฟิลด์แรก ให้ใช้ฟิลด์ที่จะค้นหา ในที่นี้ใช้ชื้อผู้ใช้ ตามด้วยรหัส สำนัก ชั้น หมายเลข
3.กำหนด Bound Column , Column Count ,Column Width
4.ใส่ Event Afterupdate
Private Sub cbmane_AfterUpdate()
Me.cbID= cbmane.Column(1)
Me.cbsm= cbmane.Column(2)
Me.cbl= cbmane.Column(3)
Me.cbtell= cbmane.Column(4)
End Sub
ลองปรับดูนะครับ
5 @R14228
แหม่มพอเข้าใจแบบที่คุณบอกลองทำแล้ว แต่ยังไม่ใช้แบบที่ต้องการอะค่ะ คือต้องการแบบว่าเมื่อพิมพ์ชื่อ กดปุ่มค้นหา ก็จะปรากฏข้อมูลผู้ใช้คนนั้น เช่น ขึ้นชื่อ รหัส สำนัก ชั้น หมายเลขภายในอะค่ะ
พอจะเข้าใจที่แหม่มอธิบายไหมค่ะ ^^"
(พอดีเรียน Access มาแค่พื้นฐานเลยแทบจะไม่รู้เรื่องการทำฐานข้อมูล พยายามศึกษาจากเว็บอยู่ค่ะ)
แหม่มพอเข้าใจแบบที่คุณบอกลองทำแล้ว แต่ยังไม่ใช้แบบที่ต้องการอะค่ะ คือต้องการแบบว่าเมื่อพิมพ์ชื่อ กดปุ่มค้นหา ก็จะปรากฏข้อมูลผู้ใช้คนนั้น เช่น ขึ้นชื่อ รหัส สำนัก ชั้น หมายเลขภายในอะค่ะ
พอจะเข้าใจที่แหม่มอธิบายไหมค่ะ ^^"
(พอดีเรียน Access มาแค่พื้นฐานเลยแทบจะไม่รู้เรื่องการทำฐานข้อมูล พยายามศึกษาจากเว็บอยู่ค่ะ)
6 @R14229
ผมยกตัวอย่างเป็นหลักการให้ปรับดูแล้วกันนะครับ
การหาข้อมูลหลักๆ ง่ายสุดคือการใช้ Docmd มี 2 แบบที่ใช้กัน คือ ค้นหาโดย Select ไปยังเรคคอร์ดนั้นที่ละเรคคอร์ด หรือแบบกรองข้อมูลให้เห็นเฉพาะที่ต้องการเท่านั้น
หากผมต้องการค้นหาโดยเขียนลง Textbox เปล่าๆ แล้วนำข้อความนั้นไปหาในอีกฟอร์มนึงซึ่งเป็นฐานข้อมูลก็จะใช้คำสั่งประมาณนี้ครับ
If CurrentProject.AllForms("user").IsLoaded = True Then 'ตรวจสอบฟอร์มว่าเปิดอยู่หรือเปล่า
Forms![User].SetFocus 'หากเปิด เลือกที่ฟอร์ม user
DoCmd.FindRecord [Forms]![formseach]![cbID], , True, , True 'ค้นหาข้อมูลตามข้อมูลใน Textbox cbID จากฟอร์ม formseach
Else
DoCmd.OpenForm "user" ' หากฟอร์มยังไม่เปิด ก็ให้เปิด
DoCmd.FindRecord [Forms]![formseach]![cbID], , True, , True 'ค้นหา
End If
ทั้งนี้แล้วแต่ว่าคุณจะใส่มันใน Event ไหนข้อ Object ก็ต้องคิดดูแล้วปรับค่าการอ้างอิงให้ถูก เช่นจากไฟล์ตัวอย่างของคุณใส่โค๊ดลงใน Control ชื่อ cbID ที่ Event > After Update
Private Sub cbID_AfterUpdate()
If CurrentProject.AllForms("user").IsLoaded = True Then
Forms![User].SetFocus
DoCmd.FindRecord [Forms]![formseach]![cbID], , True, , True
Else
DoCmd.OpenForm "user"
DoCmd.FindRecord [Forms]![formseach]![cbID], , True, , True
End If
End Sub
หรือใน Object Control ชื่อ cbmane ก็ปรับประมาณนี้
Private Sub cbmane_AfterUpdate()
If CurrentProject.AllForms("user").IsLoaded = True Then
Forms![User].SetFocus
DoCmd.FindRecord [Forms]![formseach]![cbmane], , True, , True
Else
DoCmd.OpenForm "user"
DoCmd.FindRecord [Forms]![formseach]![cbmane], , True, , True
End If
End Sub
ปล. แต่หากเคยใช้ Macro ก็ทำใน Macro ก็เหมือนกัน
หรือหากเป็นต้องการใช้การกรองข้อมูล ซึ่งผมดูแล้วคงไม่ใช่ในลักษณะการหาข้อมูลที่ไม่ซ้ำกันแบบนี้ แต่เขียนเป็นตัวอย่างให้ดูเท่านั้น
DoCmd.ApplyFilter , " รหัสผู้ใช้ like '*'& [Forms]![formseach]![cbmane] &'*'"
อะไรประมาณนี้ เป็นหลักการนะครับ ต้องทำความเข้าใจและปรับใช้
การหาข้อมูลหลักๆ ง่ายสุดคือการใช้ Docmd มี 2 แบบที่ใช้กัน คือ ค้นหาโดย Select ไปยังเรคคอร์ดนั้นที่ละเรคคอร์ด หรือแบบกรองข้อมูลให้เห็นเฉพาะที่ต้องการเท่านั้น
หากผมต้องการค้นหาโดยเขียนลง Textbox เปล่าๆ แล้วนำข้อความนั้นไปหาในอีกฟอร์มนึงซึ่งเป็นฐานข้อมูลก็จะใช้คำสั่งประมาณนี้ครับ
If CurrentProject.AllForms("user").IsLoaded = True Then 'ตรวจสอบฟอร์มว่าเปิดอยู่หรือเปล่า
Forms![User].SetFocus 'หากเปิด เลือกที่ฟอร์ม user
DoCmd.FindRecord [Forms]![formseach]![cbID], , True, , True 'ค้นหาข้อมูลตามข้อมูลใน Textbox cbID จากฟอร์ม formseach
Else
DoCmd.OpenForm "user" ' หากฟอร์มยังไม่เปิด ก็ให้เปิด
DoCmd.FindRecord [Forms]![formseach]![cbID], , True, , True 'ค้นหา
End If
ทั้งนี้แล้วแต่ว่าคุณจะใส่มันใน Event ไหนข้อ Object ก็ต้องคิดดูแล้วปรับค่าการอ้างอิงให้ถูก เช่นจากไฟล์ตัวอย่างของคุณใส่โค๊ดลงใน Control ชื่อ cbID ที่ Event > After Update
Private Sub cbID_AfterUpdate()
If CurrentProject.AllForms("user").IsLoaded = True Then
Forms![User].SetFocus
DoCmd.FindRecord [Forms]![formseach]![cbID], , True, , True
Else
DoCmd.OpenForm "user"
DoCmd.FindRecord [Forms]![formseach]![cbID], , True, , True
End If
End Sub
หรือใน Object Control ชื่อ cbmane ก็ปรับประมาณนี้
Private Sub cbmane_AfterUpdate()
If CurrentProject.AllForms("user").IsLoaded = True Then
Forms![User].SetFocus
DoCmd.FindRecord [Forms]![formseach]![cbmane], , True, , True
Else
DoCmd.OpenForm "user"
DoCmd.FindRecord [Forms]![formseach]![cbmane], , True, , True
End If
End Sub
ปล. แต่หากเคยใช้ Macro ก็ทำใน Macro ก็เหมือนกัน
หรือหากเป็นต้องการใช้การกรองข้อมูล ซึ่งผมดูแล้วคงไม่ใช่ในลักษณะการหาข้อมูลที่ไม่ซ้ำกันแบบนี้ แต่เขียนเป็นตัวอย่างให้ดูเท่านั้น
DoCmd.ApplyFilter , " รหัสผู้ใช้ like '*'& [Forms]![formseach]![cbmane] &'*'"
อะไรประมาณนี้ เป็นหลักการนะครับ ต้องทำความเข้าใจและปรับใช้
7 @R14240
ขอบคุณมากๆค่ะ ดิฉันจะลองศึกษาและเอาปรับใช้ดู
8 @R14241
ผมตกไปอย่างครับ คือการใช้ DoCmd.FindRecord ต้องใช้คำสั่ง SetFocus ไปที่ฟิลด์ที่เราจะค้นหาด้วย ต้องแก้เป็น
DoCmd.OpenForm "user"
Me.usermane.SetFocus
DoCmd.FindRecord [Forms]![formseach]![cbmane], , True, , True
โปรแกรมจะได้รู้ว่าเราต้องการหาที่ฟิลด์ไหน
และถ้าคุณอยากใช้ค่าตาม Column ก็ต้องใส่ประมาณนี้
Forms![User].SetFocus
Forms![User].usermane.SetFocus
DoCmd.FindRecord [Forms]![formseach]![cbmane].Column(1), , True, , True
ซึ่ง พารามิเตอร์ของ DoCmd.FindRecord มันยังมีตัวเลือกแบบหาคำตรง คำที่มีอยู่ในประโยค หาที่เรคคอร์ดแรก เรคคอร์ดถัดไป เรคคอร์ดก่อนหน้า แล้วแต่จะเลือก ให้ไปดูใน help ครับ เช่น
Forms![User].usermane.SetFocus
DoCmd.FindRecord [Forms]![formseach]![cbmane].Column(1), acAnywhere, False, acUp, False, acCurrent, False
ลองศึกษาดูนะครับ หลักๆก็ประมาณนี้
DoCmd.OpenForm "user"
Me.usermane.SetFocus
DoCmd.FindRecord [Forms]![formseach]![cbmane], , True, , True
โปรแกรมจะได้รู้ว่าเราต้องการหาที่ฟิลด์ไหน
และถ้าคุณอยากใช้ค่าตาม Column ก็ต้องใส่ประมาณนี้
Forms![User].SetFocus
Forms![User].usermane.SetFocus
DoCmd.FindRecord [Forms]![formseach]![cbmane].Column(1), , True, , True
ซึ่ง พารามิเตอร์ของ DoCmd.FindRecord มันยังมีตัวเลือกแบบหาคำตรง คำที่มีอยู่ในประโยค หาที่เรคคอร์ดแรก เรคคอร์ดถัดไป เรคคอร์ดก่อนหน้า แล้วแต่จะเลือก ให้ไปดูใน help ครับ เช่น
Forms![User].usermane.SetFocus
DoCmd.FindRecord [Forms]![formseach]![cbmane].Column(1), acAnywhere, False, acUp, False, acCurrent, False
ลองศึกษาดูนะครับ หลักๆก็ประมาณนี้
9 @R14327
ดิฉัน ทำแบบที่ต้องการได้แล้วค่ะ แต่ติดอยู่ที่ว่าฟอร์มค้นหาแบบที่ดิฉันทำมันสามารถ
ค้นหาด้วยรหัสอย่างเดียว เช่นฟอร์มค้นหาการใช้งาน
ดิฉันสร้าง text box 8 กล่อง โดยตั้งชื่อดังนี้
รหัสผู้ใช้ ตั้งชื่อ textID (ไม่เขียนคำสัง)
รหัสผู้ใช้ =DLookUp("[Username]","[tableuser]","[UserID]=[Text20]")
วัน/เดือน/ปี =DLookUp("[Date]","[tableusability]","[UserID]=[Text20]")
รหัสหมึก =DLookUp("[InkID]","[tableusability]","[UserID]=[Text20]") เป็นต้น
วิธีนี้ผู้ใช้ระบบสามารถค้นหาโดยพิมพ์ในช่องรหัสผู้ใช้ ช่องอื่นไม่สามารถคีย์ข้อมูลอื่นได้
เมื่อกด Enter ข้อมูลก็จะขึ้นมา
แต่สิ่งที่ต้องการคืออย่าให้ผู้ใช้สามารถพิมพ์ช่องไหนก็ได้อะค่ะ ต้องเขียนคำสั่งยังไงคระ
ไฟล์ที่ทำ http://zidofile.com/8f1Vlm
ช่วยดูให้หน่อยนะค่ะ
ค้นหาด้วยรหัสอย่างเดียว เช่นฟอร์มค้นหาการใช้งาน
ดิฉันสร้าง text box 8 กล่อง โดยตั้งชื่อดังนี้
รหัสผู้ใช้ ตั้งชื่อ textID (ไม่เขียนคำสัง)
รหัสผู้ใช้ =DLookUp("[Username]","[tableuser]","[UserID]=[Text20]")
วัน/เดือน/ปี =DLookUp("[Date]","[tableusability]","[UserID]=[Text20]")
รหัสหมึก =DLookUp("[InkID]","[tableusability]","[UserID]=[Text20]") เป็นต้น
วิธีนี้ผู้ใช้ระบบสามารถค้นหาโดยพิมพ์ในช่องรหัสผู้ใช้ ช่องอื่นไม่สามารถคีย์ข้อมูลอื่นได้
เมื่อกด Enter ข้อมูลก็จะขึ้นมา
แต่สิ่งที่ต้องการคืออย่าให้ผู้ใช้สามารถพิมพ์ช่องไหนก็ได้อะค่ะ ต้องเขียนคำสั่งยังไงคระ
ไฟล์ที่ทำ http://zidofile.com/8f1Vlm
ช่วยดูให้หน่อยนะค่ะ
10 @R14332
ส่งงานมาที่ aj.tong@hotmail.com
จะทำให้โดยไม่ต้องเขียนcode
ครูต้อง
จะทำให้โดยไม่ต้องเขียนcode
ครูต้อง
11 @R14344
-หนูไม่ทราบจะอธิบายวิธีอย่างไร เลยลองทำตัวอย่างให้ลองดูว่าใช้ได้ตามที่ต้องการหรือไม่ ขอเสนอเปลี่ยนแนววิธีการค้นหาใหม่ดูนะคะ
-จากไฟล์เดิมของคุณ mam โดยสร้างคิวรี่ขึ้นมาใหม่ชื่อ Qry_Seach
-นำคิวรี่ไปสร้างฟร์อมใหม่ชื่อ Frm_Seach และ Sub_Seach
ดาวน์โหลดไฟล์ที่นี่ค่ะ
not-found
ลองนำไปดัดแปลงใช้ดูนะคะ เท็คนิคทั้งหมดล้วนค้นหาได้มาจากบอร์ดนี้ทั้งสิ้นค่ะ
-จากไฟล์เดิมของคุณ mam โดยสร้างคิวรี่ขึ้นมาใหม่ชื่อ Qry_Seach
-นำคิวรี่ไปสร้างฟร์อมใหม่ชื่อ Frm_Seach และ Sub_Seach
ดาวน์โหลดไฟล์ที่นี่ค่ะ
not-found
ลองนำไปดัดแปลงใช้ดูนะคะ เท็คนิคทั้งหมดล้วนค้นหาได้มาจากบอร์ดนี้ทั้งสิ้นค่ะ
12 @R14345
ส่งให้ทางเมลแล้วค่ะ รบกวนด้วยนะค่ะ
"ขอบคุณมากค่ะ"
"ขอบคุณมากค่ะ"
13 @R14346
ขอบคุณ คุณมาลีมากนะค่ะที่เสนอวิธีใหม่ให้ตอนนี้ลองๆทำแบบที่คุณว่าอยู่ค่ะ ^^
14 @R14350
Private Sub Text0_AfterUpdate()
Me.Requery
SendKeys "{f9}", True
If DCount("[ÃËÑʼÙéãªé]", "Qry_Seach") = 0 Then
MsgBox ("äÁ辺¢éÍÁÙŵÒÁ·ÕèÃкØ... ÅÍãªé¢éͤÇÒÁÍ×è¹ "), vbQuestion, "á¨éãËé·ÃÒº"
End If
End
...............................................................
คุณมาลีค่ะ ดิฉันจะลองปรับเปลี่ยนดู แต่ไม่รู้ว่าตรงนี้มันคืออะไรอะค่ะ
ÃËÑʼÙéãªé =มันคืออะไรค่ะ
äÁ辺¢éÍÁÙŵÒÁ·ÕèÃкØ... ÅÍãªé¢éͤÇÒÁÍ×è¹ =
á¨éãËé·ÃÒº =
Private Sub Text0_AfterUpdate()
Me.Requery
SendKeys "{f9}", True
If DCount("[ÃËÑʼÙéãªé]", "Qry_Seach") = 0 Then
MsgBox ("äÁ辺¢éÍÁÙŵÒÁ·ÕèÃкØ... ÅÍãªé¢éͤÇÒÁÍ×è¹ "), vbQuestion, "á¨éãËé·ÃÒº"
End If
End
...............................................................
คุณมาลีค่ะ ดิฉันจะลองปรับเปลี่ยนดู แต่ไม่รู้ว่าตรงนี้มันคืออะไรอะค่ะ
ÃËÑʼÙéãªé =มันคืออะไรค่ะ
äÁ辺¢éÍÁÙŵÒÁ·ÕèÃкØ... ÅÍãªé¢éͤÇÒÁÍ×è¹ =
á¨éãËé·ÃÒº =
15 @R14353
ปัญหาการแสดงภาษาไทยไม่ได้ค่ะ
ข้อความมันจะเป็นแบบนี้...
= = = = = = = = = =
If DCount("[รหัสผู้ใช้]", "Qry_Seach") = 0 Then
MsgBox ("ไม่พบข้อมูลตามที่ระบุ... ลองใช้ข้อความอื่น "), vbQuestion, "แจ้งให้ทราบ"
End If
End Sub
= = = = = = = = = =
เป็นการอ้างอิงฟิลด์ที่ชื่อ [รหัสผู้ใช้] ภายในคิวรี่ Qry_Seach
ถัดลงมาก็จะเป็นการแสดงข้อความใน MsgBox เหมือนทั่วๆไปค่ะ
ข้อความมันจะเป็นแบบนี้...
= = = = = = = = = =
If DCount("[รหัสผู้ใช้]", "Qry_Seach") = 0 Then
MsgBox ("ไม่พบข้อมูลตามที่ระบุ... ลองใช้ข้อความอื่น "), vbQuestion, "แจ้งให้ทราบ"
End If
End Sub
= = = = = = = = = =
เป็นการอ้างอิงฟิลด์ที่ชื่อ [รหัสผู้ใช้] ภายในคิวรี่ Qry_Seach
ถัดลงมาก็จะเป็นการแสดงข้อความใน MsgBox เหมือนทั่วๆไปค่ะ
16 @R14354
อ๋อเข้าใจแล้วค่ะ คุณมาลีมาโปรดจริงๆ อิอิ ^^" ขอบคุณอีกครั้งนะค่ะ
17 @R14392
คุณมาลีค่ะ ขอรบกวนถามอีกหน่อยค่ะ คือดิฉันทำฟอร์มค้นหาเสร็จเรียบร้อยแล้ว
เมื่อเพิ่มข้อมูล ข้อมูลก้อจะUpdate ในส่วนของตาราง และรายงานให้ แต่ทำไม
มันไม่ Update ให้ในฟอร์มค้นหาอะค่ะ
เมื่อเพิ่มข้อมูล ข้อมูลก้อจะUpdate ในส่วนของตาราง และรายงานให้ แต่ทำไม
มันไม่ Update ให้ในฟอร์มค้นหาอะค่ะ
18 @R14395
ทำได้แล้วเย้ๆๆ
19 @R14476
ยินดีด้วยค่ะ
Time: 0.2592s
1.ตรงชื่อผู้ใช้ เปลี่ยนเป็น Combo box โดยให้ souce ไปดึงข้อมูลจากตาราง
ที่เก็บชื่อผู้ใช้ โดยดึงฟิลด์ชือเป็นฟิลด์แรก แล้วเรียงด้วยฟิลด์ที่ต้องการไปเรื่อยๆ
2.ให้ใส่ Event Afterupdate (สมมุติให้ Combo ชื่อ CBname)
me.ชื่อคอนโทล=CBname.column(1)
me.ชื่อคอนโทล=CBname.column(2) จนครบตามที่ต้องการ