Làm sao ẩn cửa sổ Command Prompt khi thực thi lệnh DOS trong VBA

Liên hệ QC

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,952
Để đọc kết quả của lệnh DOS, tôi dùng StdOut properties
Ví dụ: Để đọc kết quả của lệnh IPCONFIG, tôi viết code VBA như sau:
PHP:
Sub Test()
  With CreateObject("WScript.Shell")
    MsgBox .Exec("IPCONFIG").StdOut.ReadAll
  End With
End Sub
Vấn đề ở đây là khi chạy code, 1 cửa sổ Command Prompt sẽ xuất hiện (rồi biến mất) khiến cho ta có cảm giác hơi khó chịu
Xin hỏi các cao thủ: Với cách dùng code như trên, có cách nào ẩn được cửa sổ Command Prompt hay không?
Cảm ơn!
 
Em gửi ví dụ lên đã chạy tốt trên VB6 (sp6), trong VBA Office 2007 (VBA v 6.5), HĐH Vista, thấy không lỗi gì chạy rất nhanh.

Không biết anh chạy Office gì. Nếu lỗi là do logic test IF của VB bị sai, có thể họ đã fix ở sp6, VBA 6.5.

Nếu dùng vòng lặp Do để test thì viết như sau. Trên máy em chạy nhanh.
Mã:
Sub DoCommand()
  Dim lFile As Double
  On Error Resume Next
  Shell "cmd.exe /c IPCONFIG > C:\_Result.txt", vbHide
  Do
    If (Len(Dir("C:\_Result.txt")) <> 0) Then
        lFile = FileLen("C:\_Result.txt")
    End If
  Loop Until lFile <> 0
  MsgBox GetText("C:\_Result.txt")
End Sub
Code này thì đương nhiên được rồi --> Vì như tôi đã nói ở trên, FileLen() sẽ báo lỗi khi file không tồn tại, nên đàng nào thì cũng phải có On Error Resume Next ở đầu code (không có nó lỗi ngay tức khắc)
Mà không biết Tuân có nhớ xóa file _Result.txt trước khi test code không nhỉ?
----------------------------
Nhờ bạn nào đang dùng Windows XP, Office 2003 test giúp tôi với ---> Mục đích là so sánh xem code dùng Sleep và code không dùng Sleep, cái nào nhanh hơn?
Lưu ý: Trước khi test phải xóa file _Result.txt tại ổ C:\ nếu nó đang tồn tại
 
Lần chỉnh sửa cuối:
Upvote 0
Code này thì đương nhiên được rồi --> Vì như tôi đã nói ở trên, FileLen() sẽ báo lỗi khi file không tồn tại, nên đàng nào thì cũng phải có On Error Resume Next ở đầu code (không có nó lỗi ngay tức khắc)
Mà không biết Tuân có nhớ xóa file _Result.txt trước khi test code không nhỉ?
----------------------------
Nhờ bạn nào đang dùng Windows XP, Office 2003 test giúp tôi với ---> Mục đích là so sánh xem code dùng Sleep và code không dùng Sleep, cái nào nhanh hơn?
Lưu ý: Trước khi test phải xóa file _Result.txt tại ổ C:\ nếu nó đang tồn tại

Theo em thì không nên dùng Sleep. Bởi vì Sleep cố định thời gian và kiểm tra việc tạo file và ghi, có những lý do khác nhau trong quá trình máy trính vận hành mà tốc độ tạo file và ghi nhanh hay chậm, chúng không cố định thời gian. Còn dùng kiểu Do, hay Goto sẽ kiểm tra tới khi hoàn thành việc tạo file và ghi.
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Ta biết rằng lệnh TASKLIST của DOS có khả năng lấy được danh sách các process trong TaskManager. Tuy nhiên, nếu dùng theo cách thông thường thì lúc chạy code ta sẽ thấy cửa sổ Command Prompt xuất hiện gây cảm giác khó chịu
Vậy áp dụng phương pháp mà ban vbavn vừa gợi ý, tôi thực hiện code như sau:
PHP:
Private Function ProcessList()
  Dim Arr() As String, i As Long, sFilename As String
  On Error Resume Next
  With CreateObject("Scripting.FileSystemObject")
    sFilename = .GetTempName
    With CreateObject("Wscript.Shell")
      .Run "cmd /c TASKLIST /NH > " & sFilename, 0, True
    End With
    With .OpenTextFile(sFilename, 1)
      Do
        ReDim Preserve Arr(i)
        Arr(i) = Trim(Split(Trim(.Readline), "  ")(0))
        i = i + 1
      Loop Until .AtEndOfStream
      ProcessList = Arr
      .Close
    End With
    .DeleteFile sFilename
  End With
End Function
PHP:
Sub Main()
  Dim Tmp
  Tmp = ProcessList()
  With Range("A1:A1000")
    .Offset(1).Clear
    .Resize(UBound(Tmp) + 1) = WorksheetFunction.Transpose(Tmp)
    .Cells(1, 1) = "Image Name"
  End With
End Sub
Mởi xem qua file đính kèm
Ẹc... Ẹc... Lý thú ghê
 

File đính kèm

Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom