Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ByRef参数类型不匹配Excel VBA_Excel_Vba_Excel 2010 - Fatal编程技术网

ByRef参数类型不匹配Excel VBA

ByRef参数类型不匹配Excel VBA,excel,vba,excel-2010,Excel,Vba,Excel 2010,我使用的是Windows7,Excel2010,VBA。我犯了一个错误 ByRef参数类型不匹配。我假设这是我的变量类型的问题。我发现了很多像我这样的问题,但我找不到任何有助于我解决问题的东西 变量声明 'Force explicit variable declaration Option Explicit Private dptData(8) As String Private TSdata(8) As String Private fiscalYear(8) As String 调用函数

我使用的是Windows7,Excel2010,VBA。我犯了一个错误 ByRef参数类型不匹配。我假设这是我的变量类型的问题。我发现了很多像我这样的问题,但我找不到任何有助于我解决问题的东西

变量声明

'Force explicit variable declaration
Option Explicit
Private dptData(8) As String
Private TSdata(8) As String
Private fiscalYear(8) As String
调用函数

parseUserData fiscalYear, dptData, TSdata
被调用函数原型

Function parseUserData(fiscalYear As String, dptDataAs String, TSdata As String)
您正在将数组传递给字符串。将函数的签名改为接受变量

字符串参数只能接受字符串参数1。另一方面,Variant可以接受任何东西,包括数组,但是您需要声明您正在处理一个数组,这样您就可以停止执行并防止出现错误(如果不是这样的话)

为什么在类型化数组上使用变量? 使用类型化数组可以工作,但不能从变量参数强制类型化数组-这意味着:

Public Sub DoSomething(ByRef args() As String)
…无法使用此完全有效的字符串数组调用:

DoSomething Array("string1", "string2", "string3") ' can't pass a variant array!
将签名更改为DoSomethingByRef args As Variant可使其正常工作。您所需要做的就是对变量数组参数使用一个有意义的、描述性的、复数的名称,以便在调用该过程时显示IntelliSense时,该名称告诉您需要知道的一切

但是……”“变种”是邪恶的! 与许多其他语言一样,VBA中的类型安全性本质上是冒烟和镜像。变体是一个非常强大的工具,确实有它的用途——尽可能避免它并不意味着放弃它的存在。使用它在过程之间传递数组引用不会损害代码的可读性、可维护性或稳定性。Variant支持duck类型和后期绑定,并且是合法的COM类型

这是一把锤子。只要确保不是每件事都变成钉子,你就会做得很好

1VBA会将其他值类型隐式转换为字符串,但不能将数组强制转换为字符串(隐式或显式)。

您正在将数组传递给字符串。将函数的签名改为接受变量

字符串参数只能接受字符串参数1。另一方面,Variant可以接受任何东西,包括数组,但是您需要声明您正在处理一个数组,这样您就可以停止执行并防止出现错误(如果不是这样的话)

为什么在类型化数组上使用变量? 使用类型化数组可以工作,但不能从变量参数强制类型化数组-这意味着:

Public Sub DoSomething(ByRef args() As String)
…无法使用此完全有效的字符串数组调用:

DoSomething Array("string1", "string2", "string3") ' can't pass a variant array!
将签名更改为DoSomethingByRef args As Variant可使其正常工作。您所需要做的就是对变量数组参数使用一个有意义的、描述性的、复数的名称,以便在调用该过程时显示IntelliSense时,该名称告诉您需要知道的一切

但是……”“变种”是邪恶的! 与许多其他语言一样,VBA中的类型安全性本质上是冒烟和镜像。变体是一个非常强大的工具,确实有它的用途——尽可能避免它并不意味着放弃它的存在。使用它在过程之间传递数组引用不会损害代码的可读性、可维护性或稳定性。Variant支持duck类型和后期绑定,并且是合法的COM类型

这是一把锤子。只要确保不是每件事都变成钉子,你就会做得很好


1VBA将隐式地将其他值类型转换为字符串,但不能将数组强制转换为字符串(隐式或显式)。

看来您毕竟想要一个字符串数组,但值得一提的是,您可以声明一个固定宽度的字符串变量

Dim dptData As String * 8

dptData = "abc"
Debug.Print Len(dptData) & "|" & dptData & "|"
'result from Immediate window
'8|abc     |

dptData = "abcdefghijk"
Debug.Print Len(dptData) & "|" & dptData & "|"
'result from Immediate window
'8|abcdefgh|

看起来您毕竟想要一个字符串数组,但值得一提的是,您可以声明一个固定宽度的字符串变量

Dim dptData As String * 8

dptData = "abc"
Debug.Print Len(dptData) & "|" & dptData & "|"
'result from Immediate window
'8|abc     |

dptData = "abcdefghijk"
Debug.Print Len(dptData) & "|" & dptData & "|"
'result from Immediate window
'8|abcdefgh|

您定义了字符串数组。所以,您需要在函数输入参数中添加ByRef语句。我有这个语句,但我把它去掉了。在这两种情况下,byref都不起作用。请阅读以下内容:字符串数组和just string是不同的。X8AS字符串可以是1,2,…8,但XAS字符串仅为1。@MaciejLos这是一个好的、重要的读数,但不是这里的错误原因。它的字符串数组作为参数而不是字符串传递。您定义了字符串数组。所以,您需要在函数输入参数中添加ByRef语句。我有这个语句,但我把它去掉了。在这两种情况下,byref都不起作用。请阅读以下内容:字符串数组和just string是不同的。X8AS字符串可以是1,2,…8,但XAS字符串仅为1。@MaciejLos这是一个好的、重要的读数,但不是这里的错误原因。它的字符串数组作为参数而不是字符串传递。为什么?注意:我不是一个提问者。我看不出更改变量类型并将其作为变量传递的原因。@MaciejLos现在更清晰了吗?不。OP可以传递正确的数据类型。他没有;不需要更改数据类型。@MaciejLos当然可以。然后回到这里,问另一个问题,当他们的代码因为传递类型化数组而崩溃时
没有将其包装在变体中。VBA中的类型化数组一塌糊涂。使用变体,省去你的烦恼。我会把这张否决票当作荣誉徽章,这不是荣誉的问题。我希望你现在会更幸福。更改数据类型是一个合理的问题。为什么?注意:我不是一个提问者。我看不出更改变量类型并将其作为变量传递的原因。@MaciejLos现在更清晰了吗?不。OP可以传递正确的数据类型。他没有;不需要更改数据类型。@MaciejLos当然可以。然后回到这里,问另一个问题,当他们的代码出现故障时,因为他们在传递类型化数组,而没有将它们包装成变量。VBA中的类型化数组一塌糊涂。使用变体,省去你的烦恼。我会把这张否决票当作荣誉徽章,这不是荣誉的问题。我希望你现在会更幸福。这是改变数据类型的原因。你的意思是连接我的字符串数组吗?不,我的意思是如果你真的想要一个字符串变量被截断为8个字符,那么这就是方法。我并不是说这在您的情况下是合适的,因为已经澄清了您希望使用原始问题中缺少的字符串数组。我是说,如果将来有人遇到这个问题,想要创建一个只有8个字符长的字符串变量,这就是方法。你是说连接我的字符串数组吗?不,我是说如果你真的想要一个字符串变量被截断为8个字符,那么这就是方法。我并不是说这在您的情况下是合适的,因为已经澄清了您希望使用原始问题中缺少的字符串数组。我的意思是,如果将来有人遇到这个问题,想要创建一个只有8个字符长的字符串变量,那么就是这样做的。