2017-02-27 7 views
1

코드를 작성하려고하는 사용자 지정 VBA 코드에이 간단한 문제가 있지만 아직 해결 방법을 찾지 못해서 나를 미치게 만듭니다. 현재 행이 5 이하 OR Excel VBA - 수식이 작성된 셀을 참조하십시오.

  • 인 상단의 이웃의 값을 취득하는 경우,

    • 가 같은 열에 두 행까지 셀의 값을 취득 :

      는 I는 수식을 가질 필요 셀 (현재 행이 6 이상인 경우)

    수식이 셀 E5에 기록되면 일반 영어로 표시됩니다. E3의 값을 가져야합니다. 수식이 E6 셀에 기록되면 E5 값을 가져야합니다. 그런 다음 그 값을 다른 수식의 입력 값으로 사용하거나 상황에 따라 결과로 사용합니다. 이, 그것은 OK이었다 단독으로 사용한다면

    IF(ROW()>5; INDIRECT(ADDRESS(ROW()-1; COLUMN())); INDIRECT(ADDRESS(ROW()-2; COLUMN()))) 
    

    , 그러나 이것은 더 큰 중첩의 일부가 될 것입니다 :

    사실 나는 다음과 같은 워크 시트 식으로 내가 원하는 것을 달성 할 수 있어요 IF 블록. 당신이 관심이 있다면, 작업 워크 시트 수식은 약간 다음과 같이보고있다 : 당신이 볼 수 있듯이, 나는 총 유지 보수 악몽에서 찾고

    =IF(LEFT($C5;2) = "RT"; IF(ROW()>5; INDIRECT(ADDRESS(ROW()-1;COLUMN())); 
    INDIRECT(ADDRESS(ROW()-2; COLUMN())))-$F5; IF(LEFT($C5;2)="DP"; IF(ROW()>5; 
    INDIRECT(ADDRESS(ROW()-1;COLUMN())); INDIRECT(ADDRESS(ROW()-2; 
    COLUMN())))+$F5; IF(VE($E5=P$4; LEFT($C5;2)="FR"); IF(ROW()>5; 
    INDIRECT(ADDRESS(ROW()-1; COLUMN())); INDIRECT(ADDRESS(ROW()-2; 
    COLUMN())))-$F5; IF(VE($E5=P$4; LEFT($C5; 2)="RV"); IF(ROW()>5; 
    INDIRECT(ADDRESS(ROW()-1; COLUMN())); INDIRECT(ADDRESS(ROW()-2; 
    COLUMN())))+$F5; IF(ROW()>5; INDIRECT(ADDRESS(ROW()-1; COLUMN())); 
    INDIRECT(ADDRESS(ROW()-2; COLUMN()))))))) 
    

    . 좀 봐도 어지러워. 그래서, 나는 쉽게 같이 쓸 수 있습니다 생각 VBA 수식에 언급 된 비트를 이동하기로 결정 :

    Function GETTOP() 
    
        If (ActiveCell.Row < 6) Then 
         GETTOP = CLng(ActiveCell.Offset(-2, 0).Value) 
        Else 
         GETTOP = CLng(ActiveCell.Offset(-1, 0).Value) 
        End If 
    
    End Function 
    

    나는 참조 된 셀 값이 숫자가 아닌 경우 그것이 오류가 발생 알고,하지만 난거야 그 문제를 나중에 다루십시오.

    난 그냥 직접 셀에 수식을 작성하는 경우 그것은 잘 작동 :

    It works when formula cells edited directly

    을하지만이 공식 세포에 영향을 미친다 세포를 수정하려고 할 때, 그것은 세포를 참조하려고하는 I 나는 기능에 ActiveCell을 사용하고 있기 때문에 현재

    Not working when affecting cells are modified

    을 수정하고, 자연스럽게 활성 셀을 참조하려고합니다.

    웹에서 찾은 모든 솔루션은 ActiveCell 접근 방식을 사용합니다. 이는 셀을 직접 편집 할 때 크게 효과적입니다. 그러나 영향을받는 셀 중 하나가 편집되면 실패합니다.

    그렇다면 수식이 작성된 실제 셀을 어떻게 참조 할 수 있습니까?

  • 답변

    3

    은 (당신이 그것을 좋아하는 경우에) 더 간결 스타일 Application.Caller

    Function GETTOP() 
        Application.Volatile 
        With Application.Caller 
         If (.Row < 6) Then 
          GETTOP = CLng(.Offset(-2, 0).Value) 
         Else 
          GETTOP = CLng(.Offset(-1, 0).Value) 
         End If 
        End With 
    End Function 
    

    이상을 사용해보십시오 :

    Function GETTOP() 
        Application.Volatile 
        With Application.Caller 
         GETTOP = CLng(.Offset(IIf(.Row < 6, -2, -1)).Value) 
        End With 
    End Function 
    
    +1

    또는'(비 배열 수식에 대한) Application.ThisCell' –

    +0

    매력처럼 일했습니다! 감사. 나는 또한 신청서에 대해 몰랐다.휘발성 기능, 그 하나에 대한 별도 감사합니다 :) – SercioSoydanov

    +1

    당신은 두 번 환영합니다 ... – user3598756