繁体   English   中英

VB.net中的整数在VBA中变成字符串

[英]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_2Row_3等方式暴露给VBA。因此,以下代码应该可以实现您所期望的:

DB.Row_2(DB.Keys(i))

这种对声明顺序的隐式依赖性极有可能出错。 因此,我建议

  • 如果方法是从VBA调用的,则为其指定唯一的名称,
  • 或者,如果要保留.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM