2014-10-09 2 views
1

두 범위를 사용하고 range1의 첫 번째 셀에 range2의 첫 번째 셀을 곱하고 두 번째 셀의 range1에 두 번째 셀을 곱하는 Excel UDF (사용자 정의 함수)를 작성하려고합니다. range2 등으로 배열 한 다음 결과를 배열에 저장합니다.두 개의 범위/배열을 셀 단위로 곱합니다.

셀 A1 : A4 {1,0,1,2}의 배열 1과 셀 B1 : B4 {1,1,0,1}의 배열 2를 상상해보십시오. 함수 VECTORMULT (A1 : A4, B1 : B4)는 {1,0,0,2}를 반환합니다.

Function VECTORMULT(array1 As Range, array2 As Range) As Variant 
'takes 2 ranges and multiplies cell1 by cell1, cell2 by cell2, etc _ 
and stores it in a vector array 

Dim Result() As Variant 
Dim largerArray As Range 
Dim smallerArray As Range 
Dim i As Integer 

'determine the smaller range to determine UBound in Result() array 
If array1.Cells.Count >= array2.Cells.Count Then 
    Set largerArray = array1 
    Set smallerArray = array2 
Else 
    Set largerArray = array2 
    Set smallerArray = array1 
End If 

ReDim Result(1 To smallerArray.Cells.Count) 

'THIS IS THE PART THAT FAILS 
For i = 1 To smallerArray.Cells.Count 
    Result(i) = largerArray.Item(i).value * smallerArray.Item(i).value 
Next i 
VECTORMULT = Result 
End Function 

I 무제한 ParamArray 인수 허용() 및 배열로 각각의 Arg을 파싱보다 일반적인 함수를 작성 구상했지만, 난이 단순 해 보이는 세포 iterator 함수를 해결할 수 없다. 나는 VBA가

Range(someRange).Item(i) 

같은 몇 가지 기본 방식으로 범위를 단계별로 처리 할 수있는 생각하지만 가치가 무엇을, 나는 내가 올바른 행/열 굴절률들로 대체 할 때 정확한 값을 얻을 수 없습니다 ... 것입니까 들어 Item 함수의 경우 아래와 같습니다. 그러나 Result는 배열 대신에 1 개의 셀에서만 작동합니다. "i"를 전달하는 방법을 알아야합니다.

'substitute Item(1,1) for Item(i) and it DOES work 
For i = 1 To smallerArray.Cells.Count 
    Result(i) = largerArray.Item(1,1).value * smallerArray.Item(1,1).value 
Next i 
+0

왜 실패합니까? 오류가 있습니까? 아니면 예상 한 결과를 얻지 못했습니까? BTW, 오타 (typo) 일지 모르지만 함수가'VECTORMULTrng'이지만'VECTORMULT'에'Result'를 지정하고 있습니다. – L42

+0

고맙습니다. 그 기능의 다른 버전을 시도한 결과입니다. 이 코드를 내 코드에서 수정하면 함수가 마지막 코드 조각에 대한 올바른 값을 반환하므로이 문제도 수정되었습니다. 범위를 넘어서서 배열을 반환하는 주된 문제는 여전히 존재합니다. – smokysunday

+0

첫 번째 질문에 답하기 위해 기본 코드 스 니펫에 표시된 함수가 #VALUE 오류를 반환합니다. – smokysunday

답변

3

INDEX 함수는 어레이 형태, 예를 들어 상기와 ROW_NUM열 너비를에게 파라미터를 블랭킹 의해 수정 정보의 배열을 제공하는 작업을 수행 INDEX((A1:A4)*(B1:B4),,). 범위의 크기는 일치해야하지만 동적으로 모양을 변경할 수있는 명명 된 범위를 참조하지 않는 한해야합니다. (샘플 데이터 사용) 예 :

=SUM(INDEX((A1:A4)*(B1:B4),,))  '◄ 3 
=MIN(INDEX((A1:A4)*(B1:B4),,))  '◄ 0 
=MAX(INDEX((A1:A4)*(B1:B4),,))  '◄ 2 
=AVERAGE(INDEX((A1:A4)*(B1:B4),,)) '◄ 0.75 

FWIW, 난 단지 배열 수식이 작동 할 것으로 보인다 때 많은 표준 공식을 제공하기 위해 INDEX의이 양식을 사용합니다. 배열로 처리되지만 이 필요하지 않습니다. Ctrl + Shift + Enter.

MINIF, MAXIF and MODEIF with Standard Formulas

엑셀 2010

이상, 추가 기능에 대한 새로운 AGGREGATE function로 본다.

+0

예! 나는 이와 같은 INDEX를 실험했지만 행과 열의 인수를 생략 할 수 있다는 것을 알지 못했습니다. 이것은 내가 원하는 것입니다. 설명 된 것처럼이 방법은 두 범위가 모두 같은 방향 (두 행 또는 두 열 모두)으로 설정된 경우에 작동합니다. 범위 중 하나에서'TRANSPOSE()'를 사용하여 Row와 Column을 비교할 수 있지만 그 함수를 배열로 입력해야합니다. Ctl : Shift + Enter_ – smokysunday

+0

POINT : MIN 및 MAX로 사용됩니다. 행렬에서 (예를 들어) 사용 권한을위한 좀 더 강력한 비트 단위 AND 연산자입니다. 첫 번째 배열을 0 (아니오) 및 1 (예)으로 사용하고 첫 번째 배열의 예/아니요 비트를 기반으로 여러 가능한 할당에 대해 -1, 0, 1 및 2와 같은 값을 가진 두 번째 배열을 사용합니다. – smokysunday

1
당신은 큰 차이를 만들 수 있습니다 다른 수식과 함께이 사용 계획

하지만 :

=A1:A4*B1:B4 

은 반환 배열 수식으로 입력 {1,0,0,2} -하지만 말할 때까지 보이지 않습니다. 그러나 어레이의 요소들이 개별적으로 액세스 될 수있다,라고 :

=INDEX(A1:A4*B1:B4,4) 

(또한 배열 수식) 2를 반환.

관련 문제