Page 1 of 3

คีย์ตัวเลข 2 หลัก โดยไม่ต้องกด Enter ใน VBA

Posted: Thu Dec 01, 2011 11:38 pm
by wisit
อาจารย์ครับ รบกวนอาจารย์ ช่วยแนะนำวิธีในการคีย์ตัวเลข 0-9 2 หลัก โดยไม่ต้องกด Enter มันจะเลื่อนลงมาข้างล่างโดยอัตโนมัติ สมมุติ ผมคีย์ตัวเลข 12 ใน A1 มันจะเด้งลงมา A2 ให้เราคีย์ค่าตัวเลขต่อไป เมื่อคีย์ตัวเลข 47 ใน A2 มันจะเด้งลงมา A3 เป็นอย่างนี้เรื่อยไปครับอาจารย์
ผมไ้ด้ทดลองเขียนเองบ้าง และให้เพื่อนช่วยเขียน VBA ให้ (เพราะผมเพิ่งเริ่มหัดเขียนครับ) ผมได้ทดลองกับเพื่อนแต่ทำยังไงก็ไม่สามารถทำให้มันเด้งลงข้างล่างได้ ต้องกด Enter รบกวนอาจารย์ช่วยชี้แนะด้วยครับ

Code: Select all

Private Sub Worksheet_Change(ByVal Target As Range)
'MsgBox Len(Target.Text)
'MsgBox Asc(Target.Text)
If Len(Target.Text) > 0 Then
    If Asc(Target.Text) < 48 Then
        MsgBox "Character invalid"
        Cells(Target.Row, 1).Select
        Cells(Target.Row, 1).Clear
    ElseIf Asc(Target.Text) > 57 Then
        MsgBox "Character invalid"
        Cells(Target.Row, 1).Select
        Cells(Target.Row, 1).Clear
    ElseIf Len(Target.Text) = 1 Then
        MsgBox "Len Lesthen"
        Cells(Target.Row, 1).Select
        Cells(Target.Row, 1).Clear
    ElseIf Len(Target.Text) > 2 Then
        MsgBox "Len More"
        Cells(Target.Row, 1).Select
        Cells(Target.Row, 1).Clear
    ElseIf Target.Column > 1 Then
        Cells(Target.Row + 1, 1).Select
    End If
End If

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    'Range("A1").Select
    'ActiveCell.FormulaR1C1 = "MyJan"
End Sub

Re: คีย์ตัวเลข 2 หลัก โดยไม่ต้องกด Enter ใน VBA

Posted: Fri Dec 02, 2011 5:49 pm
by snasui
:D ลองส่งไฟล์ตัวอย่างมาด้วยครับ

Re: คีย์ตัวเลข 2 หลัก โดยไม่ต้องกด Enter ใน VBA

Posted: Sat Dec 03, 2011 5:53 pm
by wisit
อาจารย์ครับ ไฟล์ที่ผมแนบมาคือ คอลัมน์ A จะเป็นรหัสสินค้า ที่เราจะต้องคีย์ โดยคีย์เพียง 2 หลัก โปรแกรมก็จะเด้งลงมาข้างล่าง (โดยไม่ต้องกดเอ็นเตอร์) แต่ปัญหาของผมยังมีอีกปัญหาหนึ่งครับ คือ เมื่อเราจะให้ VBA รัน เราจะต้องก๊อปปี้โค้ิด ในคอลัมน์ C ลงใน VBA โปรแกรมถึงจะทำงาน ซึ่งผมก็ไม่ทราบว่าเป็นเพราะเหตุใด หรือผมทำขั้นตอนอะไรผิดหรือเปล่าไม่ รบกวนอาจารย์ช่วยชี้แนะด้วยครับ

Re: คีย์ตัวเลข 2 หลัก โดยไม่ต้องกด Enter ใน VBA

Posted: Sat Dec 03, 2011 6:52 pm
by snasui
:D ลองตามนี้ครับ

