2016-06-16 4 views
2

Eval()을 사용하여 Main에 저장된 일부 함수를 가져 와서 Sheet2의 값으로 평가하려고합니다. 지금까지 메인 및 순수 텍스트에 대한 정적 참조가 작동하지만 상대 셀을 참조하는 데 문제가 있습니다.현재 시트로 다른 시트에서 수식 평가

이상적으로, 기본 워크 시트는 정적 참조와 상대 참조를 결합하고 테이블의 행 (이 예에서 A7, A8, ...)과 같은 열에 기능을 적용합니다. 작은 따옴표는 SQL을 형성하기위한 것입니다. 여기 구현하려는 기능 중 하나입니다.

=CONCATENATE(Main!$B$30, "'", A7, "', '", B7, "', '", C7, "', '", D7, "', '", E7, "', '",F7, "', '",G7, "', '",H7, "', '",I7, "', '",J7, "', '", K7, "', ",$B$4,Main!$B$35) 

문제는 내 평가 기능에 있다고 생각합니다. 활성 시트의 셀 값으로 A7을 평가하지 않습니다. CurrentSheet! A7과 같은 기능을 변경하는 방법을 찾고 있었지만 적절한 구문을 찾을 수 없었습니다.

Function Eval(Ref As Range) 
    Dim shCurrent As Worksheet: Set shCurrent = ActiveSheet 
    Application.Volatile 
    Application.ThisCell.Parent.Activate 
    Eval = Application.ThisCell.Parent.Evaluate(Ref.Formula) 
    shCurrent.Activate 
End Function 

나는 주! $ ​​E $ 5 안에 엑셀 위의 기능을 가진 세포입니다 내 테이블 열을 복사, 같은 시트 2에서이 평가 기능을 참조하고 있습니다.

=EVAL(Main!$E$5) 

답변

나는의를 예를 bwyn 내에서 사용할 수 있도록 수정 걸렸습니다. 이것은 위의 Excel 기능이 VB 함수처럼 보이게 한 것입니다. 행 번호를 매개 변수로 보내면 호출 기능이 가장 일반화되어 스프레드 시트 마스터가 한 위치에서 필요에 따라 "A"및 "K"값을 확장 할 수 있습니다.

Function EvalInsert(rowNum As Integer) 
    Dim shCurrent As Worksheet: Set shCurrent = ActiveSheet 
    Dim shMain As Worksheet: Set shMain = Sheets("Main") 
    Dim insertClose As String: insertClose = "'));" 
    Dim openParen As String: openParen = "'" 
    Dim closeParen As String: closeParen = "', " 
    Application.Volatile 

    Set insertOpen = shMain.Range("B30") 
    Set tableId = shMain.Range("B33") 
    Set TableName = shCurrent.Range("B1") 
    Set insertValues = shCurrent.Range(Cells(rowNum, "A"), Cells(rowNum, "K")) 

    EvalInsert = insertOpen.Value 

    For Each c In insertValues.Cells 
    EvalInsert = EvalInsert & openParen & c.Value & closeParen 
    Next 

    EvalInsert = EvalInsert & tableId & TableName & insertClose 

End Function 

나는 이것이 당신의 CONCATENATE 공식에서

=EvalInsert(ROW()) 

답변

1

를 사용하여, 그것은 만 A7 변화를 보인다했다. 이것이 사실이라면 다음과 같이 평가 함수를 다시 쓸 수 있습니다 :

Function Eval(currShRelRefStr As Range) 
    Dim shCurrent As Worksheet, shMain As Worksheet 
    Dim mainRng As Range, currShRelRef As Range, currShStaticRef As Range 
    Dim aStr As String 

    Set shCurrent = ActiveSheet 
    Set shMain = Sheets("Main") 

    Set mainRng = shMain.Range("B30") 
    Set currShRelRef = shCurrent.Range(currShRelRefStr.Value) 
    Set currShStaticRef = shCurrent.Range("B3") 
    aStr = "a string" 

    Eval = mainRng.Value & aStr & currShRelRef.Value & currShStaticRef.Value 

End Function 
+0

의견에 감사드립니다! 실제로 CONCATENATE를 단순화했습니다. 약 10 개의 셀이 변경됩니다. 내 원래의 CONCATENATE은 "= CONCATENATE (Main! $ B $ 30," ' ", A7,"', "", B7, " '," ", C7,"', ' ", D7,"' I7, " ','", J7, " '," ", K7,"K7 "," " ',", $ B $ 4, Main! $ B $ 35) ". 여러 가지 수식이 있지만 필요에 따라 함수를 만들 수 있습니다. 나는 이것을 반영하기 위해 메인 포스트를 업데이트했다. 혼란에 빠져서 미안하다. – Danielle

+1

더 긴 수식에서는 행만 변경됩니다. 행 번호를 입력하고 관심 범위 (A7 : K7)를 선택하고 셀을 반복하여 연결 문자열을 만들 수 있습니다. – bwyn

+0

좋아, 시도해 보겠습니다. :) 저는 Excel에서 VB 수식을 처음 접했을 때 성공했는지 다시보고 할 것입니다. – Danielle

관련 문제