PDA

View Full Version : Excel สามารถเขียน VBA ฝังตัวไว้ใน Windows หรือเปล่าครับ



zv735
9 May 2007, 11:13
Excel สามารถเขียน VBA ฝังตัวไว้ใน Windows ได้หรือเปล่าครับ

คือว่า เราสามารถ ทำให้ สามารถ กด ctrl+L(เป็น Short cut ของ macro) แล้วให้ macro ที่เราเขียนไว้ทำงาน
โดยที่ โปรแกรม Excel ไม่ได้ Active อยู่นะครับ(แต่เปิดโปรแกรมอยู่นะครับ)

เช่น อยู่ที่หน้าจอ กล้องวงจรปิด
แต่ต้องการสั่งให้เปิดลิ้นชัก Cashier นะครับ (เขียน Macro ไว้ใน Excel อยู่แล้วครับผม)

ช่วยแนะนำด้วยนะครับ

ขอบพระคุณมากมากครับผม

อรวีร์
10 May 2007, 17:46
คุณzv735 เคยเขียนโปรแกรม VB หรือเปล่าคะ

zv735
10 May 2007, 18:45
เรียนอาจารย์ อรวีร์ และขอโทษอาจารย์สมเกียรติมากมาก ด้วยนะครับ

ผมเคยเขียนโปรแกรม VB ครับ
และ เคยเห็นการเขียนแบบฝังตัวโปรแกรมไว้ที่ Task bar เพื่อรอการเรียกใช้
เคย Download ตัวอย่างโปรแกรมมาแล้วครับ
แต่ไม่ได้ใช้นานมากแล้ว ไม่รู้เอาไปไว้ไหนแล้ว

แต่ถ้าใช้ Vb ผมก็ต้องลง โปรแกรม VB ด้วยใช้หรือเปล่าครับ

จะได้หาเตรียมเอาไว้ใช้ก่อนนะครับ

ขอบคุณอาจารย์อรวีร์มากมากครับผม

อรวีร์
11 May 2007, 12:52
แฟ้มแนบเป็นตัวอย่างเขียน VBA ใน Excel ค่ะ

zv735
11 May 2007, 22:14
อาจารย์ อรวีร์ ครับ

ผมไม่เข้าใจการทำงานเลยครับ

sub TimerProc ทำงานวนรอบเพื่อตรวจสอบ
การกด key ของเรา แล้ว วนรอบทำงานไปเรื่อยๆ(วนรอบตลอดเวลา) โดยเก็บค่าที่ตรวจจับได้ ไว้ใน sSave
สุดท้าย เรากดให้การตรวจจับการกด Key หยุด แล้วให้แสดงค่า sSave ที่ cell B7

ที่นี้ Function GetAsyncKeyState(Cnt) สามารถเก็บค่า Key พิเศษได้หรือเปล่าครับ
พวก ctrl กับ alt นะครับ
เพราะใน Function ให้แสดงเฉพาะที่เป็นตัวอักษร ผมลองปรับแก้ให้ตรวจรหัสอื่นดูแล้ว
ไม่สามารถทำได้ครับ
รห้สที่จับได้ เป็นแบบนี้ครับ

Lข (กด ctrl+l แล้ว enter)
Lค (กด alt+l แล้ว enter)
 (กด shift +l แล้ว enter)
L L (กด l แล้ว enter)
W (กด ww แล้ว enter)


ช่วยสอยและอธิบายให้ผมฟังหน่อยได้หรือเปล่าครับ

ขอบพระคุณมากมากครับผม

อรวีร์
12 May 2007, 04:16
เมื่อคุณทดลองกด Ctrl L เสร็จแล้วและค่ามาแสดงที่ B7 แล้ว
ลองใส่สูตรใน Cell ใดๆ
=CODE(MID(B7,1,1))
แล้วเปลี่ยนเลข 1 เป็น 2
แล้วเปลี่ยนเลข 2 เป็น 3
. . . . . . . .

ลองดู Help ของ Function CHAR( ) และ CODE( ) ของ Excel ค่ะ
และลองดู Help ของ Function Chr$( ) และ Asc( ) ของ VBA ค่ะ

และลองดูที่นี่ค่ะ
http://api.farmanager.com/en/winapi/virtualkeycodes.html
จะพบว่า Ctrl ได้ค่าเป็น 17
Shift ได้ค่าเป็น 16
Alt ได้ค่าเป็น 18
Enter ได้ค่าเป็น 13

เมื่อทดลองเข้าใจแล้ว ลองปรับปรุง Code เพื่อตรวจจับ Ctrl+L ดูค่ะ

ได้ผลอย่างไรแจ้งด้วยค่ะ :)

zv735
12 May 2007, 09:16
ขอบคุณอาจารย์อรวีร์มากครับ
ผมจะลองทำดูนะครับ

ได้ผลอย่างไร จะรีบแจ้งให้ทราบครับ

ขอบคุณมากมากครับผม

zv735
12 May 2007, 13:57
ขอบคุณอาจารย์อรวีร์มากมากครับ
ผมปรับแก้สูตรเป็น

Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
For Cnt = 0 To 128
' ตรวจสอบการกด Key ที่รหัส=Cnt
If GetAsyncKeyState(Cnt) <> 0 Then Ret = Chr$(Cnt): Exit For
Next Cnt
If Ret <> sOld Then
sOld = Ret
If sSave <> "" Then
If (Asc(Right(sSave, 1)) = 17) And ((Asc(sOld) = 76) Or (Asc(sOld) = 108)) Then
Application.WindowState = xlNormal
MsgBox "ขอบคุณ อาจารย์อรวีร์ มากมากครับผม"
Application.WindowState = xlMinimized
sSave = ""
End If
End If
sSave = sSave + sOld
End If
If Len(sSave) > 3 Then sSave = ""
End Sub
สามารถเรียกใช้ Macro ที่อยู่ใน Excel ได้แล้วครับ
แต่ถ้า Excel Active อยู่จะไม่สามารถ จับ ctrl+L ได้ครับ
จับได้แต่ การกด Ctrl เท่านั้น ทำไมเป็นแบบนี้ครับ

แล้ว Code ที่ผมแก้นี้มาถูกทางหรือเปล่าครับ
รบกวนอาจารย์อรวีร์ช่วยแนะนำเพิ่มเติมด้วยนะครับ

ขอบพระคุณอาจารย์อรวีร์มากมากครับผม

อรวีร์
15 May 2007, 08:57
ลองดู File แนบค่ะ

zv735
15 May 2007, 12:11
ขอบคุณอาจารย์อรวีย์มากมากครับ

Code ของอาจารย์ ยอดเยี่ยม มากมากครับ
สั้น ครอบคุม และสะดวกต่อการใช้งานมากครับ
ได้แนวคิดที่จะไปประยุกต์ใช้ได้มากเลยครับ

ขอบพระคุณอาจารย์ อรวีร์ ที่สั่งสอนผมนะครับ
ขอบพระคุณมากมากครับผม