2017-01-05 8 views
3

이 질문은 제한 사항 때문에 전역 변수를 사용하지 않으려 고하기 때문에 주로 마지막 질문에서 작성한 것입니다. 여기에 링크 된 답변을 참조하십시오 : How do I call upon an array created by a different function?첫 번째 함수에서 두 번째 함수로 만든 패스 배열

다른 사용자 정의 함수에서 사용자 정의 함수로 만든 배열을 사용하려고합니다. 두 번째 함수가 자동으로 다시 계산되지 않기 때문에 배열을 Global으로 설정하지 마십시오. 이 연습에서는 두 가지 기능이 있습니다.

첫 번째 함수는 범위 입력에서 배열을 만들고 값을 합계합니다.

두 번째 함수는 첫 번째 함수에서 만든 배열을 호출하고 두 번째 범위 입력 값을 합계합니다. 다음 코드를 참조하십시오.

  Option Explicit 
      Function first_funct(list_1 As range) As Double 
       Dim extent As Integer, i As Integer 
       extent = list_1.rows.Count 
       Dim main_array() As Variant 
       ReDim main_array(1 To extent) As Variant 
       ' main_array() was changed from double to variant to avoid potential problems. 
       first_funct = 0 

       For i = 1 To extent 
        main_array(i) = list_1(i).Value 
        ' main_array will be used again in second function 
        first_funct = first_funct + main_array(i) 
       Next i 

       Call second_funct(main_array) 

      End Function 

      Function second_funct(list_2 As range, ByRef main_array() As Variant) As Double 
       Dim extent As Integer, i As Integer 
       extent = list_2.rows.Count 
       ' Assume the extent of list_2 is equal to extent of list_1 in first function. 
       Dim main_array() As Variant 
       ReDim main_main_array(1 To extent) As Variant 
       second_funct = 0 

       For i = 1 To extent 
        second_funct = second_funct + main_array(i) + list_2(i).Value 
        ' How do I call upon main_array created from list_1 in the first function? 
       Next i 

      End Function 

첫 번째 기능은 "ByRef 인수 유형이 일치하지 않습니다"라는 오류를 표시합니다. 내 생각에, 호출 문을 두 번째 함수 및 ByRef 문을 배열을 전달할 것이라고 그것을 집어 것이다. 나는 또한 두 번째 함수가 올바른지에 대해서도 확신하지 못한다. 첫 번째 함수가 나에게 오류를주기 때문이다.

미리 감사드립니다.

+0

(list_2, main_array). 배열은 포인터에 의해 실제로 전달되고 변형은 자동으로 암시 적 포인터를 처리합니다. 어떤 경우에 - main_array가 선언 된 방법과 장소 (어디서 재구성 되는가가 아닌)? 희망적으로 그것은 어딘가에 선언된다. 그렇지 않다면 변수가 변하게됩니다. (그리고 당신은'Option Explicit'을 사용하지 않습니다.) 이것은 타입 불일치를줍니다. –

+0

어 혹시'option explicit'을 포함하는 것을 잊었습니다.나는 당신의 다른 제안을 따랐고 여전히 같은 오류가 발생합니다. – Soto

답변

1

두 배열이 모두 강력한 형식으로 선언되어 있고 올바른 방식으로 전달하고 있습니다. 문제는 배열 유형이 아니라 오히려 순서 또는 두 번째 함수에 대한 인수 누락과 관련이 있습니다.

귀하의 second_funct 기능이 개 인수 list_2 As Range, ByRef main_array() As Double을 기대하지만, 당신은 단지 하나의 인자를 제공하고 있습니다 :

Call second_funct(main_array) 

당신이 범위 배열을 전달하는 의미 가정을 변경하려고 할 것과 :

Call second_funct(list_1, main_array) 

또는 더 나은 여전히 ​​Call 문을 제거하고 바로 사용

second_funct list_1, main_array 
+0

first_funct에서'list_1'을 사용하면 second_funct에서'list_2'로 전달되고 그렇게하려고하는 것이 아니라고 생각합니다. 'list_1'을 사용하지 않고 새로운 범위 입력을 사용할 수 있도록하고 main_array의 값을 유지하도록하고 싶습니다. – Soto

+0

확실하지만 다른 범위 참조가 어디서 오는지 알지 못했습니다. 따라서 함수 first_funct (list_1 As range, list_2 As range)'및 'first_funct' 호출 내에서 인수로 추가해야합니다. 'second_funct list_2, main_array' – ThunderFrame

0

기능 및 서브 루틴이 사용에 적합해야합니다. 코드

Call second_funct(main_array) 

는 second_funct의 정의가 제공하는 첫 번째 매개 변수로 범위를 필요로하는 동안 main_array을 전달하는 등의 오류가 있습니다. 당신은 첫 번째 함수 모두의 범위를 전달하는 것

Function first_funct(list_2 As Range, list_1 As Range) As Double 

을 다음과 같이

제안 # 1 수정은 first_funct.

제안 # 2 통화 second_funct 나는 거의 항상 두 배열 입력 및 배열 출력에 대한 간단한`Variant` 변수를 사용하여 거의 문제가 없다