Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何从批处理文件调用VBA函数_Windows_Vba_Excel_Batch File_Cmd - Fatal编程技术网

Windows 如何从批处理文件调用VBA函数

Windows 如何从批处理文件调用VBA函数,windows,vba,excel,batch-file,cmd,Windows,Vba,Excel,Batch File,Cmd,我有一个.bat文件,在cmd中输入日期后执行一些代码: test.bat包含: - set /P PWeekday=asofdate: 因为我总是进入前一个工作日,所以我想写一些代码来实现这一点。但是,我发现作为批处理脚本的一部分很难做到这一点,因此我了解到在excel中创建宏并将值传递到命令行以便批处理脚本运行要容易得多。所以我就这么做了: VBA中的PWeekday函数 Public Function PWeekday() As String Dim offset Day As In

我有一个.bat文件,在cmd中输入日期后执行一些代码:

test.bat包含:

 - set /P PWeekday=asofdate:
因为我总是进入前一个工作日,所以我想写一些代码来实现这一点。但是,我发现作为批处理脚本的一部分很难做到这一点,因此我了解到在excel中创建宏并将值传递到命令行以便批处理脚本运行要容易得多。所以我就这么做了:

VBA中的PWeekday函数

Public Function PWeekday() As String

Dim offset Day As Integer

If Weekday(Date) = 1 Then ' Monday

  offsetDay = 3

End If

PWeekDay = Format(Date - offsetDay, "YYYYMMDD")

End Function
问题:

 - set /P PWeekday=asofdate:
我必须向批处理文件添加什么,以便在运行批处理文件时,它使用vba函数中的Pweekday值,而不是用户输入


非常感谢,任何帮助或建议都将不胜感激。

我同意VBA通常是构建此类自定义函数的一个更简单的工具,但正如其他人所指出的,运行该函数需要Excel或其他VBA程序的开销。这是可能的,但在这种情况下,对于您的潜在需求来说,这可能是过分的

虽然VBScript缺少VBA的nice
Format()
函数,但您可以编写一些非常类似的东西,在VBScript中运行,并使用
Echo
函数将返回输出回批处理文件。您将看到,为了在VBScript中运行它,我只需对函数进行很少的更改

Dim offsetDay
Dim returnDate

If Weekday(Date) = 1 Then ' Monday

  offsetDay = 3

End If

returnDate = Date - offsetDay

' Build return format with leading zeros
WScript.Echo DatePart("yyyy", returnDate) & _
    Right("0" & DatePart("m", returnDate),2) & _
    Right("0" & DatePart("d", returnDate),2)
要测试它,可以双击VBScript文件并在消息框中看到返回。当您从批处理文件调用它时,它会将结果输出到批处理程序中

以下是一些链接,帮助您开始从批处理文件调用VBScript: 及


希望有帮助

我同意VBA通常是构建这类自定义函数的一个更简单的工具,但正如其他人所指出的,它需要Excel或其他VBA程序的开销来运行函数。这是可能的,但在这种情况下,对于您的潜在需求来说,这可能是过分的

虽然VBScript缺少VBA的nice
Format()
函数,但您可以编写一些非常类似的东西,在VBScript中运行,并使用
Echo
函数将返回输出回批处理文件。您将看到,为了在VBScript中运行它,我只需对函数进行很少的更改

Dim offsetDay
Dim returnDate

If Weekday(Date) = 1 Then ' Monday

  offsetDay = 3

End If

returnDate = Date - offsetDay

' Build return format with leading zeros
WScript.Echo DatePart("yyyy", returnDate) & _
    Right("0" & DatePart("m", returnDate),2) & _
    Right("0" & DatePart("d", returnDate),2)
要测试它,可以双击VBScript文件并在消息框中看到返回。当您从批处理文件调用它时,它会将结果输出到批处理程序中

以下是一些链接,帮助您开始从批处理文件调用VBScript: 及


希望有帮助

虽然您可以在bat文件中执行所有这些操作,但我可以理解您为什么希望在混合脚本中执行这些操作。因此,我没有使用VBA,而是使用VBScript来获得所需的结果

VBScript代码

批处理代码


虽然你可以在你的bat文件中完成所有这些,但我可以理解为什么你想在混合脚本中完成这些。因此,我没有使用VBA,而是使用VBScript来获得所需的结果

VBScript代码

批处理代码


作为批处理脚本的一部分,前一个工作日的计算并不“非常困难”;它只是有点大:

@echo off
setlocal

REM Reference: http://www.hermetic.ch/cal_stud/jdn.htm#comp

rem Convert the Date in MM/DD/YYYY format to Julian Day Number and get the Day Of Week
for /F "tokens=1-3 delims=/" %%a in ("%date%") do (
   set /A "a=(%%a-14)/12, JDN=(1461*(%%c+4800+a))/4+(367*(%%a-2-12*a))/12-(3*((%%c+4900+a)/100))/4+%%b-32075, DOW=(JDN+1)%%7"
)
if %DOW% equ 1 set /A JDN-=3

