Windows 如何从批处理文件调用VBA函数
我有一个.bat文件,在cmd中输入日期后执行一些代码: test.bat包含: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
- 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文件中指定该文件的路径?谢谢你想去吗