使用VBA调用jar传递参数,并获取返回值

目录

■VBA代码

■Java代码

■运行效果

Excel

Log效果 (通过VBA调用jar后,运行,生成的Log)

■课题

■课题原因(直接原因) 

●log4j的配置

■课题验证

■课题解决(其他 方式二 实现)

■另外一种方式启动执行jar (方式一:   RetVal = Shell(cmdStr))---无法获得返回值

■另外一种方式启动执行jar (方式二:WshShell对象 , Run方法)---可以获得返回值

■代码简介

WshShell对象 , Run方法,  详细介绍

■相关知识

1.Maven打包生成jar

2.log4J配置使用

3.Maven工程做成

4.使用Git,管理代码版本

■更多知识

1.Java知识整理

2.软件开发中使用单词

3.VBA操作相关内容整理


■VBA代码


Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


Private Sub CommandButton1_Click()

 
    Dim cmdStr
    cmdStr = "java -jar G:\MyTool\VBA_Jar\jar\tool.jar " & """" & ActiveSheet.Range("C4").Value & """"
      
    Set WshShell = CreateObject("WScript.Shell")
    Set oExec = WshShell.Exec(cmdStr)
     
    Dim exitCode
    exitCode = oExec.exitCode
     
    Do While exitCode = 0
        
        Sleep 3000
        exitCode = oExec.exitCode
     
    Loop
     
    Set oStdOut = oExec.StdOut
    
    MsgBox "Return value is : " & exitCode

End Sub

■Java代码

package com.sxz.tool.moveResource;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class StartProcessRun {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		String input = "";
		
		if(args.length == 1){
			input= args[0];
		}
		
		log.info("hello:" + input);
		System.exit(666);

	}

}

■运行效果

Excel

 ===

Log效果 (通过VBA调用jar后,运行,生成的Log)

■课题

当java的处理内容多时,

会一直停留在命令行窗口界面,无法获得正常的返回值。

 强制终了后,返回值是【130】

■课题原因(直接原因) 

根本原因未知

直接原因是因为使用了log4j,(换成logback也有同样的问题。)

●log4j的配置

===

https://blog.youkuaiyun.com/sxzlc/article/details/124621551

===

■课题验证

在程序开始的时候,循环出力200次log,实际结果只能出力40次。

■课题解决(其他 方式二 实现)

但是为什么这种方式不行,另外一种方式启动执行jar(方式一)(无法获得返回值),可以正常结束。

另外一种方式启动执行jar (方式一:   RetVal = Shell(cmdStr))---无法获得返回值

按钮对应的函数


Private Sub CommandButton1_Click()

    Call callJar

End Sub

定义在模块中的方法

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandel As Long, ByVal dwMilliseconds As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal blnheritHandel As Long, ByVal dwProcessld As Long) As Long

Public Sub callJar()

    Dim cmdStr
    cmdStr = "java -jar G:\MyTool\VBA_Jar\jar\tool.jar " & """" & ActiveSheet.Range("C4").Value & """"
      
    RetVal = Shell(cmdStr)
    
    processId = OpenProcess(&H100000, False, RetVal)
    r = WaitForSingleObject(processId, -1&)
    r = CloseHandle(processId)

End Sub

另外一种方式启动执行jar (方式二:WshShell对象 , Run方法)---可以获得返回值

这种方式调用,可以获得返回值

不论是是 

    cmdStr = "java -jar G:\MyTool\VBA_Jar\jar\tool.jar " & """" & ActiveSheet.Range("C4").Value & """"

还是

    cmdStr = "cmd /c java -jar G:\MyTool\VBA_Jar\jar\tool.jar " & """" & ActiveSheet.Range("C4").Value & """"

都可以获得返回值

===

Private Sub CommandButton1_Click()
 
    Dim cmdStr
    cmdStr = "java -jar G:\MyTool\VBA_Jar\jar\tool.jar " & """" & ActiveSheet.Range("C4").Value & """"
      
    Set WshShell = CreateObject("WScript.Shell")
    
    Dim endCode As Integer
    endCode = WshShell.Run(cmdStr, True, True)
     
    MsgBox endCode
 