rem Convert the Julian Day Number back to Date in YYYYMMDD format
set /A "l=JDN+68569,n=(4*l)/146097,l=l-(146097*n+3)/4,i=(4000*(l+1))/1461001,l=l-(1461*i)/4+31,j=(80*l)/2447"
set /A "dd=100+l-(2447*j)/80,l=j/11,mm=100+j+2-(12*l),yyyy=100*(n-49)+i+l"
set "PWeekDay=%yyyy%%mm:~1%%dd:~1%"
echo %PWeekDay%
%date%
变量的格式为
MM/DD/YYYY
时,这是一个简单的方法,可以正确工作。如果日期格式不同,只需相应地更改
设置/a
表达式中的
%%a
%%b
值即可。如果您希望程序以任何日期格式运行,可以对其进行轻微修改,以从
wmic
命令获取日期

注意:恐怕我对本例中使用的公式感到困惑。如果当天不是星期一,则应从当天减去一天;否则,使用的日期是同一天,而不是前一天:

if %DOW% equ 1 (set /A JDN-=3) else set /A JDN-=1

作为批处理脚本的一部分,前一个工作日的计算并不“非常困难”;它只是有点大:

@echo off
setlocal

REM Reference: http://www.hermetic.ch/cal_stud/jdn.htm#comp

rem Convert the Date in MM/DD/YYYY format to Julian Day Number and get the Day Of Week
for /F "tokens=1-3 delims=/" %%a in ("%date%") do (
   set /A "a=(%%a-14)/12, JDN=(1461*(%%c+4800+a))/4+(367*(%%a-2-12*a))/12-(3*((%%c+4900+a)/100))/4+%%b-32075, DOW=(JDN+1)%%7"
)
if %DOW% equ 1 set /A JDN-=3

rem Convert the Julian Day Number back to Date in YYYYMMDD format
set /A "l=JDN+68569,n=(4*l)/146097,l=l-(146097*n+3)/4,i=(4000*(l+1))/1461001,l=l-(1461*i)/4+31,j=(80*l)/2447"
set /A "dd=100+l-(2447*j)/80,l=j/11,mm=100+j+2-(12*l),yyyy=100*(n-49)+i+l"
set "PWeekDay=%yyyy%%mm:~1%%dd:~1%"
echo %PWeekDay%
%date%
变量的格式为
MM/DD/YYYY
时,这是一个简单的方法,可以正确工作。如果日期格式不同,只需相应地更改
设置/a
表达式中的
%%a
%%b
值即可。如果您希望程序以任何日期格式运行,可以对其进行轻微修改,以从
wmic
命令获取日期

注意:恐怕我对本例中使用的公式感到困惑。如果当天不是星期一,则应从当天减去一天;否则,使用的日期是同一天,而不是前一天:

if %DOW% equ 1 (set /A JDN-=3) else set /A JDN-=1

下面是使用PowerShell执行此操作的另一种方法。通过使用
-$weekday-2
作为偏移量,也可以处理星期日和星期一

powershell -NoProfile -Command "$weekday = (Get-Date).DayOfWeek.value__;" ^
    "$offset = -1;" ^
    "if ($weekday -lt 2) { $offset = -$weekday - 2 };" ^
    "((Get-Date).AddDays($offset)).ToString('yyyyMMdd');" >y.txt
SET /P "PWeekday=" <y.txt
powershell-NoProfile-Command“$weekday=(Get Date).DayOfWeek.value__;^
“$offset=-1;”^
“如果($weekday-lt 2){$offset=-$weekday-2};”^
“((获取日期).AddDays($offset)).ToString('yyyyMMdd');”>y.txt

设置/P“PWeekday=“

这里有另一种使用PowerShell的方法。通过使用

-$weekday-2
作为偏移量,也可以处理星期日和星期一

powershell -NoProfile -Command "$weekday = (Get-Date).DayOfWeek.value__;" ^
    "$offset = -1;" ^
    "if ($weekday -lt 2) { $offset = -$weekday - 2 };" ^
    "((Get-Date).AddDays($offset)).ToString('yyyyMMdd');" >y.txt
SET /P "PWeekday=" <y.txt
powershell-NoProfile-Command“$weekday=(Get Date).DayOfWeek.value__;^
“$offset=-1;”^
“如果($weekday-lt 2){$offset=-$weekday-2};”^
“((获取日期).AddDays($offset)).ToString('yyyyMMdd');”>y.txt

SET/P“PWeekday=”你想处理公共/银行假日还是只想普通的工作日?普通的工作日就足够了,上面的vba代码片段可以完成这项工作,但我不知道如何将其合并到批处理中。感谢您可能想考虑使用VBScript代替VBA。VBA托管在主机应用程序中;如果不加载主机AFAIK,您就不能调用任何VBA。我不确定您的意思,您能告诉我这对我目前所拥有的内容意味着什么吗?我是否必须使用我的函数创建一个.vbs文件,然后在.bat文件中指定该文件的路径?谢谢你想去吗