从VBA

时间:2015-05-29 14:04:20

标签: python excel vba excel-vba batch-file

我试图从我的VBA模块运行python脚本。我已经尝试过几乎我在互联网上看过的所有例子,因为没有运气。 在VBA模块中,我还运行一个.bat文件,它运行正常:

batchname = "U:\Backup Bat File.bat"

Shell batchname, vbNormalFocus

接下来我需要运行python脚本,它与excel文件位于同一个文件夹中。 现在我正在尝试这个:

Dim Ret_Val

Dim args

args=Activeworkbook.Path & "\beps_output.py"

Ret_Val = Shell("C:\python34\python.exe" & args, vbNormalFocus)

它没有错误,但没有任何反应。我对" Ret_Val"" Ret_Val" (返回值?)在这里,以及它为什么不运行。

3 个答案:

答案 0 :(得分:3)

这在我的电脑上运行(Win 7 x64,python 2.7.9):

Sub runpython()
    Dim Ret_Val
    Dim args As String

    args = "W:\programming\python\other_py\sqrt.py"
    Ret_Val = Shell("C:\Program Files (x86)\python27\python.exe" & " " & args, vbNormalFocus)
    If Ret_Val = 0 Then
       MsgBox "Couldn't run python script!", vbOKOnly
    End If
End Sub
如果调用成功,

Ret_Val将为非零,即已启动命令的processID。请注意,该命令将异步运行,即VBA代码将继续比外部命令终止更快。

答案 1 :(得分:2)

对我来说困难的部分是诊断代码的哪一部分不起作用。 cmd 窗口闪烁得如此之快,您无法阅读错误消息。只需在 Shell 语句上方添加这行代码即可。

var options = { roomName: "RoomName", width: "100%", height: 1080, parentNode: document.querySelector("#meet"), configOverwrite: { prejoinPageEnabled: false //This here }, ... ...

使用 F8 单步执行代码。

当 cmd 窗口弹出时,输入 (fullpath)python.exe 命令和 (fullpath)script file.py,就像您尝试使用代码一样。 cmd 窗口现在保持打开状态,因此您可以看到消息。

就我而言,这是一张需要完整路径的图片,而不是假设它在同一目录中。

答案 2 :(得分:1)

尝试在exe程序和文件之间添加一个空格:

[TestCase]
public void TestMethod1()
{
    AccountController ac = new AccountController();
    var mockAuthRepository = new Mock<AuthRepository>();
    //mockAuthRepository.Setup(m=>m.RegisterUser(It.IsAny<UserModel>))
}


[RoutePrefix("api/Account")]
public class AccountController : ApiController
{
private readonly AuthRepository _repo;
    public AccountController()
    {
        _repo = new AuthRepository();
    }
}

[HttpPost]
[Authorize(Users = "admin")]
[Route("Register")]
public async Task<IHttpActionResult> Register(UserModel userModel)
{
    IdentityResult result = await _repo.RegisterUser(userModel);
    IHttpActionResult errorResult = WrapError(result);
    if (errorResult != null)
    {
        return errorResult;
    }
    return Ok();
}
private IHttpActionResult WrapError(IdentityResult result)
{
    if (result == null)
    {
        return InternalServerError();
    }
    if (!result.Succeeded)
    {
        if (result.Errors != null)
        {
            foreach (string err in result.Errors)
        {
            ModelState.AddModelError("", err);
        }
    }
    if (ModelState.IsValid)
    {
        return BadRequest();
    }
    return BadRequest(ModelState);
}
return null;
}

此外,因为Shell是一个返回带有指定参数的值(变量类型 - double)的函数,所以返回的值可以包含在变量中,就像使用Ret_Val指定的那样。然后,您可以使用此值添加条件逻辑和错误处理。