Java与VBA通讯实践

2023-05-16

1. DDE(动态数据交换)方式
VBA具有DDE能力,Java没有。网上搜索了一下,有几个公司开发了这方面的类库,可以使Java具有DDE能力。
(1)JavaDDE - nevaobject:
http://www.nevaobject.com/_docs/_javadde/JavaDde.pdf
(2)WinPack - jniwrapper:
http://www.jniwrapper.com/pages/winpack/overview
两个类库号称都很强,但是都要求付费,就没怎么研究。玩了一下winpack的demo,几乎所有windows的工具,如察看硬盘,网络连接,用户管理等等,都可以用它的类库使用Java语言来包装。

2. Com Dll方式
这种方法理论上可以,但是Excel文件带着dll到处跑的话,总觉得不像话。
(1)Sun ActiveX Bridge - Sun提供的方法。具体参见下面网页。
http://java.sun.com/j2se/1.4.2/docs/guide/beans/axbridge/developerguide/index.html
简要用法:
-1. Write a java bean, and use java activex bridge to create dll.
CODE:   [Copy to clipboard]
C:/Program Files/Java/j2re1.4.2/axbridge/bin>C:/j2sdk1.4.2/bin/packager -clsid {D824B185-AE3C-11D6-ABF5-00B0D07B8581} -out . -reg F:/excelvba/excelvba.jar jp.co.esm.pmt.PMTBean
-2. Write the VBA in Excel.
(2)j-integra提供了两种解决方案。
前期绑定和后期绑定。后期绑定无需知道通讯的Java对象信息,将Java对象注册给虚拟机之后(使用j-integra工具),即可在运行时动态寻找到对象。
前期绑定速度比后期绑定快,但是要在编译之前注册JVM到VB工程。
前期绑定方法: http://j-integra.intrinsyc.com/support/com/doc/javafromcom/vb2javaeb.html
后期绑定方法: http://j-integra.intrinsyc.com/support/com/doc/javafromcom/vb2javalb.html
(3)微软的工具Microsoft SDK for Java
不过由于微软和sun的官司,在微软网站上已经无法下载这个工具了。
HomePage: http://www.microsoft.com/mscorp/java


3. Socket 通信
利用Socket通信,Java作为服务器端,VBA作为客户端。这种情况下,是不是java都没有关系了。
Java服务器端程序比较好写。关键是VBA客户端。
(1)使用Wsock控件当然是最简单的,但是我们的代码不能出现窗口,也就不能使用Wsock。而且我电脑上莫名其妙的不能使用Wsock,原因是未得到认证。不知为何。
(2)BASP21.DLL Socket Object:用这个Dll可以替代Wsock控件。但是最好不使用Dll。
http://www.hi-ho.ne.jp/babaq/eng/basp21s.html
(3)CSocketMaster 1.2 & CSocketPlus 1.1
VB模块,全代码,非控件,将模块导入VBA中即可。而且有详尽的例子,在VB上运行的非常好。但是在VBA中,导致Excel频频Crash,百思不得其解,不知为何。
比如其中有段代码:
CODE:   [Copy to clipboard]
Const MOD_VBA5 As String = "vba5"                           'Location of the EbMode function if running VB5
Const MOD_VBA6 As String = "vba6"                           'Location of the EbMode function if running VB6
  If Subclass_InIDE Then
    'Patch the jmp (EB0E) with two nop's (90) enabling the IDE breakpoint/stop checking code
    Call api_CopyMemory(ByVal nAddrSubclass + 12, &H9090, 2)
   
    i = Subclass_AddrFunc(MOD_VBA6, FUNC_EBM)               'Get the address of EbMode in vba6.dll
    If i = 0 Then                                           'Found?
      i = Subclass_AddrFunc(MOD_VBA5, FUNC_EBM)             'VB5 perhaps, try vba5.dll
    End If

    Debug.Assert i                                          'Ensure the EbMode function was found
    Call Subclass_PatchRel(PATCH_01, i)                     'Patch the relative address to the EbMode api function
不知道这个EbMode干吗用的,MSDN上也查不到有价值的东西。如果注释掉这段代码,会导致VB崩溃。

