2017-12-22 3 views
0

도움이 필요하시면 미리 감사드립니다! 나는 엑셀에서 많은 VBA를 사용하지 않았고 필요한 것을하는 방법을 찾지 못했다. 그러나 나는 그것이 내가 통합 문서 내에서 필요한 기능을 달성하기 위해 필요하다고 믿는다.관련된 행을 찾아 값을 반환하면 여러 페이지에서 Excel이 표시됩니다.

나는 특정 정보가 있는지 찾아서 요약 페이지에 표시해야하는 31 개의 데이터 페이지가 있습니다.

열 A, 값에 값이 있는지 확인해야합니다. 열 E, F 및 G에서 해당 행에 반환 된 데이터가 필요합니다. 시트 당 여러 인스턴스가 있거나 시트 당 없음 인스턴스가있을 수 있습니다. .

희망이 예를 더 잘 설명 할 것 : 나는 3 행에서이다 요약 페이지에 반환하려는 것입니다 정보 위의 예제 데이터에서

  E   F   G   ...  AQ 
      Date  Name  Location    Exception 
2  1-12-17  Dave  England 
3  1-12-17 Sarah  Wales     Exp 

을 (데이터의이 유형은 (31)의 각각에 다른 페이지)

희망이 있으리라! 이 작업을 수행하는 방법에 대한 도움은 크게 감사하겠습니다.

+1

A 열을 A 열로 다시 구성하면 VBA가 필요없는 V- 조회를 사용할 수 있습니다. – serakfalcon

+1

무엇을 시도 했습니까? 모든 것이 당신을 위해 끝나기를 기대하기보다는 당신의 노력을 포함하는 것이 더 낫습니다. COUNTIF와 같은 기능과 여기에서 도움이 될 수있는 피벗 테이블과 같은 도구가 있습니다. – SJR

+0

나는 VBA를 사용하지 않고 시도했지만 이전 질문에서 내가받은 유일한 응답은 VBA 없이는 불가능하다는 것입니다. 열 순서를 바꾸는 것은 실행 가능한 옵션이 아닙니다. – hsquared

답변

1

이 문제를 해결할 수있는 여러 가지 방법이 있습니다 (예 : 특정 필터 조건이있는 피벗 테이블, 일치하는 항목을 찾아 원하는 출력으로 인쇄하는 등). 일반적으로 Range.Find 메서드를 사용하고 모든 일치를 반복하는 것은 나쁜 생각이 아닙니다.

Excel을 많이 사용하는 대부분의 사람들이 궁극적으로는 vLookup을 사용하지만 결국에는 일정한 프로그래밍 시간과 에너지가 필요합니다. 저는 항상 vLookup에 만족하지 않았습니다. 이는 vba Range.Find 방법과 비교하여 너무 제한적입니다. 그저 크리스마스이기 때문에 실제로 돈을 지불해야하는 일이 없어 졌기 때문에 문제를 해결하는 데 도움이되는 작은 보석이 있습니다.

반환 할 일치하는 숫자를 지정하고 행 또는 열에 사용자 지정 오프셋을 반환하여 값으로 검색 할 수있게 해주는 UDF 조회입니다. 변수 matchNum을 증가 시키면 해당 범위의 모든 일치 항목이 제공되고 적절한 오프셋을 사용하여 원하는 열을 반환 할 수 있습니다.

Range.Find 메서드를 사용하면 코드를 사용하여 UDF 조회 기능을 사용하지 않고 원하는대로 정확히 워크 시트를 채울 수있는 방법을 알 수 있습니다. 나는 그것을 독자를위한 운동으로 남겨 둘 것이다.

'################################################################################################################################ 
' findwhat: the value you want to find. (needle) 
' where: the range you want to look for findwhat (haystack) 
' matchNum: if the needle is found more than once in the haystack, find the nth target. 
' rowoffset: offset your return value from the target, positive will return the value of the cell below the target. 
' columoffset: offset your return value from the target, positive will return the value of the cell to the right of the target. 
'################################################################################################################################ 
Public Function powerLookup(findwhat As Variant, where As Range, Optional matchNum As Long = 1, Optional rowOffset As Long = 0, Optional columnOffset As Long = 0) As Variant 
    Dim rngResult As Range, firstAddress As String 
    Set rngResult = Nothing 
    On Error GoTo Errorhandler ' if something breaks return #NA (will definitely happen if first find call fails) 
    Do While matchNum > 0 'loop through the matches until there are no matches or we've reached the target matchnumber 
     'the first time, rngResult will be Nothing, so the first find can't have rngResult as an input. 
     With where 
      If rngResult Is Nothing Then 
       Set rngResult = .find(findwhat, , xlValues) 
       firstAddress = rngResult.Address 'keep this to know if we've looped past the start 
      Else 
       'if rngResult is not nothing we've already found a match, find the next match until matchnum is 0 
       Set rngResult = .find(findwhat, rngResult, xlValues) 
       If rngResult.Address = firstAddress Then 
        'if we reach the first address we've looped around, no more matches found, throw #NA error 
        powerLookup = CVErr(xlErrNA) 
        Exit Function 
       End If 
      End If 
     End With 
     matchNum = matchNum - 1 
    Loop 
    powerLookup = rngResult.offset(rowOffset, columnOffset).Value 'offset the output 
    Exit Function 
Errorhandler: 
    powerLookup = CVErr(xlErrNA) 
End Function 
+0

감사합니다! 이것은 거의 정확히 내가 뭘했지만, 범위에 대한 논쟁은 페이지와 셀을 포함하는 범위를 받아들이지 않는 것처럼 보입니다 - 맞습니까? – hsquared

+0

@hsquared 범위로 입력하려는 내용을 게시 할 수 있습니까? Range는 단일 워크 시트에 대해 로컬이므로 워크 시트를 확장 할 수 없습니다. – serakfalcon

+0

그게 제가 확인하고 싶었던 것입니다 - 이상적으로 워크 시트를 확장 할 수있는 무언가가 필요했습니다.하지만 불가능한 것 같습니다. (첫 번째 인스턴스가 처음 몇 시트에 있지 않거나 모든 시트에 있지 않을 수 있으므로 각 시트를 개별적으로 확인하고 반환해야하므로 값 사이에 원하지 않는 #NA가 많이 생성 될 수 있기 때문입니다. – hsquared

관련 문제