想要文件关闭的时候进行备份?想要把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程序的方式,从而实现在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



©哈尔滨商业大学 银河统计工作室