在VBA中使用Windows SHELL命令


想要文件關閉的時候進行備份?想要把DOS命令加入到日常中的應用中來?沒問題,用SHELL就行了。

例如,你前台一啟動的時候就自動建立虛擬盤,可以在LOAD事件里加入:

Shell "subst X: D:\ushare\FILE"

這樣就可以在文件打開的時候自動把D:\ushare\FILE映射成X盤,有利於文件分發。

同理,也可以加入其它的如XCOPY命令來備份。當然,你要是把DOS命令做成一個BAT文件執行,用SHEEL "PATH",1 來執行。SHEEL語句后面的那個1的意思如下:

常數                  值                    描述
vbHide           0         窗口是隱藏的,並且焦點被傳遞給隱藏窗口。
vbNormalFocus       1         窗口擁有焦點,並且恢復到原來的大小與位置。
vbMinimizedFocus     2         窗口縮小為圖符並擁有焦點。
vbMaximizedFocus     3         窗口最大化並擁有焦點。
vbNormalNoFocus      4         窗口被恢復到最近一次的大小與位置,當前活動窗口仍為活動窗口。
vbMinimizedNoFocus    6         窗口縮小為圖符,當前活動窗口仍為活動窗口。

示例1,將文件從text.txt和text_text.txt,從D盤復制到E盤中,如下:

Sub test()
    Dim retval
    retval = Shell("XCOPY D:\test.txt E:\", 0)
    MsgBox retval
End Sub

Sub test1()
    Dim doscmd
    doscmd = "XCOPY D:\test_test.txt E:\"
    Shell doscmd, 0
End Sub

示例2,在window系統中,通過在vba中執行BAT文件,而在BAT文件中執行R程序的方式【參考:R語言-自動批處理文件】,從而實現在vba運行R程序的目的,如下:

在vba建立過程 test2 或 test4 :

Sub test2()
    Dim dosCmdPath, retval
    dosCmdPath = "D:\abdata\vbaR\DosCmdR.bat"
    retval = Shell(dosCmdPath, 0)
    MsgBox retval
End Sub


Sub test4()
    '用 wsscript.shell 方法去調用 .bat
    '就一定會等bat運行完畢才進入下一行VBA
    Dim WSH As Object
    Dim wExec As Object
    Dim RunResult
    Set WSH = CreateObject("WScript.Shell")
    Set wExec = WSH.Exec("D:\abdata\vbaR\DosCmdR.bat")
    RunResult = wExec.StdOut.ReadAll '這個是運行結果的DOS屏幕輸出
    Application.Wait (Now + TimeValue("0:00:05"))
    MsgBox RunResult
    Set WSH = Nothing
    Set wExec = Nothing
End Sub

在 "D:\abdata\vbaR" 路徑中,建立DosCmdR.bat文件,如下:

cd C:\Program Files\R\R-3.3.3\bin
Rscript D:\abdata\vbaR\test.R

在 "D:\abdata\vbaR" 路徑中,建立test.R文件,如下:

get_time_human <- function() {
  format(Sys.time(), "%Y%m%d_%H%M%OS")
}
a <- 1
b <- 2
print(a)
print(b+a)
filePath <- paste('D:/abdata/vbaR/test', '_', get_time_human(), '_', '.csv', sep='')
Sys.sleep(5)
write.csv(a,file=filePath)

類模塊名稱:VBA中調取R程序【vbaR】

Option Explicit

'===============================================================
'oRunDos1  | (vba 運行 dos 命令,dos命令調取R程序)
'***************************************************
'參數說明:
'oPath | .bat文件路徑
'***************************************************
'示例:
'oPath | D:\abdata\vbaR\DosCmdR.bat
'***************************************************
'
Public Function oRunDos1(ByVal oPath)
    Dim dosCmdPath, retval
    dosCmdPath = oPath
    retval = Shell(dosCmdPath, 0)
    ' MsgBox retval
End Function


'===============================================================
'oRunDos2 | (vba 運行 dos 命令,dos命令調取R程序)
'***************************************************
'參數說明:
'oPath | .bat文件路徑
'***************************************************
'示例:
'oPath | D:\abdata\vbaR\DosCmdR.bat
'***************************************************
'
Public Function oRunDos2(ByVal oPath)
    '用 wsscript.shell 方法去調用 .bat
    '就一定會等bat運行完畢才進入下一行VBA
    Dim WSH As Object
    Dim wExec As Object
    Dim RunResult
    Set WSH = CreateObject("WScript.Shell")
    Set wExec = WSH.Exec(oPath)
    RunResult = wExec.StdOut.ReadAll ' 這個是運行結果的DOS屏幕輸出
    Application.Wait (Now + TimeValue("0:00:05"))
    'MsgBox RunResult
    Set WSH = Nothing
    Set wExec = Nothing
End Function


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM