[英]Integer in VB.net turns into String in VBA
我有一个表中的“键”的对象列表-键只是第一列中的项。 它们可以是Integers或Strings,具体取决于我们从哪个DB表中读取数据。 由于我们经常使用它们,因此我们将该列缓存在称为“键”的ArrayList中。
我们编写了Cover方法来返回Row,一个使用字符串,另一个使用整数。 如果调用整数版本,则仅按索引返回该行。 如果调用该字符串,它将在“键”下查找匹配项,并使用该索引提取该行。
好的,现在我将键传递给Excel,将其中一个循环拉出,然后问它是什么...
TypeName(DB.Keys(i))
然后对象返回...
Long
太好了,键必须是整数! 因此,现在我将尝试通过调用访问器方法Row来获取该键的行。
DB.Row(DB.Keys(i))
并调用采用String的版本。
哇!
谁能想到VBA回呼到我们的VB.net DLL最终导致调用错误的访问器的原因吗?
添加的代码:我不知道如何将代码作为回复,因此我正在对此进行编辑。 这是VB.net类中的代码:
Public Function Row(ByVal K As String) As DataRow
Dim R As DtaRow = DB.Tables(0).Rows(K)
Return New DataRow(R)
End Function
Public Function Accounts(ByVal K As Integer) As DataRow
Dim R As DtaRow = DB.Tables(0).Rows(K)
Return New DataRow(R)
End Function
如果您想知道,有两种版本的Rows,它们采用字符串或整数。
此代码可从VB.net完美地工作。 您可以通过键串或行号来请求一行,这会调用正确的行,然后调用正确的行,然后得出正确的答案。
但是在VBA中,它总是使用字符串输入来调用方法。 如果我将其重命名为RowIHATEYOUALL,则可以很好地调用Integer版本。 但是当它们有两个,只是签名不同时,就没有这种运气了。
A和我(见注释)是我的错字。
互操作层不支持重载方法。 每当调用Row
,都会使用具有该名称的第一个声明的方法 。 .NET重载解析算法不适用于此处。
其他重载也以Row_2
, Row_3
等方式暴露给VBA。因此,以下代码应该可以实现您所期望的:
DB.Row_2(DB.Keys(i))
这种对声明顺序的隐式依赖性极有可能出错。 因此,我建议
或者,如果要保留.NET的“不错”的重载版本,请添加VBA的兼容性方法:
<Obsolete("Compatibility method for VBA, use Row instead.")> Public Function RowByKeyVBA(ByVal K As String) As DataRow Return Row(K) End Function <Obsolete("Compatibility method for VBA, use Row instead.")> Public Function RowByNumberVBA(ByVal K As Integer) As DataRow Return Row(K) End Function
可以在以下问题中找到更多信息:
按照Heinzi的注释(在上文中),我通过为每个调用进行三个方法签名来解决此问题,一个签名获取一个Object,然后尝试弄清楚它是什么,其他签名获取String和Integers。 正如Heinzi所指出的那样,在VB / C#/ etc中按预期调用了正确的String或Integer方法,从VBA中调用了对象版本
这会引起一个非常小的问题,即用户可能具有实际上是字符串的“数字值”。 例如,数组键可能是“ User3232”或“ 3232”,这两个键都是表中的String对象。 因此,您必须小心,仅询问是否可以将Object转换为Int32是不够的。 这不太可能影响大多数用户。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.