2016-11-05 5 views
0

사용자 정의 함수에서 값을 반환하려고하는데 반환되는 값은 모두 0입니다. 나는 변수 wk1과 wk2에 할당하고있는 값이 함수에서 사용되지 않는 것처럼 느낍니다.서브 루틴이 모두 0을 반환합니다.

서브 루틴의 목표는 워크 시트 "가격"에 제공된 가격을 고려하여 주간 수익을 계산하는 것입니다.

나는 VBA 매우 잘 아는 그래서 어떤 도움이 도움을

감사 감사 아니에요!

Public Sub wklyrtn() 
Dim wk1, wk2 As Long 
Dim row As Long, column As Long 
Dim matrix1(2 To 261, 2 To 11) As Integer 



Sheets("Prices").Select 
Selection.Activate 

For row = 2 To 261 
    For column = 2 To 11 
     wk2 = Cells(row, column).Value 
     wk1 = Cells(row + 1, column).Value 
     matrix1(row, column) = Rtrn(wk1, wk2) 
    Next column 
Next row 

Sheets("Returns").Select 
Selection.Activate 

For row = 2 To 261 
    For column = 2 To 11 
     Cells(row, column) = matrix1(row, column) 
    Next column 
Next row 


End Sub 

Public Function Rtrn(wk1, wk2) 
Dim delt As Long 
Application.Volatile True 

delt = wk2 - wk1 
Rtrn = delt/wk1 

End Function 
+1

아마도 당신의 값이 모두 0으로 잘리지됩니다 'Integer'로'Integer'를'Variant'로 대체하고 s ee는 어떻게됩니까? –

+1

몇 가지 오류가 있습니다. 우선, 'Dim wk1, wk2 As Long'을 선언 할 수 없다면 wk2 만 선언 할 것이므로 'Dim wk1 as long, wk2 as long'을해야합니다. 그러나 이것이 실패 할 이유는 아닙니다. 또한'select'를 사용하지 마십시오. 객체 참조 (워크 시트)를 참조하려면'set'을 사용해야합니다. – Niclas

+1

잘못 설명해 죄송합니다. 나는 코멘트를 삭제하고 올바른 정보를 게시했습니다. John의 제안은 귀하의 코드가 작동하도록합니다. 배열이 일부 유형 (예 : 정수)으로 선언 된 경우이 배열로가는 모든 값은 동일한 유형이어야합니다. Variant로 선언하면 모든 유형의 값이이 배열로 올바르게 전송됩니다. 필요한 경우 Integer로 선언하지 마십시오. Long을 사용하십시오. 32 및 64 비트 시스템에서 정수는 Long으로 변환되므로 성능이 향상되지 않습니다. –

답변

1

시도해보십시오. Matrix으로 무엇을하려고하는지 잘 모릅니다. 그러나 이것은 당신에게 필요한 가치를 줄 것입니다. 대신 select를 사용하는 (워크 시트) 객체를 참조 할 필요가 (항상 일반적으로이를 방지하고 대신 set를 사용하여 객체를 참조하려고합니다. 다른

Option Explicit 

Public Sub wklyrtn() 
Dim wk1 As Long, wk2 As Long 
Dim row As Long, column As Long 
Dim matrix1(2 To 261, 2 To 11) As variant 
Dim wks As Worksheet, wks2 As Worksheet 

Set wks = ThisWorkbook.Sheets("Prices") 

With wks 
For row = 2 To 261 
    For column = 2 To 11 
     wk2 = wks.Cells(row, column).Value 
     wk1 = wks.Cells(row + 1, column).Value 
     matrix1(row, column) = Rtrn(wk1, wk2) 
    Next column 
Next row 
End With 

Set wks2 = ThisWorkbook.Sheets("Returns") 

With wks2 
For row = 2 To 261 
    For column = 2 To 11 
     wks2.Cells(row, column) = matrix1(row, column) 
    Next column 
Next row 
End With 


End Sub 
+0

도움을 주셔서 감사합니다. – willshep

0
Public Sub Get_Price_Index_Var() 
Dim lRow As Long, bCol As Byte    'Avoid naming varaibles same as VBA objects, properties, etc 
Dim vResults(2 To 261, 2 To 11) As Variant 'Using variant datatype gives flexibility to hold the result of the operations perform 
Dim aResults As Variant      'Used get resulting array to be enter in Returns Worksheet 
Dim vVal1 As Variant, vVal2 As Variant 

    With ThisWorkbook.Sheets("Prices") 
     For lRow = 2 To 261 
      For bCol = 2 To 11 
       vVal1 = .Cells(lRow, bCol).Value 
       vVal2 = .Cells(1 + lRow, bCol).Value 
       vResults(lRow, bCol) = fReturns(vVal1, vVal2) 
    Next: Next: End With 
    aResults = WorksheetFunction.Index(vResults, 0, 0) 

    With ThisWorkbook.Sheets("Returns") 
     .Cells(2, 2).Resize(UBound(aResults), UBound(aResults, 2)).Value = aResults 
    End With 

    End Sub 


Public Function fReturns(vVal1 As Variant, vVal2 As Variant) As Variant 
    fReturns = (vVal2 - vVal1)/vVal1 
    End Function 
0

을 변형 변수 작업을보다 (당신이 이미) 들었어요, 당신은 모두 속도 매크로 실행에 배열을 사용하여 활용하고 코드 아래로 줄일 수 있습니다 : 당신이`matrix` 선언 이후

Option Explicit 

Public Sub wklyrtn() 
    Const ROWMIN As Long = 2 
    Const ROWMAX As Long = 261 
    Const COLMIN As Long = 2 
    Const COLMAX As Long = 11 

    Dim row As Long, column As Long 
    Dim data As Variant, matrix1 As Variant 

    With Sheets("Prices") 
     data = .Range(.Cells(ROWMIN, COLMIN), .Cells(ROWMAX + 1, COLMAX)).Value '<--| read all needed values into 'data' array (it needs one row more at the bottom) 
    End With 

    ReDim matrix1(1 To ROWMAX - ROWMIN + 1, 1 To COLMAX - COLMIN + 1) As Double '<--| size returned valuse array accordingly to chosen rows and column indexes ranges 
    For row = 1 To ROWMAX - ROWMIN + 1 
     For column = 1 To COLMAX - COLMIN + 1 
      matrix1(row, column) = Rtrn(data(row + 1, column), data(row, column)) '<-- store returned values into 'matrix1' array 
     Next column 
    Next row 

    Sheets("Returns").Cells(2, 2).Resize(ROWMAX - ROWMIN + 1, COLMAX - COLMIN + 1 + 1).Value = matrix1 '<--| write returned values from 'matrix1' array into cells 
End Sub 

Public Function Rtrn(wk1, wk2) 
    Dim delt As Long 
    Application.Volatile True 

    delt = wk2 - wk1 
    Rtrn = delt/wk1 
End Function 
관련 문제