2016-11-25 1 views
1

제 목표는 반품을 가격으로 변환하는 기능을 작성하는 것입니다. VBA에서 이VBA에서 루프 오버 루프 ​​방지?

Dim r As Range 

Set r = ThisWorkbook.Sheets("Foglio1").Range("B2:B" & _ 
ThisWorkbook.Sheets("Foglio1").Range("B" & Rows.Count).End(xlUp).Row) 

Dim temp() As Variant 
temp = r 

그래서 나는 다음과 같은 코드를 작성

이제
r1 
r2 
... 
rn 

이 반환 열 B에 저장되어 있다고 가정 : 나는 다음과 같이 엑셀에서 범위 안에 저장 수익률의 벡터를 성공적으로 값 r1, r2, ..., rn을 내가 호출 한 배열 에 할당했습니다. 나는 가격

에 수익을 변환 한 것

temp = cumprod(1 + temp) 

명령을 한 줄에 : 나는 다음을 수행 가격에 수익을 변환하기 위해했을 R 또는 MATLAB에 있다면 이제

가 누적 제품 내게 벡터를 돌려 각 배열 요소 cumprod에 1을 합산한다 (1 개 + 온도).

VBA에서 루프를 사용하는 것과 동일한 결과를 얻는 것이 가능합니까?

은 멋진 한 주 끝

+3

입니다. 어떤 언어에서는 루프가 문법적 인 설탕 뒤에 숨어 있을지도 모릅니다. VBA에서는 숨겨진 것이 아니기 때문에 당신은 그것을 즐겨야합니다. 설탕을 원한다면 Variant 배열과 추가 할 인수를 허용하는 함수를 만듭니다. – GSerg

+0

수식을 사용하지 않고 배열 수식 EXP (SUM (LN (B2 : B30)))를 사용하면 도움이되는지 알 수 없습니까? –

답변

4

예를 VBA 루프 함께 직접이 작업을 수행 할 수있는 유일한 방법이 당신의 시간 주셔서 대단히 감사합니다.

Excel 워크 시트 함수를 사용하여 VBA에서 간접적으로 수행 할 수도 있지만 실제로 VBA 배열로 범위를 복사 한 다음 루프를 사용하여 처리하는 것이 더 빠릅니다.

호출 가능한 함수와 서브 루틴이있는 라이브러리를 작성하거나 찾아서 루프를 숨길 수 있지만 여전히 루프를 수행하고 있습니다.

한 설명으로 "루프를 배우는 법을 배우십시오" ". 그것이 바로 VBA에서 작동하는 방법입니다.


는 아이러니하게도, 나는 새 열을 추가하는 것이 작업을 수행하는 가장 빠른 실제 방법을 생각의이 Z2 =B2+1했고, 다른 모든 행/셀 * =(B*+1)*Z[*-1] Z했다 Z2에서 시작 가정 해 봅시다.

+1

나는 루프를 가지고 일하는 것을 좋아한다. 나는 그것을하기위한보다 효율적인 방법이 있는지 알고 싶었다 ... 대답에 대해 대단히 감사한다 !!! –

+0

실제로 루프를 피하는 다른 방법이 있습니다 (다른 답변 참조). 어느 것이 가장 효과적인지 모르겠다. – user3598756

+0

@user3598756 나는 한 번에 또는 그 모두를 시도 했으므로 어느 것이 가장 효율적인지 확신한다. 위에서 말했듯이 * 가장 빠른 방법은 1) 배열 복사 셀을 vba 배열로, 2) 루프로, 3) 배열 붙여 넣기로 vba 배열을 다시 셀에 붙여 넣는 것입니다 (OP가 수행하는 작업 임). vba (또는 심지어 수식 VBA)의 워크 시트 기능이 더 빠를 수 있지만 특정 기능과 사용자가 수행하려고 시도하는 기능간에 매우 좋은 직접적인 일치가 필요한 경우가 있습니다. – RBarryYoung

0

아마도 SQL로 할 수 있을까요?

내 테스트를 위해 일

Public Function PRODUCT_FUNCTION(strRange As String) 

Dim c As ADODB.Connection 
Dim r As ADODB.Recordset 

strInputFile = ThisWorkbook.FullName 
Set c = New ADODB.Connection 

strConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strInputFile & ";" & _ 
          "Extended Properties=""Excel 12.0 Xml;HDR=No"";" 

c.ConnectionString = strConnectionString 
c.Open 

strsql = "Select Exp(Sum(Log([F1]))) from [Sheet1$" & strRange & "]" 

Set r = New ADODB.Recordset 

r.Open strsql, c, 1 

PRODUCT_FUNCTION = r.Fields(0).Value 

r.Close 
c.Close 

Set r = Nothing 
Set c = Nothing 

End Function 
0

Range 객체의 PasteSpecial() 방법 WorksheetFunction.Product() 방법을 활용하는 방법이 실제로있다 :

Function CumulativeDiscount(discountsRng As Range) As Double 
    With discountsRng 
     .Copy 
     With .Offset(, .Parent.UsedRange.Columns.Count) 
      .Value = 1 
      .PasteSpecial , Operation:=xlPasteSpecialOperationAdd 
      Application.CutCopyMode = False 
      CumulativeDiscount = WorksheetFunction.Product(Application.Transpose(.Cells)) 
      .ClearContents 
     End With 
    End With 
End Function 

다음과 같이 당신이 당신의 "주"코드에서 사용할 수있는 :

Sub main() 
    With ThisWorkbook.Sheets("Foglio1") 
     MsgBox CumulativeDiscount(.Range("B2", .Cells(.Rows.Count, "B").End(xlUp))) 
    End With 
End Sub 

유일한 제한 WorksheetFunction.Product()되는 것은 30 개 인수까지 허용에 곱하는 할인 즉 최대 수는 루프를 사용하는 것보다 원칙 기타에 그것을 할 다른 방법이 없습니다 (30)