Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.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
Arrays 在VBA函数中访问单个数组元素_Arrays_Excel_Vba_Function_Excel 2010 - Fatal编程技术网

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的二维数组:-;