Page 1 of 1

เรียนสอบถาม Excel Macro สามารถตรวจสอบโปรแกรม cmd.exe ว่ามีการปิดไปหรือยัง ได้อย่างไรครับ

Posted: Tue Sep 07, 2021 4:21 pm
by Weravong
เรียนสอบถาม Excel Macro สามารถตรวจสอบโปรแกรม cmd.exe ว่ามีการปิดไปหรือยัง ได้อย่างไรครับ จากไฟล์แนบหากจะลองใช้ทดสอบให้ไปวางที่ D:\000_A_Test โดยมี File ที่อยู่ใน Folder นี้ดังนี้ครับ
Keep เป็น Batch File (สร้างเป็น batch file ไว้ ไม่ต้องใส่อะไร)
pinglog เป็น Text File (สร้างเป็น batch file ไว้ ไม่ต้องใส่อะไร)
และ File ที่แนบมาคือ SMC_Internet (เป็น Macro Excel)

เมื่อติดตั้ง File ต่างๆเรียบร้อยแล้ว เปิด Excel ซึ่งผมได้ทำปุ่มกด Run เมื่อกดปุ่ม Run ตัว Excel จะไป clear file Keep และ ping log และ Clear ค่าใน Excel เองทั้งหมด และจะไปสั่งให้เริ่มทำการเปิด CMD.EXE แล้วทำการ ping ทดสอบ ip ซึ่งผมจำลองไว้ 10 วงจร และแกล้งหน่วงเวลาของexcel ให้น้อย เพื่อให้ excel ดึงค่าแค่ 2 วินาที เพื่อให้เกิดปัญหาในการดึงค่าจาก pinglog มาเก็บไม่ทัน ซึ่งเป็นการจำลองว่า
หากตั้งเวลาของ excel ไม่ถูกต้อง excel จะดึงค่าก่อนที่ cmd จะ ping เสร็จครับ ดังนั้นผมต้องการให้ excel สามารถตรวจสอบว่า
CMD.EXE ปิดไปตอนไหน หากปิดแล้วก็ให้ excel ไปดึงค่ามา โดยผมใช้ Get_log_PW1 เป็น Macro ในการดึงค่า และปุ่ม Run จะตั้งเวลาไว้ครับ โดยเอาตัวแปร 10(Range A4) มาตั้งเวลาเป็น 2 วินาที[Sub Run_All()] หากเรายืดเวลาเป็น 1 นาทีก็จะทำให้ program ทำงานปกติ แต่ผมไม่ต้องการให้ระบบใช้การตั้งเวลา แต่อยากให้ excel สามารถรู้ได้ว่ามีการปิด cmd.exe ไปแล้วอัตโนมัติ แล้วถึงไป Get ดึงค่ามาลง excel ครับ เนื่องจากวงจรอาจจะมีมากกว่า 200-350 วงจร และเวลาไม่แน่นอนครับ
ขอบคุณมากๆครับ ด้วยความเคารพ

Re: เรียนสอบถาม Excel Macro สามารถตรวจสอบโปรแกรม cmd.exe ว่ามีการปิดไปหรือยัง ได้อย่างไรครับ

Posted: Tue Sep 07, 2021 8:45 pm
by snasui
:D ลองนำ Code ด้านล่างไปประยุกต์ดูครับ

Code: Select all

Public Function exampleIsProcessRunning()
    Debug.Print IsProcessRunning("CMD.EXE")
    Debug.Print IsProcessRunning("Explorer.EXE")
    Debug.Print IsProcessRunning("NOTEPAD.EXE")
End Function

Public Function IsProcessRunning(process As String)
    Dim objList As Object

    Set objList = GetObject("winmgmts:") _
        .ExecQuery("select * from win32_process where name='" & process & "'")

    If objList.Count > 0 Then
        IsProcessRunning = True
    Else
        IsProcessRunning = False
    End If
End Function

Re: เรียนสอบถาม Excel Macro สามารถตรวจสอบโปรแกรม cmd.exe ว่ามีการปิดไปหรือยัง ได้อย่างไรครับ