ในชีท MyJan ให้ยกเลิก Code ไปก่อน จากนั้นนำ Code ด้านล่างไปวางใน Module ปกติ

Code: Select all

Option Explicit

Dim i As Long

Sub KeyEventOn()
    For i = 48 To 57
        Application.OnKey "{" & i & "}", "'EnterToNextCell """ & i & """'"
    Next
End Sub

Sub KeyEventOff()
    For i = 47 To 57
        Application.OnKey "{" & i & "}"
    Next
End Sub

Sub EnterToNextCell(ByVal KeyCode As Long)
    Dim strText As String
    If Not TypeOf Selection Is Range Then Exit Sub
    strText = Selection.Value & Chr(KeyCode)
    Selection.Value = strText
    If Len(Selection) >= 2 Then
        Application.SendKeys "{ENTER}"
    End If
End Sub
ก่อนการคีย์ข้อมูลให้เรียกใช้ KeyEventOn ขึ้นมาก่อน โดยเรียกเพียงครั้งเดียว จากนั้นทำการคีย์ข้อมูลตามปกติ ก่อนปิดไฟล์ให้เลือก KeyEventOff ด้วยครับ

Re: คีย์ตัวเลข 2 หลัก โดยไม่ต้องกด Enter ใน VBA

Posted: Sat Dec 03, 2011 8:03 pm
by wisit
:D ขอบคุณครับอาจารย์ ที่ตอบคำถามข้อสงสัยผมได้รวดเร็วทันใจ เดี๋ยวผมจะลองทำดู ติดขัดยังไงจะรบกวนอาจารย์อีกครับ :mrgreen:

Re: คีย์ตัวเลข 2 หลัก โดยไม่ต้องกด Enter ใน VBA

Posted: Sat Dec 03, 2011 8:32 pm
by wisit
:( อาจารย์ครับ ผมลองทำดูตามขั้นตอนที่อาจารย์บอก แต่คีย์ตัวเลข 2 หลัก เช่น 48 แล้วโปรแกรมมันไม่ยอดเด้งลงข้างล่าง หรือผมทำผิดขั้นตอนหรือเปล่า (เพิ่งเริ่มหัดทำ VBA) รบกวนอาจารย์ช่วยชี้เแนะด้วยครับ ผมได้แนบไฟล์ที่ทำตามที่อาจารย์แนะนำมาด้วยครับ

Re: คีย์ตัวเลข 2 หลัก โดยไม่ต้องกด Enter ใน VBA

Posted: Sat Dec 03, 2011 8:50 pm
by snasui
:D วาง Code ผิดที่ครับ ลองอ่านทบทวนที่ผมแนะนำอย่างช้า ๆ ครับ

Re: คีย์ตัวเลข 2 หลัก โดยไม่ต้องกด Enter ใน VBA

Posted: Sat Dec 03, 2011 9:49 pm
by bank9597
:D น่าสนใจมากครับ

Re: คีย์ตัวเลข 2 หลัก โดยไม่ต้องกด Enter ใน VBA

Posted: Sat Dec 03, 2011 9:57 pm
by wisit
:tt: ขอบคุณครับอาจารย์ เดี๋ยวผมจะลองอ่านคำแนะนำอีกครั้งครับ :mrgreen:

Re: คีย์ตัวเลข 2 หลัก โดยไม่ต้องกด Enter ใน VBA

Posted: Sat Dec 03, 2011 11:35 pm
by wisit
:( อาจารย์ครับผมลองทำใหม่ โดยเปิดโปรแกรม Excel ใหม่ แล้วก๊อปปี้ โค้ดของอาจารย์ลงใน Module ก่อนการคีย์ข้อมูลผมได้เรียกใช้ KeyEventOn แล้ว แต่เวลาคีย์มันก็ยังไม่เด้งอีกครับ ผมลองทำยังไงก็ไม่ได้ รบกวนอาจารย์ช่วยอธิบายขั้นตอนหน่อยครับ เพราะผมเพิ่งเริ่มหัดเขียน VBA :mrgreen: (ผมได้แนบไฟล์มาให้อาจารย์ช่วยดูอีกครั้งว่าผมวางผิดที่หรือเปล่าครับอาจารย์)

Re: คีย์ตัวเลข 2 หลัก โดยไม่ต้องกด Enter ใน VBA

Posted: Sun Dec 04, 2011 7:18 am
by snasui
:lol: ผมทดสอบแล้วไม่มีปัญหาใดครับ

จากไฟล์ที่แนบมา ลองตามนี้ครับ
  1. เข้าเมนู Tools > Macro > Macro > เลือก KeyEventOn > Run
  2. ที่ A2 เป็นต้นไปทดสอบคีย์ตัวเลขตามต้องการ (จะคีย์ที่เซลล์ใด ๆ ก็ได้)

Re: คีย์ตัวเลข 2 หลัก โดยไม่ต้องกด Enter ใน VBA

Posted: Sun Dec 04, 2011 11:59 am
by wisit
:flw: อาจารย์ครับ ผมลองทำตามดูแต่ก็ไม่ได้ผล หรือว่าโปรแกรม Excel ผมเป็น 2003 จึงอาจทำให้รันแล้วไม่ได้ผล (อันนี้คิดเอาเองครับ) รบกวนอาจารย์อีกรอบครับ :mrgreen:

Re: คีย์ตัวเลข 2 หลัก โดยไม่ต้องกด Enter ใน VBA

Posted: Sun Dec 04, 2011 12:14 pm
by snasui
:lol: ตามความเห็นล่าสุดที่ผมตอบไปนั้น ผมได้ทดสอบด้วย Excel 2003 สังเกตการอธิบายเมนู Version หลัง ๆ จะมีเมนูไม่เหมือนกับที่อธิบายไป ลองทดสอบกับเครื่องอื่น ส่งให้เพื่อนทดสอบ ฯลฯ ครับ

Re: คีย์ตัวเลข 2 หลัก โดยไม่ต้องกด Enter ใน VBA

Posted: Sun Dec 04, 2011 12:42 pm
by wisit
:D ขอบคุณครับอาจารย์ ผมจะลองส่งให้เพื่อนทดสอบ หรือไม่ก็จะลองกับเครื่องอื่นแทน (ลืมบอกอาจารย์ว่า เครื่องผมบางครั้งก็มีปัญหา อาจเป็นเพราะสาเหตุนี้ก็เป็นได้) ต้องขอบพระคุณอาจารย์ที่ให้คำชี้แนะ ตอบข้อสงสัย และให้ความรู้แก่ผมเป็นอย่างมาก

Re: คีย์ตัวเลข 2 หลัก โดยไม่ต้องกด Enter ใน VBA

Posted: Sat Dec 17, 2011 10:21 pm
by wisit
อาจารย์ครับถ้าหากเราต้องการจะให้คอล์ลัมน์ C คีย์ตัวเลข 2 หลัก ส่วนคอล์ลัมน์ F ให้คีย์ตัวเลข 3 หลัก ส่วนคอล์ลัมน์อื่น ๆ คีย์ตัวเลขกี่หลักก็ได้ (คิด และปรึกษาเพื่อนแต่ไม่มีใครรู้เลย เพื่อนก็เพิ่งศึกษา VBA เหมือนผมเช่นกัน)

Re: คีย์ตัวเลข 2 หลัก โดยไม่ต้องกด Enter ใน VBA

Posted: Sat Dec 17, 2011 11:39 pm
by snasui
:D ที่ถามมานั้นใช้ Validation ทำได้ ไม่ต้องใช้ VBA ครับ

Re: คีย์ตัวเลข 2 หลัก โดยไม่ต้องกด Enter ใน VBA

Posted: Sun Dec 18, 2011 7:45 pm
by wisit
อาจารย์ครับต้องขอโทษอาจารย์ด้วยครับ ที่ผมลืมกล่าวนำ เนื่องจากการเขียน VBA ที่อาจารย์แนะนำมานั้น มันจะคลอบคลุมทุกคอล์ลัมน์ ผมต้องการให้คอล์ลัมน์ C คีย์ตัวเลข 2 หลัก ส่วนคอล์ลัมน์ F ให้คีย์ตัวเลข 3 หลัก ส่วนคอล์ลัมน์อื่น ๆ คีย์ตัวเลขกี่หลักก็ได้ ซึ่งโค้ดที่อาจารย์เขียนให้ดังนี้ครับ

Code: Select all

Option Explicit

Dim i As Long

Sub KeyEventOn()
    For i = 48 To 57
        Application.OnKey "{" & i & "}", "'EnterToNextCell """ & i & """'"
    Next
End Sub

Sub KeyEventOff()
    For i = 47 To 57
        Application.OnKey "{" & i & "}"
    Next
End Sub

Sub EnterToNextCell(ByVal KeyCode As Long)
    Dim strText As String
    If Not TypeOf Selection Is Range Then Exit Sub
    strText = Selection.Value & Chr(KeyCode)
    Selection.Value = strText
    If Len(Selection) >= 2 Then
        Application.SendKeys "{ENTER}"
    End If
End Sub

Re: คีย์ตัวเลข 2 หลัก โดยไม่ต้องกด Enter ใน VBA

Posted: Sun Dec 18, 2011 10:30 pm
by snasui
:D ลองปรับ Code มาก่อนครับ ติดตรงไหนค่อยมาดูกันต่อ สำหรับ Code ที่ส่งมาเป็น Code เดิมที่เคยเขียนให้ไป ยังไม่มีการปรับใด ๆ ครับ

Re: คีย์ตัวเลข 2 หลัก โดยไม่ต้องกด Enter ใน VBA

Posted: Thu Dec 22, 2011 10:38 pm
by wisit
อาจารย์ครับผมได้ทำการกำหนดโค้ดคอลัมน์แล้วครับ ลองเทสท์ดูก็ใช้ได้ครับ แต่ดูวันยาว ๆ ยังไงไม่รู้ครับ ให้เพื่อนช่วยปรับให้สั้นกว่านี้ แต่เพื่อนบอกว่าทำไม่ได้เช่นกัน และรบกวนอาจารย์ในปัญหาเดิม ๆ ครับ เรื่องการคีย์โดยใช้แป้นพิมพ์ตัวเลข (ใช้แป้นพิมพ์นี้ คำสั่งใน VBA จะไม่ทำงาน) แต่ถ้าใช้แป้นพิมพ์ตัวเลขที่ใกล้ฟังก์ชั่น (คำสั่งใน VBA จะทำงาน) ซึ่งผมอยากใช้แป้นพิมพ์ตัวเลขมากกว่าและพอดีปรึกษากับเพื่อน เขาบอกว่าที่คีย์ในแป้นพิมพ์ตัวเลขไม่ได้เพราะคำสั่ง Chr(KeyCode) แต่เพื่อนบอกถ้าไม่ใช้คำสั่งนี้ก็ไม่รู้จะใช้คำสั่งไหนแล้ว และที่อาจารย์แนะนำให้สร้างฟอร์ม เพื่อนบอกว่าจะต้องเขียนโค้ดเพิ่ม ซึ่งผมก็ไม่ค่อยจะมีความรู้ในเรื่องนี้ซักเท่าไหร่ครับ รบกวนอาจารย์ช่วยแนะนำด้วยครับ :D (ผมได้แนบไฟล์ตัวอย่างมาด้วยครับ) ส่วนโค้ดที่ทำดังนี้ครับ :ard:

Code: Select all

Option Explicit

Dim i As Long

Sub KeyEventOn()
    For i = 48 To 57
        Application.OnKey "{" & i & "}", "'EnterToNextCell """ & i & """'"
    Next
End Sub

Sub KeyEventOff()
    For i = 47 To 57
        Application.OnKey "{" & i & "}"
    Next
End Sub

Sub EnterToNextCell(ByVal KeyCode As Long)
    Dim strText As String
    If Not TypeOf Selection Is Range Then Exit Sub
    strText = Selection.Value & Chr(KeyCode)
    Selection.Value = strText
'MsgBox Chr(KeyCode) & Selection.Value
Select Case (Selection.Column)
    Case 1
        'MsgBox "1"
        If Len(Selection) >= 2 Then
            Application.SendKeys "{ENTER}"
        End If
    Case 2, 6
        'MsgBox "2"
         If Len(Selection) >= 3 Then
            Application.SendKeys "{ENTER}"
        End If
    Case 3
        'MsgBox "3"
         If Len(Selection) >= 2 Then
            Application.SendKeys "{ENTER}"
        End If
    Case 4
        'MsgBox "4"
         If Len(Selection) >= 3 Then
            Application.SendKeys "{ENTER}"
        End If
    Case 5
        'MsgBox "5"
         If Len(Selection) >= 4 Then
            Application.SendKeys "{ENTER}"
        End If
    Case Else
        If Len(Selection) >= 2 Then
            Application.SendKeys "{ENTER}"
        End If
    
 End Select
   
    'If Len(Selection) >= 2 Then
    '    Application.SendKeys "{ENTER}"
    'End If
End Sub

Re: คีย์ตัวเลข 2 หลัก โดยไม่ต้องกด Enter ใน VBA

Posted: Fri Dec 23, 2011 6:49 pm
by snasui
wisit wrote:อาจารย์ครับถ้าหากเราต้องการจะให้คอล์ลัมน์ C คีย์ตัวเลข 2 หลัก ส่วนคอล์ลัมน์ F ให้คีย์ตัวเลข 3 หลัก ส่วนคอล์ลัมน์อื่น ๆ คีย์ตัวเลขกี่หลักก็ได้ (คิด และปรึกษาเพื่อนแต่ไม่มีใครรู้เลย เพื่อนก็เพิ่งศึกษา VBA เหมือนผมเช่นกัน)
จากด้านบน สามารถปรับ Code เป็นตามด้านล่างครับ

Code: Select all

Option Explicit

Dim i As Long

Sub KeyEventOn()
    For i = 48 To 57
        Application.OnKey "{" & i & "}", "'EnterToNextCell """ & i & """'"
    Next
End Sub

Sub KeyEventOff()
    For i = 47 To 57
        Application.OnKey "{" & i & "}"
    Next
End Sub

Sub EnterToNextCell(ByVal KeyCode As Long)
    Dim strText As String
    If Not TypeOf Selection Is Range Then Exit Sub
    strText = Selection.Value & Chr(KeyCode)
    Selection.Value = strText
    Select Case Selection.Column
        Case 3
            'MsgBox "2"
             If Len(Selection) >= 2 Then
                Application.SendKeys "{ENTER}"
            End If
        Case 6
            'MsgBox "5"
             If Len(Selection) >= 3 Then
                Application.SendKeys "{ENTER}"
            End If
     End Select
End Sub
สำหรับการคีย์ตัวเลขด้วย Keypad ให้ช่วยเก็บ Character code โดยคลิกปุ่ม Button1 แล้วใช้แป้น Keypad คีย์ตัวเลขแต่ละตัว และดู Message Box ว่าแสดงค่า Character code เป็นเลขใด แจ้งมาในฟอรัมอีกรอบครับ

สำหรับการวาง Code VBA ให้เป็น Code จะได้ดูง่าย ๆ ลองดูจากกระทู้นี้ครับ viewtopic.php?f=6&t=1187 และ viewtopic.php?f=3&t=1354