C++如何获取Vba中的Range对象的值

爱篮球爱IT 2019-01-16 10:18:54
背景:我在excel的某一个单元格写入了一个公式,这个公式会调用我的vba代码,vba会取出公式中参数的值,然后将这些值传入到c++中。现在我想把这个取值的过程放入c++中,也就是说vba只是提供一个接口。但是现在有一个问题,如果参数的类型是range,传入到c++中后,VARIANT的vt变成了dispatch,没有办法取出vba中range对象的值和行、列的数量。
问题:如何在c++中取出vba的range对象的值,或者说如何在c++中操作vba的range对象


Function A(cell As Variant) As Variant
A = 1
If TypeName(cell) = "Range" Then
If cell.Columns.Count = 1 Then
A = 2
End If
End If
End Function

上述代码能不能再c++中实现??麻烦各位大神指教一下
...全文
347 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
舉杯邀明月 2019-01-17
  • 打赏
  • 举报
回复
引用 4 楼 爱计算机的彭涛 的回复:
[quote=引用 3 楼 舉杯邀明月 的回复:]
vt = 9 就是表示这个Variant变量的“真实值”是个对象啊……
在这个Variant变量的第9(相对“首址”偏移量8)到第12字节,是个32位指针,
 这个指针值应该是指向range对象的指针。
不过我在VB、VBA中使用Variant变量,是不用关心“Variant变量结构”的,
(我实际很少使用Variant,都是按“真实类型”使用各种变量),
 因为对我来说,真没必要,VB/VBA的运行库会自动的解析相应接口。

我对C++不熟悉,你或许应该尝试一下,引用Excel的COM接口库,
  把那个指针值进行一下“强制类型转换”,转换成 range * 类型,
  试试能通过这个range * 类型的指针去访问range对应相应的各个成员。
老师,您好,有没有具体一点例子可以参考的?我在c++准备把VARIANT转成Excel::range指针,可是一直失败[/quote]
我没有这方面的例子,你可以自己搜索一下在C艹中操作Excel的实例来参考一下吧。

我也没明白你说的“把VARIANT转成Excel::range指针”具体是如何操作的。
反正我的意思是:
  你只能把VARIANT的成员中把“指针值”提出来转(成员数据位置我在上面已经说了);
  而不是直接转“整个VARIANT变量”(如果这样操作,岂不是得到一个“值为9”的非法指针?)。

milaoshu1020 2019-01-17
  • 打赏
  • 举报
回复
引用 4 楼 爱计算机的彭涛 的回复:
[quote=引用 3 楼 舉杯邀明月 的回复:]
vt = 9 就是表示这个Variant变量的“真实值”是个对象啊……
在这个Variant变量的第9(相对“首址”偏移量8)到第12字节,是个32位指针,
 这个指针值应该是指向range对象的指针。
不过我在VB、VBA中使用Variant变量,是不用关心“Variant变量结构”的,
(我实际很少使用Variant,都是按“真实类型”使用各种变量),
 因为对我来说,真没必要,VB/VBA的运行库会自动的解析相应接口。

我对C++不熟悉,你或许应该尝试一下,引用Excel的COM接口库,
  把那个指针值进行一下“强制类型转换”,转换成 range * 类型,
  试试能通过这个range * 类型的指针去访问range对应相应的各个成员。
老师,您好,有没有具体一点例子可以参考的?我在c++准备把VARIANT转成Excel::range指针,可是一直失败[/quote]
是C++的ATL项目吗?还是MFC?
也许可以用QueryInterface方法查询/转换类的,好像也可以通过IDispatch的invoke方法直接调用对象的方法和属性.
爱篮球爱IT 2019-01-17
  • 打赏
  • 举报
回复
引用 3 楼 舉杯邀明月 的回复:
vt = 9 就是表示这个Variant变量的“真实值”是个对象啊…… 在这个Variant变量的第9(相对“首址”偏移量8)到第12字节,是个32位指针,  这个指针值应该是指向range对象的指针。 不过我在VB、VBA中使用Variant变量,是不用关心“Variant变量结构”的, (我实际很少使用Variant,都是按“真实类型”使用各种变量),  因为对我来说,真没必要,VB/VBA的运行库会自动的解析相应接口。 我对C++不熟悉,你或许应该尝试一下,引用Excel的COM接口库,   把那个指针值进行一下“强制类型转换”,转换成 range * 类型,   试试能通过这个range * 类型的指针去访问range对应相应的各个成员。
老师,您好,有没有具体一点例子可以参考的?我在c++准备把VARIANT转成Excel::range指针,可是一直失败
爱篮球爱IT 2019-01-17
  • 打赏
  • 举报
回复
好的,谢谢各位了,已经解决了
舉杯邀明月 2019-01-17
  • 打赏
  • 举报
回复
vt = 9 就是表示这个Variant变量的“真实值”是个对象啊……
在这个Variant变量的第9(相对“首址”偏移量8)到第12字节,是个32位指针,
 这个指针值应该是指向range对象的指针。
不过我在VB、VBA中使用Variant变量,是不用关心“Variant变量结构”的,
(我实际很少使用Variant,都是按“真实类型”使用各种变量),
 因为对我来说,真没必要,VB/VBA的运行库会自动的解析相应接口。

我对C++不熟悉,你或许应该尝试一下,引用Excel的COM接口库,
  把那个指针值进行一下“强制类型转换”,转换成 range * 类型,
  试试能通过这个range * 类型的指针去访问range对应相应的各个成员。
舉杯邀明月 2019-01-16
  • 打赏
  • 举报
回复
C艹中也有VARIANT这个数据类型呀。
 不过我对这个不熟悉,也许在 C艹中读写range对象的值,需要知道range的“值结构”才行。

PS:
 在C艹中是不是可以引用Excel的TypeLib呢?
 也许这样,就可以通过直接将Variant中的对象指针直接强制转换成 *Range了,
  然后就可以通过这个指针直接访问其所有成员了。
爱篮球爱IT 2019-01-16
  • 打赏
  • 举报
回复
引用 1 楼 舉杯邀明月 的回复:
C艹中也有VARIANT这个数据类型呀。  不过我对这个不熟悉,也许在 C艹中读写range对象的值,需要知道range的“值结构”才行。 PS:  在C艹中是不是可以引用Excel的TypeLib呢?  也许这样,就可以通过直接将Variant中的对象指针直接强制转换成 *Range了,   然后就可以通过这个指针直接访问其所有成员了。
我现在想直接把vba中的range对象传到c++中去,c++是用一个VARIANT类型的变量去接收这个range对象。他的vt=9,是一个DISPATCH。有没有什么办法把这个值给他取出来了

2,462

社区成员

发帖
与我相关
我的任务
社区描述
VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。
社区管理员
  • VBA
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