Option Explicit

Sub UserFn_Find()' === 모듈 시작
' CodeBy [ 오즈맨 ] , Date : 2014-08-21

'루프 변수
Dim ii    As Double
Dim jj    As Double
Dim kk    As Double
Dim pp    As Double
Dim MySheet    As Worksheet

Dim TheLink As Variant        '외부링크 파일 찾아 저장
Dim My_Link As Variant        '그 중 사용자 함수만 추출

Dim tmpString As String
Dim tmpArray() As String      '목록을 임시로 저장하는 변수

TheLink = ActiveWorkbook.LinkSources(xlExcelLinks) '링크 차즌 담
kk = UBound(TheLink)          '개수를 세어보고

jj = 1
ReDim My_Link(1 To 2, 1 To jj) As Variant
      My_Link(1, 1) = "Path"
      My_Link(2, 1) = "File"

For ii = 1 To kk                   '링크 개수만큼 루프 돌되
     tmpString = TheLink(ii)            '임시 문자열에 링크명을 넣고
     pp = InStrRev(tmpString, "\")
     tmpString = Mid(tmpString, pp + 1) '임시문자열에서 파일명만 추출합니다
     
     If Workbooks(tmpString).IsAddin = True Then  '추가기능일 경우만 재적립 시킴
          jj = jj + 1
          ReDim Preserve My_Link(1 To 2, 1 To jj) As Variant
               My_Link(1, jj) = TheLink(ii)       '차후 File Open 용
               My_Link(2, jj) = tmpString         'UDF Find 용
     End If
     
Next


'찾기를 위한 임시변수
Dim c As Range, rng As Range
Dim tmpAddress As String


If jj < 2 Then
          MsgBox " 이 파일에는 읍사와유 ", , "그럼 이만..."
          Exit Sub
End If


Set rng = Application.InputBox(vbLf & "   가로로 네(4) 열 차지합니다", "   기록할 셀 지정합니다.", Type:=8)

pp = UBound(My_Link, 2)
For ii = 2 To pp                        '일단 닫고
     Workbooks(My_Link(2, ii)).Close
Next


jj = 1
ReDim tmpArray(1 To 4, 1 To jj) As String
     tmpArray(1, 1) = "추가기능 File"
     tmpArray(2, 1) = "사용된 시트"
     tmpArray(3, 1) = "셀 주소"
     tmpArray(4, 1) = "수식"


'여기서 파일명 검색으로 뒤져봅니다
For ii = 2 To pp
tmpString = My_Link(1, ii)
For Each MySheet In ActiveWorkbook.Sheets              '워크북에서 시트를 돌며 검색합니다.
     
     With MySheet.Cells                                '시트에서 ...
          Set c = .Find(tmpString, LookIn:=xlFormulas)      '해당 파일명을 검색합니다.
          If Not c Is Nothing Then
                    tmpAddress = c.Address
               Do
                    jj = jj + 1                             '만일 있으면 누적시켜 저장합니다.
                    ReDim Preserve tmpArray(1 To 4, 1 To jj) As String
                         tmpArray(1, jj) = tmpString        '파일명
                         tmpArray(2, jj) = MySheet.Name     '사용된 시트명
                         tmpArray(3, jj) = c.AddressLocal(0, 0)  '셀 주소
                         tmpArray(4, jj) = c.Formula         '수식
               Set c = .FindNext(c)
               Loop While Not c Is Nothing And c.Address <> tmpAddress
          End If
     End With
     
Next
Next


For ii = 2 To pp                       '닫은 추가기능을 다시 열고
     Workbooks.Open Filename:=My_Link(1, ii)
     Application.Volatile
Next
     

'그 결과를 행/열을 바꿔서 배열로 만들고
Dim TheAnswer
ReDim TheAnswer(1 To jj, 1 To 4)

For kk = 1 To 4
     TheAnswer(1, kk) = tmpArray(kk, 1)
Next


For ii = 2 To jj
For kk = 1 To 4
     TheAnswer(ii, kk) = tmpArray(kk, ii)
Next

     tmpString = TheAnswer(ii, 1)
     TheAnswer(ii, 1) = Mid(tmpString, InStrRev(tmpString, "\") + 1)
     
     tmpString = TheAnswer(ii, 4)
     TheAnswer(ii, 4) = " =" & Mid(tmpString, InStrRev(tmpString, "!") + 1)
     
Next

'바뀐 결과를 셀에 기록합니다
rng.Resize(jj, 4) = TheAnswer


'변수 초기화 마무리는 직접 하시기 바랍니다.


End Sub         ' ___ 모듈 종료


http://ozman.tistory.com/113 글의 신 버전입니다

Posted by 오즈맨스머프


                                                  
  안녕하세요. 오즈맨 입니다.
 시트명은 Rank예제 입니다.
[ Rank 계산 수식 ] 예제 입니다.
 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
ABCDEFGH
조건비교값Rank_1Rank_2비교Rank_1Rank_2비교
        
서울10055TRUE11TRUE
서울30022TRUE33TRUE
서울40011TRUE55TRUE
서울30022TRUE33TRUE
서울 ****TRUE****TRUE
서울20044TRUE22TRUE
부산10055TRUE11TRUE
부산30011TRUE33TRUE
부산30011TRUE33TRUE
부산30011TRUE33TRUE
부산20044TRUE22TRUE
제주10011TRUE11TRUE
해외 ****TRUE****TRUE
        
구분       
Rank 함수를 사용한 순위 구하기
Sumproduct 함수를 사용한 순위 구하기
        
        
이름정의       
Col_A =Rank예제!$A$4:$A$16
Col_B =Rank예제!$B$4:$B$16


Rank예제
시트 에 사용한 수식
입니다. by MicroSoft Excel v 2003
   $ 가 있는 수식은 절대(혼합)참조로 셀 주소를 고정합니다. 참조하세요!!
No셀주소왼쪽의 셀에 수식을 넣으면 오른쪽 결과가 나옵니다.
(복사)를 누르면 셀의 수식이 클립보드(메모리)로 복사되는데,
익스플로러의 종류에 따라 (복사)가 작동이 안 될 수 있습니다.
결과수식을
1C4=IF(B4="","**",RANK(B4,$B$4:$B$9))5
2 C4  셀의 수식을 여기에 복사하세요 -→ C4:C9  
3D4=IF(B4="","**",SUMPRODUCT(--(Col_A=A4),--(Col_B>=B4),--(Col_B<>""))-(SUMPRODUCT(--(Col_A=A4),--(Col_B=B4))-1) )5
4 D4  셀의 수식을 여기에 복사하세요 -→ D4:D16  
5E4=C4=D4TRUE
6 E4  셀의 수식을 여기에 복사하세요 -→ 
E4:E16,H4:H16
  
7F4=IF(B4="","**",RANK(B4,$B$4:$B$9,-1))1
8 F4  셀의 수식을 여기에 복사하세요 -→ F4:F9  
9G4=IF(B4="","**",SUMPRODUCT(--(Col_A=A4),--(Col_B<=B4),--(Col_B<>""))-(SUMPRODUCT(--(Col_A=A4),--(Col_B=B4))-1) )1
10 G4  셀의 수식을 여기에 복사하세요 -→ G4:G16  
11C10=IF(B10="","**",RANK(B10,$B$10:$B$14))5
12 C10  셀의 수식을 여기에 복사하세요 -→ C10:C14  
13F10=IF(B10="","**",RANK(B10,$B$10:$B$14,-1))1
14 F10  셀의 수식을 여기에 복사하세요 -→ F10:F15  
15C15=IF(B15="","**",RANK(B15,$B$15))1
16C16=IF(B16="","**",RANK(B16,$B$16))**
17F16=IF(B16="","**",RANK(B16,$B$16,-1))**

   보시는 내용은 위의 표에 값이, 아래의 표에는 해당 셀의 수식이 있습니다.   
   첨부파일이 없습니다, 원하는 부분을 시트(셀)에 붙여 넣으세요.
     도움이 되시기를 바랍니다.   
   참고로 !!!
   조건 판단 결과 True/False 는 그 합이나 혹은 숫자 형태의 결과가 나오지 않습니다.
   그리고 Left/Right/Mid/Text/Substitute 등의 함수나 & 로 구한 결과는 숫자가 아닙니다.
   그래서 -- 를 이용합니다.
   논리값에 -- 를 하면 True 는 1 로 False 는 0 으로 변경되고
   문자로 인식된 숫자는 올바른 숫자로 계산됩니다.
   그 결과를 이용하면 합을 구할때 편리합니다.
참고자료입니다.    [ 수식에서 사용하는 -- 의 설명입니다. ]


                                                  


Posted by 오즈맨스머프