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

时间:2017-10-27 14:19:42

标签: windows vba excel-vba batch-file cmd

我有一个.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

问题:

我必须添加到批处理文件中,以便在运行它时,它使用vba函数中的Pweekday值而不是我的用户输入?

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

4 个答案:

答案 0 :(得分:2)

前一个工作日的计算不是很困难"作为批处理脚本的一部分;它有点大:

@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表达式中的%%bset /A值即可。如果您希望程序以任何日期格式运行,可能会略微修改以从wmic命令获取日期。

注意:我担心这个例子中使用的公式会让我感到困惑。恕我直言,如果当天不是星期一,应该从当天减去一天;否则使用的日期是相同的日,而不是前一天:

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

答案 1 :(得分:1)

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

VBScript代码

Dim AsOfDate
If WeekDay(Date,2) = 1 Then 'WeekDay(Date,2) = 2 to ensure monday as start of week because default of vbs function is sunday
    AsOfDate=DateAdd("d",-3,Date)
Else
    AsOfDate=Date
End If
WScript.Echo DatePart("yyyy",AsOfDate,2) & DatePart("m",AsOfDate,2) & DatePart("d",AsOfDate,2) 'DatePart(xxx,AsOfDate,2) = 2 to ensure monday as start of week

批代码

for /f "delims=" %%r in ('cscript //nologo C:\Users\pankaj.jaju\Desktop\Test.vbs') do set result=%%r
echo %result%

答案 2 :(得分:0)

我同意VBA通常是构建这些自定义函数的更简单的工具,但正如其他人所指出的那样,它需要Excel或其他VBA程序的开销来运行该函数。这是可能的,但在这种情况下你的潜在需求可能有点过分。

虽然VBScript缺少VBA的良好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中运行它。

echo 'setInterval(function(){$.post(\'/refreshTheSession.php\');},90000);';

要测试它,您可以双击VBScript文件并在消息框中查看返回。当您从批处理文件中调用它时,它会将结果输出到批处理程序中。

以下是一些链接,可帮助您开始从批处理文件中调用VBScript: pass value from vbscript to batchPass variable from a vbscript to batch file

希望有所帮助!!

答案 3 :(得分:0)

以下是使用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