http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=54681&lngWId=1
(4)CSocket class - replacement for the MS Winsock Control
翻了一个晚上,终于找到了这个Module, 上面提到的CSocketMaster 也是根据这个改编的。
在VBA上使用了一下这个Module,比较流畅。
主页: http://www.vbip.com/winsock-api/csocket-class/csocket-class-01.asp
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java与VBA通讯实践 的相关文章

  • 插入行而不选择任何内容?

    我正在使用 VBA 希望在特定位置插入一行而不选择它 我遇到的问题是 选择该行后 当脚本运行完毕时 电子表格会向下滚动到该行 我希望能够在不将电子表格向下滚动到插入行的情况下执行此操作 Rows i i Select ActiveCell
  • ListView:防止视图回收

    我有一个使用回收视图的 ListView 我试图阻止视图被回收 所以我使用 setHasTransientState android support v4 view ViewCompatJB setHasTransientState Vie
  • 使用 Eclipse 将具有外部依赖项的 Java 项目导出到 jar

    有没有一种简单的方法可以将 Java 项目 包括其所有外部依赖项 导出到标准 jar 文件 我开发了一个使用多个 Apache 库的 SDK 我希望能够将该项目作为单个 jar 发布 到目前为止我找到的这个问题的答案要求将项目打包为 Run
  • 最终字段可能尚未/已经初始化[重复]

    这个问题在这里已经有答案了 可能的重复 如何处理抛出检查异常的静态最终字段初始值设定项 https stackoverflow com questions 1866770 how to handle a static final field
  • APNS(Apple 推送通知服务器)的反馈服务

    我们正在使用Java作为推送通知提供商APNS I我能够将消息发送到APNS但我不知道如何获得该消息的反馈 请帮忙 反馈服务具有类似于用于发送推送通知的接口的二进制接口 您可以通过以下方式访问生产反馈服务feedback push appl
  • 按位运算符简单地翻转整数中的所有位?

    我必须翻转整数的二进制表示形式中的所有位 鉴于 10101 输出应该是 01010 当与整数一起使用时 完成此操作的按位运算符是什么 例如 如果我正在编写类似的方法int flipBits int n 什么会进入身体 我只需要翻转数字中已经
  • 如果主引用指向 null,WeakReference 或 SoftReference 有何不同

    我正在读关于WeakReference https docs oracle com javase 10 docs api java lang ref WeakReference html and SoftReference https do
  • 如何停止使用扫描仪从标准输入读取多行?

    我正在做一个 JAVA 作业 应该处理多行输入 指令显示 输入是从标准输入读取的 给出了示例输入的示例 one 1 two 2 three 3 我不明白上面的示例输入 从标准输入读取 是什么意思 这是我编写的一个测试程序 它可以消除我的困惑
  • 如何添加 Java 正则表达式实现中缺少的功能?

    我是 Java 新手 作为一名 Net 开发人员 我非常习惯Regex Net 中的类 Java 实现Regex 正则表达式 还不错 但它缺少一些关键功能 我想为 Java 创建自己的帮助器类 但我想也许已经有一个可用的了 那么 是否有任何
  • AWS SDK 2 承担角色

    Bean public DynamoDbClient amazonDynamoDB final AssumeRoleRequest assumeRoleRequest AssumeRoleRequest builder roleSessio
  • Java - toString 到 Color

    我一整天都在努力解决这个问题 基本上我做了一个 for 循环 将条目添加到数组列表中 其中一项是 颜色 变量 我已经用过random nextInt为颜色构造函数的红色 绿色和蓝色部分创建新值 我还设置了一个toString方法 这样我就可
  • 使用 Hibernate Criteria 过滤 Map 中的键和值

    我有以下持久类 public class Code ElementCollection targetClass CodeValue class MapKeyClass CodeProperty class JoinTable name co
  • java数学中的组合“N选择R”?

    java库中是否有内置方法可以为任何N R计算 N选择R 公式 实际上很容易计算N choose K甚至不需要计算阶乘 我们知道 公式为 N choose K is N N K K 因此 公式为 N choose K 1 is N N N
  • 如何构建和使用 TimeSeriesCollections

    我想在图表的 X 轴上显示一些日期 并且here https stackoverflow com questions 5118684 jfreechart histogram with dates据说我必须使用 TimeSeriesColl
  • Java 中通用方法参数的 getClass()

    以下 Java 方法无法编译
  • 如何加载图像文件到ImageView?

    我试图在从文件选择器中选择图像文件后立即显示该图像文件 文件选择器仅限于 png 和 jpg 文件 所选文件存储在文件类型的变量中 为此 我设置了一个 ImageView 我希望用这个新文件设置图像 唯一的问题是它的类型是文件而不是图像 如
  • java中的第三个布尔状态是什么?

    虽然我知道根据定义 布尔值仅包含两种状态 真或假 我想知道布尔值在用这些状态之一初始化之前有什么值 它默认为 false http java sun com docs books tutorial java nutsandbolts dat
  • 了解从 MsgBox 返回的响应代码

    我对编程很陌生 我刚刚开始学习 VBA 和 Excel 我在这个网站上遇到并做了这里的例子 但我对这段代码有疑问 我知道变量是使用 Dim 语句声明的 Message 这里是数据类型为整数的变量 我不太明白的是 这里的 6 和 7 是什么意
  • while循环只执行一次

    我很难弄清楚为什么 while 循环实际上不会循环 它运行一次并停止 import java util public class mileskm public static void main String args Scanner inp
  • Swing:创建可拖动组件...?

    我在网上搜索了可拖动 Swing 组件的示例 但我发现示例不完整或不起作用 我需要的是一个摇摆组件那可以是dragged通过鼠标 在另一个组件内 被拖拽的时候 应该已经 改变它的位置 而不仅仅是 跳 到目的地 我很欣赏无需非标准 API 即

随机推荐