Page 1 of 2
Drop-Down List
Posted: Sun Apr 17, 2011 6:58 am
by joo
การทำ Drop-Down List แบบคีย์อักษรตัวแรกก็จะ List รายชื่อที่เกี่ยวข้องกับอักษรตัวแรกมาให้เลือก จากตัวอย่างนี้เขาทำอย่างไรครับ
http://www.bettersolutions.com/excel/EG ... 611612.htm
Re: Drop-Down List
Posted: Sun Apr 17, 2011 8:55 am
by snasui
Code นั้นมีผู้ทดลองแล้วยังเกิดค่าผิดพลาดอยู่บ้างครับ ดูที่
http://www.ozgrid.com/forum/showthread. ... 223&page=1
ลองใช้ Code ของ Colo ที่นี่แทนครับ
http://puremis.net/excel/code/041.shtml
Re: Drop-Down List
Posted: Mon Apr 18, 2011 9:06 pm
by joo
ขอบคุณครับอาจารย์...ผมทดลองแล้วพบว่าค่าไม่ยอม List รายชื่อตามตัวอักษรที่พิมพ์เลยครับช่วยดูให้หน่อยครับว่าผิดพลาดตรงไหน
Re: Drop-Down List
Posted: Mon Apr 18, 2011 11:17 pm
by snasui
เท่าที่ทดสอบดูพบว่า Code ทำงานได้ครับ
ลองตามนี้ครับ
- กดปุ่ม KeyEventOn
- ในคอลัมน์ A ที่เซลล์ใด ๆ คีย์ a ทดสอบเลือกเซลล์อื่นและคีย์ค่าใหม่ หากคีย์ค่าใหม่ในเซลล์เดิมให้กดแป้น Delete ก่อนแล้วคีย์ค่าใด ๆ ตามต้องการ สังเกตดูผล
Re: Drop-Down List
Posted: Tue Apr 19, 2011 6:33 am
by joo
ที่ผมทดลอง Code โค๊ดมันทำงานแบบนี้ครับ เช่น เมื่อพิมพ์ a ที่เซลล์ A1 ก็จะมีข้อมูลที่เกี่ยวข้องกับอักษร "A" มาให้เลือก ที่ต้องการคือ เมื่อพิมพ์อักษร "A" ก็ให้แสดงรายชื่อที่ขึ้นต้นด้วยอักษร "A" ทั้งหมดแบบ Drop Down List ลงมา และให้โค๊ดทำงานทำงานเพียงเซลล์เดียวไม่ต้องทำทั้งคอลัมภ์ ต้องปรับโค๊ดอย่างไรดีครับ
Re: Drop-Down List
Posted: Tue Apr 19, 2011 7:01 am
by snasui
การให้ Code ทำงานในเซลล์เดียวเช่นที่ A1 ให้เปลี่ยนจาก
Selection เป็น
[A1] หรือ Range("A1") จะได้ Code ตามด้านล่างครับ
Code: Select all
Sub MyValidation(ByVal KeyCode As Long)
Dim strText As String, strList As String
If Not TypeOf [a1] Is Range Then Exit Sub
strText = [a1].Value & Chr(KeyCode)
strList = MakeArr(strText)
[a1].Value = strText
If strList = "False" Then
[a1].Validation.Delete
Else
With [a1].Validation
.Delete
.Add 3, 1, 1, Formula1:=strList
.IgnoreBlank = True
.InCellDropdown = True
.ShowInput = True
End With
End If
End Sub
Re: Drop-Down List
Posted: Wed Apr 20, 2011 12:59 pm
by joo
โค๊ดนี้รองรับภาษาไทยไหมครับผมลองเปลี่ยนให้แสดงเป็นอักษรไทยโดยทำการเปลี่ยนโค๊ดแบบนี้
Sub KeyEventOn()
For i = 161 To 206
Application.OnKey "{" & i & "}", "'MyValidation """ & i & """'"
Next
End Sub
พบว่าโค๊ดไม่ยอมทำงานครับและถ้าต้องการให้โค๊ดทำงานทันทีเมื่อเซลล์ “A1”ได้รับโฟกัสและหยุดทำงานเมื่อเลื่อนไปยังเซลล์อื่นต้องปรับแก้ไขโค๊ดอย่างไรดีครับ
Re: Drop-Down List
Posted: Wed Apr 20, 2011 4:41 pm
by snasui
OnKey จะรองรับภาษาอังกฤษ สำหรับภาษาอื่นไม่น่าจะรองรับครับ
กรณีต้องการให้ KeyEventOn, KeyEventOff ทำงานเมื่อมีการเลือกหรือไม่ได้เลือก A1 ลองเพิ่ม Code ที่ชีท 1 ตามด้านล่างครับ
Code: Select all
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "$A$1" Then
KeyEventOn
Else
KeyEventOff
End If
End Sub
Re: Drop-Down List
Posted: Thu Apr 21, 2011 6:31 am
by joo
ขอบคุณครับ...แสดงว่าถ้าต้องภาษาไทยก็ต้องเขียนฟังชั้นขึ้นมาเองใช้ไหมครับ พอมีแนวทางบ้างไหมครับ
Re: Drop-Down List
Posted: Thu Apr 21, 2011 7:02 am
by snasui
ที่เขียนเป็น VBA ก็ถือว่าเป็นการเขียนฟังก์ชั่นขึ้นมาใช้เองครับ แต่เท่าที่ทดสอบไม่สามารถใช้กับภาษาไทยได้ จริง ๆ การทำแบบนี้สามารถทำได้หลายแบบ แบบหนึ่งก็ตามไฟล์แนบครับ ซึ่งเป็นการใช้สูตรเข้ามาช่วยทำ Validation
ผมเพิ่มตัวช่วยเข้าไปที่คอลัมน์ D:E เพื่อหาว่าค่าที่เราคีย์นั้นมีในเซลล์ใด ๆ หรือไม่ หากมีก็นำมาแสดงรวมกันแล้วนำค่าที่ได้นี้ไปทำ Validation
การทดสอบ ให้คีย์ค่าใด ๆ ลงใน A1 > Ctrl+Enter (เพื่อไม่ให้ Cursor ย้ายไปด้านล่าง) > คลิก Drowdown ที่ A1 เพื่อเลือกค่าที่ต้องการ
Re: Drop-Down List
Posted: Thu Apr 21, 2011 8:43 am
by joo
ที่ C1:C20 ผมทดลองเปลี่ยนเป็นชื่อคนดู พบว่าที่ A1 โค๊ดไม่ยอมทำงานครับ
Re: Drop-Down List
Posted: Thu Apr 21, 2011 8:52 am
by snasui
เอา Code VBA ทั้งหลายที่มีออกไปก่อนครับ สูตรที่เขียนนั้นไม่ได้ให้ทำงานร่วมกับ VBA ครับ (ในไฟล์ที่ผมแนบมานั้นไม่มี Event ให้เช็คเซลล์เพื่อ Run Procedure)
Re: Drop-Down List
Posted: Fri Apr 22, 2011 6:43 pm
by joo
ทดลองแล้วใช้ได้ครับ...แล้วถ้าต้องการให้เมื่อคีย์อักษรตัวแรกที่เซลล์ "A1" ก็ให้ข้อมูลที่เกี่ยวข้องแสดงแบบ DropDown List ลงมาเองอัติโนมัติไม่ต้องไปคลิกที่ปุ่มลูกศรก่อน ต้องปรับแก้โค๊ดอย่างไรดีครับ
Code: Select all
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.EnableEvents = False
If Target.Address = "$A$1" Then
Worksheets(Target.Value).Select
Range("A1").DropDown
End If
Application.EnableEvents = True
End Sub
Re: Drop-Down List
Posted: Fri Apr 22, 2011 9:04 pm
by snasui
ลองตามนี้ครับ
ที่ Sheet1 ปรับ Code เป็น
Code: Select all
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Target.Address = "$A$1" Then
MyValidation
End If
Application.EnableEvents = True
End Sub
ที่ Module1 ปรับ Code เป็น
Code: Select all
Sub MyValidation()
On Error Resume Next
With [A1].Validation
.Modify Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=ValidateVals"
.IgnoreBlank = True
.InCellDropdown = True
.ShowInput = True
.ShowError = False
End With
[A1].Select
Application.SendKeys "%{DOWN}"
End Sub
ดูไฟล์แนบประกอบครับ
Re: Drop-Down List
Posted: Fri Apr 22, 2011 11:39 pm
by joo
ขอบคุณครับ...
ทดลองแล้วพบว่าเมื่อพิมพ์อักษรตัวแรกเสร็จต้องกด Enter ก่อนทุกครั้งข้อมูลจึงแสดงแบบ DropDown List ลงมาให้เห็นแล้วก็จะมีรายชื่ออื่นๆที่มีอักษรที่เหมือนกับที่พิมพ์ไว้มาแสดงด้วย เช่น เมื่อพิมพ์ "ด" แล้ว enter ก็จะแสดงรายชื่อ ไกรเดช,ครรชิด,ดนัย,เดชา
แล้วถ้าคีย์อักษรตัวแรกเสร็จก็ให้แสดง DropDown List ลงมาเลยพร้อมแสดงเฉพาะรายชื่อที่มีอักษรที่ขึ้นต้นเหมือนกับอักษรที่คีย์ในเซลล์ "A1" เช่น เมื่อคีย์ "บ" เสร็จก็ให้แสดงเฉพาะชื่อ "บรรพต" ลงมาเลย แบบนี้พอได้ไหมครับ
Re: Drop-Down List
Posted: Sat Apr 23, 2011 1:24 am
by snasui
ใน WorkSheet, ThisWorkbook ยังไม่พบ Event ที่ทำงานเช่นที่ถามครับ จาก Event นี้
Code: Select all
Private Sub Worksheet_Change(ByVal Target As Range)
....
End Sub
จะต้องเปลี่ยนแปลงค่าในเซลล์ก่อน Code จึงจะทำงาน แค่คีย์ลงไปยังไม่กด Enter หรือยังไม่คลิกไปที่อื่น โปรแกรมจะไม่รับรู้ว่าเป็นการเปลี่ยนแปลงเซลล์ ถือว่าการเปลี่ยนแปลงเซลล์ยังไม่เกิดขึ้นจึงยังไม่ทำงาน
Re: Drop-Down List
Posted: Sat Apr 23, 2011 7:25 am
by joo
ตอนแรกเข้าใจว่าใน Excel จะมี Event เกี่ยวกับการได้รับค่าจากแป้นพิมพ์ โค๊ดจึงจะทำงานครับ
Re: Drop-Down List
Posted: Sat Apr 23, 2011 8:06 am
by snasui
joo wrote:ตอนแรกเข้าใจว่าใน Excel จะมี Event เกี่ยวกับการได้รับค่าจากแป้นพิมพ์ โค๊ดจึงจะทำงานครับ
ตอนที่สอง
คิดว่าคุณ joo เข้าใจตามนี้ไปแล้วครับ
snasui wrote:OnKey จะรองรับภาษาอังกฤษ สำหรับภาษาอื่นไม่น่าจะรองรับครับ
กรณีต้องการให้ KeyEventOn, KeyEventOff ทำงานเมื่อมีการเลือกหรือไม่ได้เลือก A1 ลองเพิ่ม Code ที่ชีท 1 ตามด้านล่างครับ
Code: Select all
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "$A$1" Then
KeyEventOn
Else
KeyEventOff
End If
End Sub
joo wrote:ขอบคุณครับ...แสดงว่าถ้าต้องภาษาไทยก็ต้องเขียนฟังชั้นขึ้นมาเองใช้ไหมครับ พอมีแนวทางบ้างไหมครับ
snasui wrote: ที่เขียนเป็น VBA ก็ถือว่าเป็นการเขียนฟังก์ชั่นขึ้นมาใช้เองครับ แต่เท่าที่ทดสอบไม่สามารถใช้กับภาษาไทยได้ จริง ๆ การทำแบบนี้สามารถทำได้หลายแบบ แบบหนึ่งก็ตามไฟล์แนบครับ ซึ่งเป็นการใช้สูตรเข้ามาช่วยทำ Validation
ผมเพิ่มตัวช่วยเข้าไปที่คอลัมน์ D:E เพื่อหาว่าค่าที่เราคีย์นั้นมีในเซลล์ใด ๆ หรือไม่ หากมีก็นำมาแสดงรวมกันแล้วนำค่าที่ได้นี้ไปทำ Validation
การทดสอบ ให้คีย์ค่าใด ๆ ลงใน A1 > Ctrl+Enter (เพื่อไม่ให้ Cursor ย้ายไปด้านล่าง) > คลิก Drowdown ที่ A1 เพื่อเลือกค่าที่ต้องการ
Re: Drop-Down List
Posted: Sat Apr 23, 2011 10:14 am
by joo
เข้าใจทั้งสองตอนแล้วครับ
สงสัยว่าผมคงจะสับสนเองแน่ๆเลยครับ
มีข้อสงสัยเพิ่มครับเวลาเราเลือกรายการของข้อมูลที่แสดงใน List แล้วทำไมข้อมูลที่เราเลือกยังคงแสดง DropDown List ให้เห็นอยู่ และกด enter ก็ไม่ไปไหนต้องใช้เม้าน์คลิกเลือกที่เซลล์อีกครั้งถึงจะหายครับ ต้องปรับโค๊ดเพิ่มอย่างไรครับ
Re: Drop-Down List
Posted: Sat Apr 23, 2011 11:38 am
by snasui
เนื่องจากเราใช้ Change Event ทุกเหตุการณ์ที่เกิดการเปลี่ยนแปลงในเซลล์ จะทำให้ Code ทำงานเสมอ
ลองปรับที่ Event ครับ เช่น หากนับแล้วมีอักขระน้อยว่า 3 อักขระก็ยังคงแสดงอยู่เช่นเดิม ถ้าอักขระมากกว่าหรือเท่ากับ 3 ขึ้นไปก็จะไม่แสดงขึ้นมาอีก ประเด็นที่จะเกิดสำหรับการปรับเช่นนี้คือคีย์ 3 อักขระเป็นต้นไป Code จะไม่ทำงานต้องคลิก Drop Down เองครับ
Code: Select all
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Target.Address = "$A$1" And Len(Target) < 3 Then
MyValidation
End If
Application.EnableEvents = True
End Sub