Arrays 在VBA函数中访问单个数组元素
我是新手。我试图将数组(它是静态的,但请同时回答动态范围问题)传递给函数。然后将单个数组元素分配给唯一变量,并在自定义公式中使用这些变量。我只是浏览了一下,写了代码,但还是得到了价值!错误。守则的要点如下:Arrays 在VBA函数中访问单个数组元素,arrays,excel,vba,function,excel-2010,Arrays,Excel,Vba,Function,Excel 2010,我是新手。我试图将数组(它是静态的,但请同时回答动态范围问题)传递给函数。然后将单个数组元素分配给唯一变量,并在自定义公式中使用这些变量。我只是浏览了一下,写了代码,但还是得到了价值!错误。守则的要点如下: Public Function mytest(ByRef arr1 As Range) Dim A As Double Dim B As Double A = arr1(0) B = arr1(1) mytest = A + B 'The actual formula is a bit
Public Function mytest(ByRef arr1 As Range)
Dim A As Double
Dim B As Double
A = arr1(0)
B = arr1(1)
mytest = A + B 'The actual formula is a bit more complicated than simple addition
End Function
我根本不知道我做错了什么。如果有人有一个解决方案,你能解释一下为什么它也有效吗。我很感激能得到的一切帮助。
非常感谢 您似乎试图将工作表范围用作基于0的数组。虽然使用范围的
Cells
属性(实际上您正试图隐式执行该属性),但这并没有真正的意义,您可以接近:
Public Function mytest(arr1 As Range)
Dim A As Double
Dim B As Double
A = arr1.Cells(1)
B = arr1.Cells(2)
mytest = A + B 'The actual formula is a bit more complicated than simple addition
End Function
在上面的代码中,您可以删除Cells()
,因为它将在这里作为默认属性,但是大多数有经验的VBA程序员喜欢明确说明他们使用的属性
这或多或少适用于一维范围,但可能不适用于二维范围<代码>单元格最多占用2个索引,一般来说,我认为当您明确了解完整索引时,代码更清晰(例如
A=arr1.Cells(1,1)
和B=arr1.Cells(2,1)
)。正如科尔曼指出的,范围不是数组,请考虑:
Public Function mytest(ByRef arr1 As Range)
Dim A As Double
Dim B As Double
A = arr1(1, 1)
B = arr1(2, 1)
mytest = A + B 'The actual formula is a bit more complicated than simple addition
End Function
注意:
- 我们将
视为类似于数组范围
- 它是二维的
- 它是以1为基础的
- 如果只处理
值,可以在函数中创建一个内部数组,直接映射到传递的范围的
范围
- 如果
是真正动态的(如溢出范围),则只需通过锚单元即可范围
- 问题不在您发布的代码中,而是在调用代码的过程中。在这里,调用过程首先将值分配给工作表中的单元格(用于测试),然后将范围传递给函数,该函数将值提取到数组中,然后使用该数组计算返回值
Private Sub TestmyTest()
Dim Rng1 As Range
Cells(1, "A").Value = 3.14
Cells(2, "A").Value = 3
Set Rng1 = Range("A1:A2")
Debug.Print myTest(Rng1)
End Sub
Function myTest(Rng1 As Range) As Double
' procedures are 'Public' unless declared as 'Private'
' Therefore only declare "Private" or nothing
' Arguments are passed ByRef unless they are declared as 'ByVal'
' Therefore I recommend to omit "ByRef"
Dim Arr As Variant
Dim A As Double
Dim B As Double
' this creates a 1-based 3-D array of 2 row and 1 column
Arr = Rng1.Value
A = Arr(1, 1)
B = Arr(2, 1)
myTest = A + B 'The actual formula is a bit more complicated than simple addition
End Function
范围不是数组。您想让函数接受工作表范围还是VBA数组,或者两者都接受?嗨,John,现在我想把工作表范围传递给函数。很抱歉给你带来了困惑。顺便说一句,我还尝试将ByRef arr1()作为Double。仍然得到了#值!错误。明确说明范围索引的基于1的本质是很好的,这会让很多程序员从类似C的语言来到VBA。谢谢John,这也很有效。这将是巨大的帮助!我想我还需要一些练习才能真正了解数组和范围之间的差异。接下来,当我使用ByRef arr1()作为Double时,我还能以同样的方式使用上面的代码吗?本质区别是什么?@anirudhkaushik你不能,
Double
=数字,数字没有坐标。当你给出一个范围时,你就给出了一个单元格数组,当你给出一个数字时,就是这样。@JohnColeman我在回答anirudh的评论,他问如果他使用Double
而不是range
作为参数会发生什么。没问题,John;)抱歉@anirudhkaushik,你是对的。但是如果单元格上有文本,或者您的值有小数,则会出现错误,Double
将忽略这些小数。如果您想为函数返回一个Double
,语法是:Public function mytest(arr1作为范围)作为Double
,谢谢Variatus!老实说,许多概念/逻辑对我来说仍然很难掌握。我没有真正的编码背景,我知道的大部分是通过在线教程自学的。但我会更多地练习,希望你的所有答案对我更有意义。在函数myTest()
中注释的友好提示:“这将创建一个2行1列的基于1的三维数组”-这将创建一个基于1的二维数组:-;