Về cơ bản macro Excel sẽ thao tác trên Excel, đây là chức năng chính. Tuy nhiên, cũng có trường hợp chúng ta muốn thao tác với các ứng dụng ngoài Excel chẳng hạn như NotePad. Bài viết này tôi sẽ giới thiệu với các bạn điều đó.
1. Sử dụng hàm Shell để khởi động ứng dụng khác (Application)
Cách đơn giản nhất để khởi động ứng dụng khác đó là sử dụng hàm Shell.
Chương trình Notepad ở đây là notepad.exe , thường được lưu ở C:\Windows\System32 .
Đây là thiết định mặc định của Window cho nên chỉ cần nêu tên ứng dụng notepad.exe là hàm Shell có thể khởi động được nó.
Tham số thứ hai trong code trên là vbNormalFocus . Nó có nghĩa như sau:
Ứng dụng NotePad sẽ được hiển thị tại vị trí trên cửa sổ Window và kích thước vốn có từ trước tới nay.
Mặt khác, hàm Shell nếu khởi động thành công ứng dụng khác, trong OS (hệ điều hành) sẽ được trả về trị số Task ID. Trị số Task ID này mỗi lần sẽ xuất hiện các giá trị khác nhau nhưng nếu thất bại thì trị số này sẽ là 0.
Thao tác với NotePad bằng VBA thông qua hàm Shell là việc khó. Các bạn có thể sử dụng hàm SendKeys để ra mệnh lệnh từ VBA ghi nội dung lên NotePad. Ví dụ:
Kết quả:
Trước khi hàm Shell được gọi để khởi động NotePad thì macro thực hiện copy data trong ActiveCell.
Sau khi NotePad được khởi động, bằng hàm SendKey chúng ta gửi Key Code là "%EP ". Điều này tương đương với thao tác bằng tay đó là bạn vừa ấn phím ALT vừa ấn phím E, tiếp theo ấn phím P.
Tóm lại nó tương đương với việc bạn vào Menu Edit và chọn Paste.
Tuy nhiên tùy từng điều kiện mà code trên cũng có thể thất bại. Hàm Shell sẽ khởi động NotePad nhưng VBA không thể phán đoán được việc khởi động này đã kết thúc thành công hay không. Trước khi việc mở NotePad thành công, câu lệnh SendKeys được thực thi sẽ dẫn tới là Excel (không phải NotePad) sẽ nhận được Key Code là "%EP ".
Do tốc độ CPU, do bộ nhớ RAM còn nhiều hay ít, thời gian khởi động ứng dụng khác sẽ khác nhau. Vì vậy code trên cũng có trường hợp thất bại là vì thế.
2. Khởi động ứng dụng có liên quan tới File.
Khi chúng ta double click vào icon của một file (ví dụ file pdf), ứng dụng đó mở nó sẽ được mở ra (ví dụ foxit reader).
Đây là vì Windows quản lý mối liên quan giữa Application và phần mở rộng của File.
Chúng ta dựa vào đặc điểm này để sử dụng WSH(Windows Script Host) mở ứng dụng khác rất đơn giản.
Ví dụ dưới đây, chúng ta sẽ thấy điều này:
Phương thức Run sẽ mở file có đường dẫn mà bạn truyền vào. Ứng dụng liên quan tới phần mở rộng JPG sẽ được kích hoạt mở ra.
Tham số thứ nhất chúng ta phải chỉ định đường dẫn file cho phương thức RUN.
Tham số thứ ba nếu được chỉ định, nó sẽ có giá trị True/False trong việc phán đoán quá trình thực thi Program đã kết thúc hay chưa.
Ở code trên ta đã giản lược không dùng tham số thứ ba.
Ví dụ này, chúng ta sẽ mở 3 file pdf.
Trong ví dụ tiếp theo, ta sẽ chỉ định cho tham số thứ ba là True. Khi file pdf thứ nhất kết thúc, thì file pdf thứ hai được mở, quá trình mở kết thúc thì file thứ 3 sẽ được mở.
Ngoài ra, khi chúng ta chỉ định tham số thứ 3 của phương thức RUN là TRUE, chúng ta cũng có thể lấy giá trị trả về của Program.
Ở ví dụ 6, chúng ta sẽ thực thi một file .bat, sau đó tiến hành phán đoán quá trình thực thi đó đã hoàn thành hay chưa.
Nguồn:
Ở bài dịch trên chúng tôi chưa thấy nhắc tới tham số thứ hai: các số 5,7 trong các ví dụ trên có ý nghĩa gì? Chúng tôi chưa có thời gian tìm hiểu. Nếu bạn đọc biết, xin hãy phản hồi bổ sung giúp chúng tôi trong topic này. Chân thành cảm ơn.
1. Sử dụng hàm Shell để khởi động ứng dụng khác (Application)
Cách đơn giản nhất để khởi động ứng dụng khác đó là sử dụng hàm Shell.
Mã:
Sub Sample1()
Dim rc As Long
rc = Shell("notepad.exe", vbNormalFocus)
If rc = 0 Then MsgBox "Viec khoi dong that bai"
End Sub
Bạn cần đăng nhập để thấy đính kèm
Chương trình Notepad ở đây là notepad.exe , thường được lưu ở C:\Windows\System32 .
Đây là thiết định mặc định của Window cho nên chỉ cần nêu tên ứng dụng notepad.exe là hàm Shell có thể khởi động được nó.
Tham số thứ hai trong code trên là vbNormalFocus . Nó có nghĩa như sau:
Ứng dụng NotePad sẽ được hiển thị tại vị trí trên cửa sổ Window và kích thước vốn có từ trước tới nay.
Mặt khác, hàm Shell nếu khởi động thành công ứng dụng khác, trong OS (hệ điều hành) sẽ được trả về trị số Task ID. Trị số Task ID này mỗi lần sẽ xuất hiện các giá trị khác nhau nhưng nếu thất bại thì trị số này sẽ là 0.
Thao tác với NotePad bằng VBA thông qua hàm Shell là việc khó. Các bạn có thể sử dụng hàm SendKeys để ra mệnh lệnh từ VBA ghi nội dung lên NotePad. Ví dụ:
Mã:
Sub Sample2()
Dim rc As Long
ActiveCell.Copy
rc = Shell("notepad.exe", vbNormalFocus)
If rc <> 0 Then
Application.SendKeys "%EP", True
Else
MsgBox "Khoi dong that bai"
End If
End Sub
Bạn cần đăng nhập để thấy đính kèm
Trước khi hàm Shell được gọi để khởi động NotePad thì macro thực hiện copy data trong ActiveCell.
Sau khi NotePad được khởi động, bằng hàm SendKey chúng ta gửi Key Code là "%EP ". Điều này tương đương với thao tác bằng tay đó là bạn vừa ấn phím ALT vừa ấn phím E, tiếp theo ấn phím P.
Tóm lại nó tương đương với việc bạn vào Menu Edit và chọn Paste.
Tuy nhiên tùy từng điều kiện mà code trên cũng có thể thất bại. Hàm Shell sẽ khởi động NotePad nhưng VBA không thể phán đoán được việc khởi động này đã kết thúc thành công hay không. Trước khi việc mở NotePad thành công, câu lệnh SendKeys được thực thi sẽ dẫn tới là Excel (không phải NotePad) sẽ nhận được Key Code là "%EP ".
Do tốc độ CPU, do bộ nhớ RAM còn nhiều hay ít, thời gian khởi động ứng dụng khác sẽ khác nhau. Vì vậy code trên cũng có trường hợp thất bại là vì thế.
2. Khởi động ứng dụng có liên quan tới File.
Khi chúng ta double click vào icon của một file (ví dụ file pdf), ứng dụng đó mở nó sẽ được mở ra (ví dụ foxit reader).
Đây là vì Windows quản lý mối liên quan giữa Application và phần mở rộng của File.
Chúng ta dựa vào đặc điểm này để sử dụng WSH(Windows Script Host) mở ứng dụng khác rất đơn giản.
Ví dụ dưới đây, chúng ta sẽ thấy điều này:
Mã:
Sub Sample3()
With CreateObject("Wscript.Shell")
.Run "C:\Data\Image.JPG", 5
End With
End Sub
Tham số thứ nhất chúng ta phải chỉ định đường dẫn file cho phương thức RUN.
Tham số thứ ba nếu được chỉ định, nó sẽ có giá trị True/False trong việc phán đoán quá trình thực thi Program đã kết thúc hay chưa.
Ở code trên ta đã giản lược không dùng tham số thứ ba.
Ví dụ này, chúng ta sẽ mở 3 file pdf.
Mã:
Sub Sample4()
With CreateObject("Wscript.Shell")
.Run "C:\Data\Sample1.pdf", 5
.Run "C:\Data\Sample2.pdf", 5
.Run "C:\Data\Sample3.pdf", 5
End With
End Sub
Mã:
Sub Sample5()
With CreateObject("Wscript.Shell")
.Run "C:\Data\Sample1.pdf", 5, True
.Run "C:\Data\Sample2.pdf", 5, True
.Run "C:\Data\Sample3.pdf", 5, True
End With
End Sub
Ở ví dụ 6, chúng ta sẽ thực thi một file .bat, sau đó tiến hành phán đoán quá trình thực thi đó đã hoàn thành hay chưa.
Mã:
Sub Sample6()
Dim ret As Long
With CreateObject("Wscript.Shell")
ret = .Run("C:\Data\DailyTask.bat", 7, True)
End With
If ret <> 0 Then MsgBox "That bai": Exit Sub 'Thất bại
'Xử lý khác
End Sub
Bạn cần đăng nhập để thấy link
Ở bài dịch trên chúng tôi chưa thấy nhắc tới tham số thứ hai: các số 5,7 trong các ví dụ trên có ý nghĩa gì? Chúng tôi chưa có thời gian tìm hiểu. Nếu bạn đọc biết, xin hãy phản hồi bổ sung giúp chúng tôi trong topic này. Chân thành cảm ơn.