Posted: Fri Sep 10, 2021 9:12 am
by Weravong
เรียน คุณ snasui ขอขอบพระคุณมากๆครับ เดี๋ยวผมลองประยุกต์และทดสอบดูครับ

Re: เรียนสอบถาม Excel Macro สามารถตรวจสอบโปรแกรม cmd.exe ว่ามีการปิดไปหรือยัง ได้อย่างไรครับ

Posted: Fri Sep 10, 2021 3:20 pm
by Weravong
เรียน คุณ snasui จาก code ที่คุณ snasui ให้มา ผมมีคำถามดังนี้
Code ด้านล่างนี้เป็นการเปิด Function Debug.print เพื่อให้เราสามารถดูขั้นตอนต่างๆของแต่ละโปรแกรมได้ใช่ไหมครับ
ซึ่งให้กด Ctrl+G ใช่หรือไม่ครับ

Code: Select all

Public Function exampleIsProcessRunning()
    Debug.Print IsProcessRunning("CMD.EXE")
    Debug.Print IsProcessRunning("Explorer.EXE")
    Debug.Print IsProcessRunning("NOTEPAD.EXE")
End Function
และ Code ตามด้านล่างนี้ผมไม่แน่ใจทำงานอย่างไรครับ และการนำไปใช้ ผมต้องนำ Macro name ต่างๆ
มาใส่ใต้ IsProcessRunning = True หรือ IsProcessRunning = False ใช่ไหมครับ

Code: Select all

Public Function IsProcessRunning(process As String)
    Dim objList As Object
    Set objList = GetObject("winmgmts:") _
        .ExecQuery("select * from win32_process where name='" & process & "'")
    If objList.Count > 0 Then
        IsProcessRunning = True
    Else
        IsProcessRunning = False
    End If
End Function
และใน Excel กรณีปุ่ม Run สีแดง ซึ่งคือชุดคำสั่งตามด้านล่างนี้ครับ ซึ่งเมื่อกดปุ่ม Run มันจะมีการทำงานโดยไปเปิด Bat File แล้ว
ทำการ Run CMD ซึ่งมีชุดคำสั่งใน CMD ซึ่งมันจะ Runไป10 วงจร โดยผมไม่รู้มันจะหยุดตอนไหน โดยผลลัพธ์จากการ Run
มันจะมีใส่ใน pinglog.txt แล้วผมตั้งเวลา excel เพื่อไปดึงจาก pinglog มาไว้ใน excel ครับ ดังนั้นหากผมตั้งเวลาเร็วไป
ก็จะดึงมาไม่ครบ เพราะ cmd อาจจะยังทำงานไม่เสร็จ ดังนั้นผมไม่แน่ใจว่าจะต้องทำอย่างไรครับ

Code: Select all

