【问题标题】:Pass values to array elements of subroutine将值传递给子程序的数组元素
【发布时间】:2021-05-23 07:54:34
【问题描述】:

我想将一些值传递给子例程的数组元素。此代码有效:

Sub Pass_Values()

    Call receive_values_into_array_elements(1, 2)

End Sub
Sub receive_values_into_array_elements(A3, A5)
    Dim A(6), i As Integer

    A(0) = 12
    A(1) = 123
    A(2) = 234
    A(3) = A3
    A(4) = 345
    A(5) = A5
    For i = LBound(A) To UBound(A)
       Debug.Print A(i)
    Next
End Sub

但是,我必须传递几个变量,并且我想将它们直接传递给数组元素。像这样,但它不起作用:

Sub receive_values_into_array_elements(A(3), A(5))
    Dim A(6), i As Integer

    A(0) = 12
    A(1) = 123
    A(2) = 234
    A(4) = 345
    For i = LBound(A) To UBound(A)
       Debug.Print A(i)
    Next
End Sub

Pass_Values 的值 '1' 和 '2' 不会直接传输到 'receive_values_into_array_elements' 的数组元素 'A (3)' 和 'A (5)' 中。您需要辅助变量“A3”和“A5”,然后分配值“A (3)”和“A (5)”。如上所示,有没有办法直接将值分配给数组元素?


回答:不,这是不可能的。

解决方法是:

myArray = Array(12, 123, 234, A3, 235, A5)

按照 freeflow 的建议。

感谢您的帮助!

【问题讨论】:

  • 完全不清楚你想要完成什么。而且您的代码不起作用,因为它什么都不做......那么您有一个数组并想要更改它的两个元素吗?你想创建一个数组并用作为参数发送的这两个元素填充它吗?请编辑您的问题,除了代码什么都不做之外,请尝试(用文字)解释您尝试做什么。
  • 代码已减至最少。我为你夸大了这个例子。我希望它有所帮助。你的答案没有错,但没有抓住重点。
  • 您更新的代码也没有任何意义。我无法理解你想要完成什么。如果您对我在回答中尝试的示例不了解任何内容,恐怕继续下去是没有用的……祝您有美好的一天!
  • 其他语言可以直接将参数传递给数组的元素。
  • 您能用您想要的任何语言向我们展示这种方式吗?我们也许会这样理解你无法用语言解释的东西......

标签: arrays vba ms-word


【解决方案1】:

正如我在评论中尝试解释的那样,要更改数组元素,您不需要使用任何子程序来传递值。希望接下来的测试代码是elocvent:

Sub changeArrayElements()
 Dim A(10) As Integer

 Debug.Print "A(2) = " & A(2), "A(5) = " & A(5)
 'then you can simple directly change the array elements you want in this way:
 A(2) = 1: A(5) = 2
 Debug.Print "A(2) = " & A(2), "A(5) = " & A(5)
End Sub

或先填充数组,然后更改其中一个元素:

Sub changeArrayElements()
 Dim A(10) As Integer, i As Long
 For i = 0 To 9
    A(i) = i * 2
 Next i
 Debug.Print "A(2) = " & A(2), "A(5) = " & A(5)
 'then you can simple directly change the array elements you want in this way:
 A(2) = 1: A(5) = 2
 Debug.Print "A(2) = " & A(2), "A(5) = " & A(5)
End Sub

如果您坚持在子程序中执行,请使用下一种方法:

Sub changeArrayElements()
 Dim A(10) As Integer, B() As Integer, i As Long
 For i = 0 To 9
    A(i) = i * 2
 Next i
 Debug.Print "A(2) = " & A(2)
 B = changeArrElem(2, 1, A)

 Debug.Print "A(2) = " & B(2)
End Sub

Function changeArrElem(pos As Integer, intVal As Double, arr() As Integer) As Integer()
    arr(pos) = intVal
    changeArrElem = arr
End Function

为了有意义,您的代码应该遵循下一个方法:

  1. 请在您的标准模块顶部声明一个变量(在声明区域中):
Dim A(100) As Integer
  1. 使用这种测试方式:
Sub Pass_Values()
    Debug.Print A(22), A(50)
    Call receive_values_into_array_elements(22, 1, 50, 2)
    Debug.Print A(22), A(50)
End Sub
Sub receive_values_into_array_elements(pos1 As Integer, intVal1 As Integer, pos2 As Integer, intVal2 As Integer)
    A(pos1) = intVal1: A(pos2) = intVal2
End Sub

否则,更改在另一个子例程中声明的数组是没有用的。当特定的子程序代码结束时,数组就死了……

【讨论】:

    【解决方案2】:

    正如@FaneDuru 所说,它并不完全清楚你想要做什么。但是,如果使用 Array 语句,则可以大大简化 '"receive_values_into_array_elements'。

    Sub receive_values_into_array_elements(A3, A5)
        Dim myArray As Variant
        myArray = Array(12, 123, 234, A3, 235, A5)
        
        For i = LBound(myArray) To UBound(myArray)
           Debug.Print myArray(i)
        Next
    End Sub
    

    从上面可以看出,通过使用 Array 语句,你可以完全省去 'Sub receive_values_into_array_elements'。

    顺便说一句,请尝试使用正确的变量名。使用 A3 和 A5 之类的名称可能只会带来麻烦。

    【讨论】:

    • 数组语句是个好主意。在您的示例中,Pass_Values 的值“1”和“2”不会直接传输到“receive_values_into_array_elements”的数组元素“A (3)”和“A (5)”。您需要辅助变量“A3”和“A5”,然后分配值“A (3)”和“A (5)”。关键是,我想将参数直接传递给数组的元素。其他语言可以做到这一点。
    • @musbach - VBA 不是其他语言。
    • 看来你很难思考。 VBA 数组赋值的结果与您的 A(x) 赋值序列完全相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 2013-03-11
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多