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
:D 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 ทำงานได้ครับ

ลองตามนี้ครับ
  1. กดปุ่ม KeyEventOn
  2. ในคอลัมน์ 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 ลงมา และให้โค๊ดทำงานทำงานเพียงเซลล์เดียวไม่ต้องทำทั้งคอลัมภ์ ต้องปรับโค๊ดอย่างไรดีครับ :D

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
ขอบคุณครับ...แสดงว่าถ้าต้องภาษาไทยก็ต้องเขียนฟังชั้นขึ้นมาเองใช้ไหมครับ พอมีแนวทางบ้างไหมครับ :D

Re: Drop-Down List

Posted: Thu Apr 21, 2011 7:02 am
by snasui
:D ที่เขียนเป็น 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 โค๊ดไม่ยอมทำงานครับ :D

Re: Drop-Down List

Posted: Thu Apr 21, 2011 8:52 am
by snasui
เอา Code VBA ทั้งหลายที่มีออกไปก่อนครับ สูตรที่เขียนนั้นไม่ได้ให้ทำงานร่วมกับ VBA ครับ (ในไฟล์ที่ผมแนบมานั้นไม่มี Event ให้เช็คเซลล์เพื่อ Run Procedure) :D

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
:D ลองตามนี้ครับ

ที่ 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" เช่น เมื่อคีย์ "บ" เสร็จก็ให้แสดงเฉพาะชื่อ "บรรพต" ลงมาเลย แบบนี้พอได้ไหมครับ :D

Re: Drop-Down List

Posted: Sat Apr 23, 2011 1:24 am
by snasui
:lol: ใน WorkSheet, ThisWorkbook ยังไม่พบ Event ที่ทำงานเช่นที่ถามครับ จาก Event นี้

Code: Select all

Private Sub Worksheet_Change(ByVal Target As Range)
....
End Sub
จะต้องเปลี่ยนแปลงค่าในเซลล์ก่อน Code จึงจะทำงาน แค่คีย์ลงไปยังไม่กด Enter หรือยังไม่คลิกไปที่อื่น โปรแกรมจะไม่รับรู้ว่าเป็นการเปลี่ยนแปลงเซลล์ ถือว่าการเปลี่ยนแปลงเซลล์ยังไม่เกิดขึ้นจึงยังไม่ทำงาน :lol:

Re: Drop-Down List

Posted: Sat Apr 23, 2011 7:25 am
by joo
ตอนแรกเข้าใจว่าใน Excel จะมี Event เกี่ยวกับการได้รับค่าจากแป้นพิมพ์ โค๊ดจึงจะทำงานครับ :lol:

Re: Drop-Down List

Posted: Sat Apr 23, 2011 8:06 am
by snasui
:shock:
joo wrote:ตอนแรกเข้าใจว่าใน Excel จะมี Event เกี่ยวกับการได้รับค่าจากแป้นพิมพ์ โค๊ดจึงจะทำงานครับ :lol:
ตอนที่สอง :lol: คิดว่าคุณ 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:ขอบคุณครับ...แสดงว่าถ้าต้องภาษาไทยก็ต้องเขียนฟังชั้นขึ้นมาเองใช้ไหมครับ พอมีแนวทางบ้างไหมครับ :D
snasui wrote::D ที่เขียนเป็น 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
เข้าใจทั้งสองตอนแล้วครับ :D สงสัยว่าผมคงจะสับสนเองแน่ๆเลยครับ :?: :lol:
มีข้อสงสัยเพิ่มครับเวลาเราเลือกรายการของข้อมูลที่แสดงใน List แล้วทำไมข้อมูลที่เราเลือกยังคงแสดง DropDown List ให้เห็นอยู่ และกด enter ก็ไม่ไปไหนต้องใช้เม้าน์คลิกเลือกที่เซลล์อีกครั้งถึงจะหายครับ ต้องปรับโค๊ดเพิ่มอย่างไรครับ

Re: Drop-Down List

Posted: Sat Apr 23, 2011 11:38 am
by snasui
:D เนื่องจากเราใช้ 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