End Sub

■代码简介

===

Run的后两个参数,一个是cmd窗口的风格,一个是是否等待执行完成。



最后一个参数很有用,
如果你希望等待本次cmd执行的程序结束后,再执行run后面的语句,
设置这个参数为true,否则后面的语句将不等待cmd窗口完成,直接运行。


另外,如果你使用exec 方法的时候,
如果希望等待cmd中程序执行完后,再执行后面的语句
需要类似下面的代码
===
    Do While exitCode = 0
        
        Sleep 3000
        exitCode = oExec.exitCode
     
    Loop
===

===

 ===

WshShell对象 , Run方法,  详细介绍

   ' 虽然第二个参数是数字,但是写True也好用,空白时,令行窗口一闪而过,True时,不显示 
   endCode = WshShell.Run(cmdStr, True, True)

===

VBS
keywords: Run方法, WshShell对象
 
object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])

【参数】
object 
WshShell 对象。 
strCommand 
表示要运行的命令行的字符串值。包括要传递到可执行文件的所有参数。 
intWindowStyle 
可选。表示程序窗口外观的整数值。
请注意,并非所有程序都使用此信息。 
bWaitOnReturn 
可选。布尔值,表示在继续执行脚本中的下一条语句之前,脚本是否等待执行完程序。
如果设为 true,则在执行完程序后才执行脚本,Run 方法返回由程序返回的任何错误代码。
如果设为 false(默认值),则 Run 方法将自动在启动程序后立即返回 0(不是错误代码)。
 
【说明】
Run 方法返回一个整数。Run 方法启动在新 Windows 进程中运行的程序。
可以让脚本等到程序执行完后再继续执行。这允许您同步运行脚本和程序。
strCommand 参数内的环境变量自动扩展。
如果某个文件类型已正确注册到某个程序中,则对该类型的文件调用 Run 方法时将执行该程序。 例如,如果您的计算机系统中装有 Word,则对 *.doc 文件调用 Run 方法时将启动 Word 并加载该文档。
【intWindowStyle 说明 】
0 隐藏一个窗口并激活另一个窗口。 
1 激活并显示窗口。如果窗口处于最小化或最大化状态,则系统将其还原到原始大小和位置。第一次显示该窗口时,应用程序应指定此标志。 
2 激活窗口并将其显示为最小化窗口。 
3 激活窗口并将其显示为最大化窗口。 
4 按最近的窗口大小和位置显示窗口。活动窗口保持活动状态。 
5 激活窗口并按当前的大小和位置显示它。 
6 最小化指定的窗口,并按照 Z 顺序激活下一个顶部窗口。 
7 将窗口显示为最小化窗口。活动窗口保持活动状态。 
8 将窗口显示为当前状态。活动窗口保持活动状态。 
9 激活并显示窗口。如果窗口处于最小化或最大化状态,则系统将其还原到原始大小和位置。还原最小化窗口时,应用程序应指定此标志。 
10 根据启动应用程序的程序状态来设置显示状态。

===

■相关知识

1.Maven打包生成jar

POM 打包 Jar,指定Main方法的类,指定使用的JDK_sun0322的博客-优快云博客_pom打包指定main

2.log4J配置使用

https://blog.youkuaiyun.com/sxzlc/article/details/124621551

3.Maven工程做成

Maven的Pom文件 ( Eclipse中创建Maven工程, 使用注意点,DevOps相关)_sun0322的博客-优快云博客_eclipse的pom文件在哪

4.使用Git,管理代码版本

Eclipse中的Git使用之Branch创建,Merge_sun0322的博客-优快云博客

■更多知识

1.Java知识整理

Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)_sun0322的博客-优快云博客

2.软件开发中使用单词

工作中使用到的单词(软件开发)_sun0322的博客-优快云博客_https://10.59.142.4/integration

3.VBA操作相关内容整理

VBA中 各种数据类型的使用(自定义数据类型Type,数组,数据字典)、读写文件_sun0322的博客-优快云博客_vba中type类型

===

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值