Page 1 of 1

เมื่อรัน VBA แล้ว ไม่สามารถลบตัวเลขที่พิมพ์ได้ในเซลล์นัืน ๆ

Posted: Tue Jan 03, 2012 12:40 pm
by wisit
อาจารย์ครับ รบกวนสอบถามเกี่ยวกับการรัน VBA หน่อยครับ คือ เมื่่อผมรัน VBA แล้ว โดยผมกำหนดให้คอลัมน์ C พิมพ์ตัวเลขได้เพียง 2 หลัก ส่วนคอลัมน์ D ผมไม่ได้กำหนด (จะพิมพ์กี่หลักก็ได้ หมายเหตุ โค้ดที่เขียนส่วนใหญ่ได้รับคำแนะนำ และแก้ไขจากท่านอาจารย์คนควนครับ) แต่มีปัญหาตรงที่ เมื่อเราพิมพ์ในคอลัมน์ D ในเชลล์ใดก็ตาม เช่น ผมพิมพ์ค่า 1000 ใน D8 เมื่อผมกด Enter แล้ว ผมนำเมาส์ไปคลิ๊กที่ช่อง D8 แล้วพิมพ์ค่า 500 ซึ่งปกติหากไม่รัน VBA โปรแกรมจะลบค่า 1000 โดยอัตโนมัติ จะได้ค่า 500 แต่เมื่อรัน VBA เมื่อผมนำเมาส์ไปคลิ๊กที่ช่อง D8 แล้วพิมพ์ค่า 500 โปรแกรมจะพิมพ์ค่าต่อเนื่อง จะทำให้ได้ค่า 1000500 ซึ่งผมอยากให้คลิ๊กช่องที่เคยคีย์ค่าแล้ว สามารถคีย์ค่าอื่น ๆ แทนที่ โดยไม่ต้องรันค่าต่อจากค่าที่คีย์แล้ว ไม่รู้พอมีวิธีการหรือเปล่าครับอาจารย์

Re: เมื่อรัน VBA แล้ว ไม่สามารถลบตัวเลขที่พิมพ์ได้ในเซลล์นัื

Posted: Tue Jan 03, 2012 3:20 pm
by snasui
:D เนื่องจากไม่เห็นไฟล์และ Code ก็เลยตอบด้วยความน่าจะเป็นว่า KeyEventOn ยังเปิดอยู่ครับ ต้องเรียกใช้ Code KeyEventOff เพื่อปิดก่อน ซึ่งการจะเปิดหรือปิดควรใช้ Event Selection Change มาช่วยตรวจสอบ เช่น หากเป็นคอลัมน์เป้าหมายที่ต้องการจะใช้ Event เพื่อดักจำนวนอักขระ ก็ให้ Run KeyEventOn หากไม่ใช่ก็ให้ใช้ KeyEventOff เพื่อปิดไปก่อน

Code จะเขียนโดยผมหรือผมช่วยปรับให้ผมก็จำไม่ได้ครับ เพราะที่ผ่านมาจนถึงปัจจุบันผมเขียนไฟล์นับหมื่น ๆ ไฟล์ ดังนั้น หากมีกรณีสงสัยให้แนบมาด้วยก็จะดีมากครับ จะได้เข้าถึงปัญหาโดยไว เพราะผมจะไม่พยายามจำครับ :mrgreen:

Re: เมื่อรัน VBA แล้ว ไม่สามารถลบตัวเลขที่พิมพ์ได้ในเซลล์นัื

Posted: Wed Jan 04, 2012 11:03 pm
by wisit
ต้องขออภ้ยอาจารย์ด้วยครับ :sg: ที่ผมกล่าวอ้างอิงอาจารย์เพราะต้องการให้เครดิตกับอาจารย์ หากผิดพลาดประการใด ต้องขออภัยอาจารย์ด้วยครับ :mrgreen: ส่วนการใช้ Event Selection Change มาช่วยตรวจสอบ เดี๋ยวผมจะลองเขียนโค้ดดูครับ
แต่ผมมีปัญหาเกี่ยวกับการให้แทนค่าจุด (.) ตรง Keypad ให้เป็นค่าศูนย์ แต่เมื่อผมเขียนโค้ดแล้ว รันดูก็ไม่ได้ โดยโค้ดมีดังนี้

Option Explicit

Dim i As Long

Sub KeyEventOn()
For i = 96 To 105
Application.OnKey "{" & i & "}", "'EnterToNextCell """ & i & """'"
Next i
If (i = 46) Then
Application.OnKey "{" & i & "}", "'EnterToNextCell """ & i & """'"
End If
End Sub

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

Sub EnterToNextCell(ByVal KeyCode As Long)
Dim strText As String
Dim s As String
If Not TypeOf Selection Is Range Then Exit Sub
s = Chr(KeyCode)
Select Case s
Case "`": s = 0
Case "a": s = 1
Case "b": s = 2
Case "c": s = 3
Case "d": s = 4
Case "e": s = 5
Case "f": s = 6
Case "g": s = 7
Case "h": s = 8
Case "i": s = 9
End Select
strText = Selection.Value & s
Selection.Value = strText
Select Case Selection.Column
Case 3, 12
'MsgBox "2"
If Len(Selection) >= 2 Then
Application.SendKeys "{ENTER}"
End If
Case 6, 9, 15
'MsgBox "5"
If Len(Selection) >= 3 Then
Application.SendKeys "{ENTER}"
End If
End Select
End Subล

ส่วนที่เพิ่มคือโค้ด
If (i = 46) Then
Application.OnKey "{" & i & "}", "'EnterToNextCell """ & i & """'"
End If

Re: เมื่อรัน VBA แล้ว ไม่สามารถลบตัวเลขที่พิมพ์ได้ในเซลล์นัื

Posted: Wed Jan 04, 2012 11:13 pm
by snasui
:D ขอบคุณสำหรับเครดิต สามารถละไว้ในฐานที่เข้าใจได้ครับ :mrgreen:

ช่วยปรับ Code ให้แสดงเป็น Code เพื่อง่ายต่อการนำไปใช้ซึ่งผมได้เขียนแจ้งไว้แล้วที่บรรทัดสุดท้ายของความเห็นนี้ครับ viewtopic.php?p=12816#p12816