문제

우리는 두려운 INDIRECT 함수를 사용하는 수십, 아마도 수백 개의 수식을 포함하는 매우 큰 Excel 통합 문서(수십 개의 탭, 각각 1MB 이상, 매우 복잡한 계산)를 가지고 있습니다.이러한 수식은 통합 문서 전체에 분산되어 있으며 여러 데이터 테이블을 대상으로 값을 조회합니다.

이제 이러한 수식의 대상이 되는 데이터 범위를 동일한 통합 문서의 다른 위치로 이동해야 합니다.

(이유는 특별히 관련이 없지만 그 자체로는 흥미롭습니다.Excel Calculation Services에서 이러한 작업을 실행해야 하는데, 비교적 큰 각 테이블을 한 번에 하나씩 로드할 때 발생하는 대기 시간이 허용할 수 없을 정도로 높은 것으로 나타났습니다.한 번에 모두 로드할 수 있도록 테이블을 인접한 범위로 이동하고 있습니다.)

현재 이동하려는 테이블을 참조하는 모든 INDIRECT 수식을 찾을 수 있는 방법이 있습니까?

나는 이것을 온라인으로 할 필요가 없습니다.신뢰할 수 있는 한 실행하는 데 4시간이 걸리는 것을 기꺼이 받아들이겠습니다.

.Precedent, .Dependent 등의 메소드는 직접 수식만 추적한다는 점에 유의하세요.

(또한 스프레드시트를 다음에서 다시 작성합니다. 무엇이든 우리에게는 선택 사항이 아닙니다.)

감사해요!

도움이 되었습니까?

해결책

vba를 사용하여 전체 통합 문서를 반복할 수 있습니다(@PabloG 및 @euro-micelli의 코드를 포함했습니다).

Sub iterateOverWorkbook()
For Each i In ThisWorkbook.Worksheets
    Set rRng = i.UsedRange
    For Each j In rRng
        If (Not IsEmpty(j)) Then
            If (j.HasFormula) Then
                If InStr(oCell.Formula, "INDIRECT") Then
                    j.Value = Replace(j.Formula, "INDIRECT(D4)", "INDIRECT(C4)")
                End If
            End If
        End If
    Next j
Next i
End Sub

이 예에서는 "indirect(D4)"의 모든 항목을 "indirect(C4)"로 대체합니다.더 복잡한 간접 기능이 있는 경우 대체 기능을 더 정교한 기능으로 쉽게 바꿀 수 있습니다.더 큰 통합 문서의 경우에도 성능이 그다지 나쁘지 않습니다.

다른 팁

큐:"현재 이동하려는 테이블을 참조하는 모든 INDIRECT 수식을 찾을 수 있는 방법이 있습니까?"

내가 읽으면서 관심 영역에 대한 참조를 위해 INDIRECT 인수 내부를 살펴보고 싶을 것입니다.OTTOMH 정규식 파서를 사용하기 위해 VBA를 작성하거나 간단한 INSTR을 사용하여 INDIRECT(일치하는 항목 앞으로 읽기)를 찾은 다음 내부 문자열을 EVALUATE()하여 실제 주소로 변환하고 여러 INDIRECT에 대해 필요에 따라 반복합니다. (...) 수식과 해당 변환을 호출하여 시트의 두 열에 덤프합니다.

VBA에서는 다음과 같은 것을 사용할 수 있습니다.

Sub ListIndirectRef()

Dim rRng As Range
Dim oSh As Worksheet
Dim oCell As Range

For Each oSh In ThisWorkbook.Worksheets
    Set rRng = oSh.UsedRange
    For Each oCell In rRng
        If InStr(oCell.Formula, "INDIRECT") Then
            Debug.Print oCell.Address, oCell.Formula
        End If
    Next
Next

End Sub

Debug.Print 대신 취향에 맞게 코드를 추가할 수 있습니다.

불행히도, 간접 논쟁은 일반적으로 그보다 더 복잡합니다.다음은 우리가 가진 가장 복잡한 공식이 아니라 시트 중 하나의 실제 공식입니다.

=IF(INDIRECT("'"&$B$5&"'!"&$O5&"1")="","",INDIRECT("'"&$B$5&"'!"&$O5&"1"))

흠, 대부분의 문자를 무시하고 관련 부분만 찾아 간단한 파서를 작성할 수 있습니다(이 예에서는:"A..Z", "0..9" 및 "!:" 등) 그러나 "간접"의 인수가 함수인 경우 문제가 발생합니다.

아마도 더 안전한 접근 방식은 세 번째 시트에 "간접"이 발생할 때마다 인쇄하는 것입니다.그런 다음 원하는 출력을 추가하고 작은 검색 및 바꾸기 프로그램을 작성하여 변경 사항을 다시 작성할 수 있습니다.

거대한 스프레드 시트에서 모든 셀을 "얻는"경우에는 엄청난 양의 기억이 필요할 수 있습니다.나는 여전히 그 위험을 감수하려고 노력하고 있습니다.

사용된 범위를 선택하는 PabloG의 방법이 올바른 방법입니다(원래 코드에 추가함).특히 현재 셀에 수식이 포함되어 있는지 확인하는 경우 속도가 꽤 좋습니다.분명히 이것은 모두 통합 문서의 크기에 따라 다릅니다.

작성자가 연결된 제품에 대한 언급과 관련하여 SO의 에티켓이 무엇인지 잘 모르겠지만 Excel 추가 기능인 Operas Analysis Kit인 OAK는 INDIRECT 함수를 해당 함수가 해결하는 셀 참조로 대체할 수 있습니다.그런 다음 Excel의 감사 도구를 사용하여 각 범위에 어떤 종속 항목이 있는지 확인할 수 있습니다.

물론 통합 문서의 임시 복사본에 대해 이 작업을 수행합니다.

자세한 내용은

  • http://www.operisanalytickit.com/oakpruning.htm
  • http://www.operisanalytickit.com/help/2007/index.html?oakconceptpruning.htm

이 질문의 나이를 고려하면 대체 솔루션이나 해결 방법을 찾았을 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top