Sub Run_All()
Call Unhide_PW1                     ===> ซ่อน Sheet
Call Clear_IP_Input_PW1           ===> Clear ค่าต่างๆให้ว่าง
Call Sent_IP_Input_PW1            ===> ส่งข้อมูล ip ที่จะ ping และเปิด Bat file และ Run CMD 
If Range("A6") = 5 Then                                        
Application.Wait (Now + TimeValue("0:00:10"))  ===> ตั้งเวลาหากมี5วงจร ก็หน่วงการดึงค่าของ excel 10 sec
Else
If Range("A4") = 10 Then
Application.Wait (Now + TimeValue("0:00:02"))  ===>ตั้งเวลาหลอก หากมี10วงจร ก็หน่วงการดึงค่าของ excel 2 sec เพื่อให้ excel 
                                             ทำงานดึงค่าไม่ทัน (ซึ่งต้องการวิธีใหม่ที่ไม่ต้องตั้งเวลา แต่เช็คว่า CMD ปิด จึง 
                                               จะไปดึงค่ามาครับ Else
End If
End If
Call Get_Log_PW1     ===> ไปดึงค่า
Call Compare_Result_Before_PW1   ===> option เก็บ Log ก่อนทำ
Call Hide_PW1    ===> ซ่อน sheet 
End Sub
ขอบคุณมากๆครับ

Re: เรียนสอบถาม Excel Macro สามารถตรวจสอบโปรแกรม cmd.exe ว่ามีการปิดไปหรือยัง ได้อย่างไรครับ

Posted: Fri Sep 10, 2021 3:45 pm
by Weravong
เรียน คุณ snasui เมื่อสักครู่ผมลองเอาชุดนี้ออก 'Debug.Print IsProcessRunning("Explorer.EXE") และ
'Debug.Print IsProcessRunning("NOTEPAD.EXE") แล้วลองเปิดและปิด CMD และกด RUN F8 ทดสอบไปเรื่อยๆ น่าจะได้ผลครับ

Code: Select all

Public Function exampleIsProcessRunning()
    Debug.Print IsProcessRunning("CMD.EXE")
End Function
และลองใส่กรณี true ให้ไปอีก sheet สรุปทำงานได้ครับ เดี๋ยวจะลองไปประยุกต์ใช้ครับ ขอบคุณครับ

Code: Select all

If objList.Count > 0 Then
        IsProcessRunning = True
        Sheets("Fomula_PW").Select
        Range("A12").Select
               Else
        IsProcessRunning = False
        End If

Re: เรียนสอบถาม Excel Macro สามารถตรวจสอบโปรแกรม cmd.exe ว่ามีการปิดไปหรือยัง ได้อย่างไรครับ

Posted: Tue Oct 05, 2021 11:15 pm
by Weravong
เรียน คุณ snasui ครับ ตอนนี้ผมลองทดสอบ แต่ยังไม่สามารถใช้งานได้ครับ จึงไม่แน่ใจว่า code ดังกล่าว ผมต้องใส่ code เพื่อเปิด Run CMD ในช่วงไหน เพื่อให้โปรแกรมตรวจสอบการเปิด CMD ไว้ครับ และเมื่อ CMD ปิดตัวไปอัตโนมัติ ก็ให้ระบบเช็คว่าปิดแล้ว และก็ให้หยุดทำงานหรือไปทำ vb code อื่นตามต้องการครับ ขอบคุณมากๆครับ
(เริ่มต้นใช้งาน ผมทำปุ่มเพื่อไป call หา exampleIsProcessRunning ครับ และผมได้ใส่การแทรก call ตามหลักการด้านบนนี้มาครับ ว่าใส่ถูกต้องไหมครับ)

Code: Select all

Public Function exampleIsProcessRunning()
    Debug.Print IsProcessRunning("CMD.EXE")
End Function

Public Function IsProcessRunning(process As String)
    Dim objList As Object
    Set objList = GetObject("winmgmts:") _
        .ExecQuery("select * from win32_process where name='" & process & "'")

    If objList.Count > 0 Then
    IsProcessRunning = True
        Call Sent_IP_Input_PW1  ------- ทำการเปิดเรียก CMD เพื่อทำการ ping อัตโนมัติ
  Else
    IsProcessRunning = False
        Call Get_Log_PW1      ---------- ให้ไปเรียกเพื่อดึงข้อมูล เมื่อ cmd ปิด 
     
 Sheets("Menu_PW1").Select --------- กลับ Menu หลัก
 Range("A12").Select
 End If
End Function

Re: เรียนสอบถาม Excel Macro สามารถตรวจสอบโปรแกรม cmd.exe ว่ามีการปิดไปหรือยัง ได้อย่างไรครับ

Posted: Tue Oct 05, 2021 11:35 pm
by snasui
Weravong wrote: Tue Sep 07, 2021 4:21 pm ผมต้องการให้ excel สามารถตรวจสอบว่า
CMD.EXE ปิดไปตอนไหน หากปิดแล้วก็ให้ excel ไปดึงค่ามา

:D ตัวอย่างการใช้งานก็จะเป็นตามลำดับนี้ครับ
  1. รันคำสั่งที่ทำให้เปิด CMD
  2. รัน Code สำหรับเช็ค CMD ว่าปิดแล้วหรือไม่ หากปิดแล้วให้ไปดึงค่ามา
Code ที่ให้ไปคือการ Check ว่า CMD (หรือโปรแกรมใด ๆ) ปิดไปแล้วหรือไม่ จึงไม่ใช่ตามที่ปรับปรุงมาครับ

Re: เรียนสอบถาม Excel Macro สามารถตรวจสอบโปรแกรม cmd.exe ว่ามีการปิดไปหรือยัง ได้อย่างไรครับ

Posted: Wed Oct 06, 2021 8:40 am
by Weravong
snasui wrote: Tue Oct 05, 2021 11:35 pm
Weravong wrote: Tue Sep 07, 2021 4:21 pm ผมต้องการให้ excel สามารถตรวจสอบว่า
CMD.EXE ปิดไปตอนไหน หากปิดแล้วก็ให้ excel ไปดึงค่ามา

:D ตัวอย่างการใช้งานก็จะเป็นตามลำดับนี้ครับ
  1. รันคำสั่งที่ทำให้เปิด CMD
  2. รัน Code สำหรับเช็ค CMD ว่าปิดแล้วหรือไม่ หากปิดแล้วให้ไปดึงค่ามา
Code ที่ให้ไปคือการ Check ว่า CMD (หรือโปรแกรมใด ๆ) ปิดไปแล้วหรือไม่ จึงไม่ใช่ตามที่ปรับปรุงมาครับ
ขอบคุณมากๆครับ เดี๋ยวผมลองทดสอบใหม่อีกครั้งครับ

Re: เรียนสอบถาม Excel Macro สามารถตรวจสอบโปรแกรม cmd.exe ว่ามีการปิดไปหรือยัง ได้อย่างไรครับ

Posted: Wed Oct 06, 2021 9:24 am
by Weravong
เรียนคุณ snasui ผมได้สร้างปุ่มกดสีแดงชื่อปุ่ม "Run" โดยปุ่มนี้จะ run code ที่ชื่อ Run_All ตามนี้ครับ

Code: Select all

Sub Run_All()
Call exampleIsProcessRunning
End Sub
และในส่วนของการตรวจสอบ cmd ผมใส่ตามนี้ครับ

Code: Select all

Public Function exampleIsProcessRunning()
    Debug.Print IsProcessRunning("CMD.EXE")
End Function
Public Function IsProcessRunning(process As String)
    Dim objList As Object
Set objList = GetObject("winmgmts:") _
.ExecQuery("select * from win32_process where name='" & process & "'")
 Call Sent_IP_Input_PW1   -------------------------- เรียกใช้ CMD
        If objList.Count > 0 Then
        IsProcessRunning = True
   Sheets("Menu_PW1").Select    ----------- ถ้า CMD ยังไม่ปิด ยังคงอยู่หน้า Sheet  "Menu_PW1" ซึ่งเป็นหน้า Menu หลัก
Else
        IsProcessRunning = False
 Sheets("Fomula_PW").Select
 Call Get_Log_PW1                   ---------- ถ้า CMD ปิดแล้ว ก็ให้ไปดึงค่าจากการทำงานของ CMD 
          End If
End Function
แต่จากการทดสอบ จะแสดงตามภาพครับ คือ เมื่อกดปุ่ม Run ก็จะทำงานโดยเปิด CMD แล้วทำการ ping ทดสอบตาม code
จากนั้นเมื่อทำการเปิดดู debug จะเห็นว่าเป็น False ครับ ตามภาพครับ โดยcode จะ run ไปจนจบ โดยไม่รอการปิด cmd ครับ คือไปทำการ
ดึงค่า Call Get_Log_PW1 เลยครับ และก็จบการทำงาน โดยที่ cmd ก็ยังเปิดและ run อยู่ครับ จึงไม่แน่ใจว่าผมทำผิดขั้นตอนไหมครับ ขอบคุณครับ
Q_test_check_CMD.jpg

Re: เรียนสอบถาม Excel Macro สามารถตรวจสอบโปรแกรม cmd.exe ว่ามีการปิดไปหรือยัง ได้อย่างไรครับ

Posted: Wed Oct 06, 2021 9:50 am
by snasui
:D Code ที่ผมแนะนำไปนั้น เขียนไปอย่างไรก็ใช้อย่างนั้น ใช้เพื่อการตรวจสอบว่าปิดแล้วหรือไม่ นี่คือหน้าที่ของมันครับ

Code ที่ควรเป็นคือ

Code: Select all

Sub Run_All()
'Your code

Do while IsProcessRunning("CMD.EXE")
    Application.Wait Now()+TimeValue("0:00:03")
Loop

'Your code
End Sub
สังเกตว่า Run Code แล้วตรวจสอบโดยมีการหน่วงเวลาไว้ 3 วินาที ถ้ายังไม่ปิดก็จะรอใหม่จนกว่าจะมีการปิด

ในการ Loop เพื่อรอ ควรจะกำหนดครั้งที่ให้ Loop ไม่เช่นนั้นหาก CMD ไม่มีการปิดจะ Loop ไม่รู้จบครับ

Re: เรียนสอบถาม Excel Macro สามารถตรวจสอบโปรแกรม cmd.exe ว่ามีการปิดไปหรือยัง ได้อย่างไรครับ

Posted: Wed Oct 06, 2021 10:25 am
by Weravong
snasui wrote: Wed Oct 06, 2021 9:50 am :D Code ที่ผมแนะนำไปนั้น เขียนไปอย่างไรก็ใช้อย่างนั้น ใช้เพื่อการตรวจสอบว่าปิดแล้วหรือไม่ นี่คือหน้าที่ของมันครับ

Code ที่ควรเป็นคือ

Code: Select all

Sub Run_All()
'Your code

Do while IsProcessRunning("CMD.EXE")
    Application.Wait Now()+TimeValue("0:00:03")
Loop

'Your code
End Sub
สังเกตว่า Run Code แล้วตรวจสอบโดยมีการหน่วงเวลาไว้ 3 วินาที ถ้ายังไม่ปิดก็จะรอใหม่จนกว่าจะมีการปิด

ในการ Loop เพื่อรอ ควรจะกำหนดครั้งที่ให้ Loop ไม่เช่นนั้นหาก CMD ไม่มีการปิดจะ Loop ไม่รู้จบครับ
ขอบคุณมากๆครับ เดี๋ยวผมลองทดสอบอีกครั้งครับ

Re: เรียนสอบถาม Excel Macro สามารถตรวจสอบโปรแกรม cmd.exe ว่ามีการปิดไปหรือยัง ได้อย่างไรครับ

Posted: Wed Oct 06, 2021 10:39 am
by Weravong
เรียน คุณ snasui ที่เคารพ ได้แล้วครับ สุดยอดมากครับ (**ถ้าใช้งานได้ดีแบบนี้ ผมก็สามารถนำไปประยุกษ์ใช้งานของ excel เพื่อเรียกใช้โปรแกรมอื่นๆได้อย่างดีเลยครับ และเมื่อ program อื่นทำงานเรียบร้อยเราก็จะไปดึงค่ามาใช้งานได้อย่างถูกต้องแม่นยำมากกว่าวิธีการตั้งเวลามากๆเลยครับ)
ขอขอบคุณเป็นอย่างสูงครับ

Code: Select all

Sub Run_All()
    Call Sent_IP_Input_PW1  --------------เรียกใช้งาน cmd 
Do While IsProcessRunning("CMD.EXE")
    Application.Wait Now() + TimeValue("0:00:03")
Loop
Call Get_Log_PW1           --------------- ไปดึงค่า log จากการ run cmd เสร็จมาไว้ใน excel เพื่อประมวลผลต่างๆ
End Sub