2013-05-10 3 views
1

일련의 시트를 통과하고 입력 된 데이터를 기반으로 이름을 수집 한 다음 간단한 형식의 Word 문서에 모두 넣는 간단한 매크로가 있습니다. 나는 그것의 대부분을 알아 냈다. 그러나 1 개의 벌레는 나를 괴롭힌다. 이름을 기반으로 휴대 전화 번호를 가져 오는 코드와 관련이 있습니다. 다음은 함수입니다.각 루프마다 모든 데이터를 처리하지 않습니다.

Function findCell(namePerson As String) As String 
    Dim splitName As Variant 
    Dim lastName As String 
    Dim firstName As String 

    splitName = Split(namePerson, " ") 
    lastName = splitName(UBound(splitName)) 
    ReDim Preserve splitName(UBound(splitName) - 1) 
    firstName = Join(splitName) 

    For Each b In Worksheets("IT").Columns(1).Cells 
     If b.Value = lastName Then 
      If Sheets("IT").Cells(b.row, 2).Value = firstName Then findCell = Sheets("IT").Cells(b.row, 4).Value 
     End If 
    Next 
End Function 

핸드폰 번호는 "IT"라는 고유 시트에 있습니다. 첫 번째 열에 성이 있고 두 번째 열에는 이름이 있고 네 번째 열에는 휴대 전화 번호가 있습니다. 어떤 사람들은 이름에 대해 여러 부분을 가지고 있습니다. 그래서 그 이상한 분열, ReDim-ing 및 다시 합류하는 것을 보았습니다. 그 부분은 잘 작동합니다.

같은 성을 가진 사람이 여러 명일 때 문제가 발생합니다. 함수는 첫 번째 If 문을 통해 성을 가진 사람을 찾습니다. 그런 다음 이름을 비교합니다. 일치하면 휴대 전화 번호의 값을 반환해야합니다. 그 후 첫 번째 이름이 일치하지 않는 경우에도 for 루프가 중지됩니다. 따라서 누군가가 같은성에 생기면 이름은 확인하지 않고 아무 것도 반환하지 않습니다.

나는 루프 밖에서 모두 리턴 콜을 시도했지만, 여전히 차이를 만들지는 못했다.

+0

Brad가 보여 주듯이 이후 처리를 중단하려면 반환 값을 설정 한 직후에 'Exit Function'또는 'Exit For'를 추가해야합니다. 반환 값을 설정하면 함수 코드가 * 완료 * 일 때 반환 할 내용 만 결정됩니다. 함수가 즉시 종료되어 해당 값을 반환하지는 않습니다. –

답변

4

데이터베이스를 사용하지 않으므로 기본 키 열이 어려울 수 있습니다. 귀하의 현재 설정으로 이것을 시도 할 수 있습니다. 이

  • 이 열에서 모든 단일 셀을 통해 보이지 않는 는
  • Option Explicit
  • 가 처음 발견 종료
  • 가 상단에 무관심 할 것이다/소문자 및 선도/화이트 후행를 반환합니다 사용 공간.

.

Option Explicit 

Function findCell(namePerson As String) As String 
    Dim splitName As Variant 
    Dim lastName As String 
    Dim firstName As String 

    splitName = Split(namePerson, " ") 
    lastName = splitName(UBound(splitName)) 
    ReDim Preserve splitName(UBound(splitName) - 1) 
    firstName = Join(splitName) 

    Dim ws As Worksheet, lastrow As Long, r As Long 
    Set ws = Worksheets("IT") 
    lastrow = ws.Cells(1, 1).End(xlDown).Row 'or whatever cell is good for you 

    For r = 1 To lastrow 
     If UCase(Trim(ws.Cells(r, 1))) = UCase(Trim(lastName)) _ 
      And UCase(Trim(ws.Cells(r, 2))) = UCase(Trim(firstName)) Then 

      findCell = ws.Cells(r, 4) 
      Exit For 
     End If 

    Next r 

End Function 
+0

FYI 이것은 Excel에서 GUID를 생성하는 것으로 보입니다. http://stackoverflow.com/questions/7031347/how-can-i-generate-guids-in-excel – John

+0

@ 존 재미 있고, 나는 그것을 좋아한다! :) 그게 단점은 때마다 계산 (기본적으로 당신이 아무것도 할 때마다) 귀하의 GUID가 변경됩니다 때마다 같아요. 새 GUID를 얻으려면이 수식을 사용하여 새 레코드에 대한 값을 붙여야합니다. – Brad

+0

오른쪽. 나는 데이터베이스 테이블보다는 스프레드 시트를 다루는 어려움을 고려하지 않았다. – John

2

실제 문제를 처리하는 것을 연기하고있는 것처럼 보입니다.

"키"(이름)가 고유하지 않기 때문에 문제가 발생합니다. 하나의 이름 지정 충돌을 해결했으며 이제 다른 이름 충돌 문제를 해결하려고합니다.

GUID와 같은 키를 가져 오는 것이 고유 한 것은 어떨까요? 그러면 더 이상이 문제를 해결할 필요가 없습니다.

관련 문제