2017-12-23 2 views
1

두 일치 및 색인 수식을 사용하여 일부 VBA 코드를 작성했습니다. 시트에서 고유 한 값을 선택하여 다른 시트와 비교해야합니다. 그러나 그것은 작동하지 않습니다. 약간의 오류가 있습니다. 여기 일치 및 색인이있는 Excel VBA

내 코드입니다 -합니다 (worksheetfunction 클래스 VBA의 일치 성을 얻을 수 없습니다이 오류입니다) :

Sub Post_Attendance() 

Sheets("DB").Activate 

'On Error Resume Next 

Dim myvalue As String 
Dim mydate As String 
Dim mypost As String 

(셀에 입력 된 날짜 값) 희미한 DT 문자열 DT로 = 범위 ("C7"). 값

(고유 ID가 셀에 입력) 희미한 다른 활성화 (문자열 EMPID = 범위 ("C8").

값으로 EMPID 워크 시트, 희미한 strWsName) 셀 값에서 문자열 strWsName = 시트로 ("DB"). 범위 ("A7") 시트 (왼쪽 (strWsName는, 3)).을 찾을 수

(match 함수를 선택 색인에 대한 행과 열 수)
MyDate가 = WorksheetFunction.Match (DT, 범위 ("B1 : Q1"), 0)

myvalue = WorksheetFunction.Match(empid, Range("A5:A500"), 0) 

mypost = WorksheetFunction.Index(Range("B2:Q6"), myvalue, mydate) 

End Sub 
+0

코드를 올바르게 포맷하고 어떤 종류의 오류가 발생했는지 설명하십시오. –

+0

무엇이 오류입니까? [ask]를 읽으십시오. – Chris

+0

첫 번째 "mydate"오류가 워크 시트 기능 클래스 vba의 match 속성을 가져올 수 없습니다. 이 시점에서 코드가 중단됩니다. 어떻게 특정 라인을 디버깅하여 myvalue 값이 올바르게 나타나는지. – aji

답변

2

첫째는, WorksheetFunction.Match는 문자열을 반환하지; 숫자 (긴 정수) 또는 오류를 반환합니다. 경기의 값이 아니며 경기가 발견 된 행 또는 열 번호입니다.

다음으로 오류를 WorksheetFunction.Match와 일치하지 않는 것으로 잡을 수는 없지만 Application.Match을 변형으로 가져올 수 있습니다.

실제 날짜는 문자열이 아닌 숫자입니다. 원시 기본 값은 다른 긴 정수입니다. 예 : 소수 부분이없는 양의 정수. 시간이 있거나 날짜 시간이 있다면 소수 부분을가집니다.

부모 워크 시트를 올바르게 확인하고 참조하십시오. do not rely upon Select or Activate.

MATCH에서 반환 된 숫자는 내의 위치이며 검색된 셀 범위입니다. 행 5에서 행 500까지의 행 번호를 찾고 그 행 번호를 사용하여 행 2에서 6 사이의 행을 찾습니다. 원본에서 행 9 (6 이상을 반환하는 일치) 위의 일치는 범위를 벗어납니다.

empid 값이 숫자 인 경우 숫자를 처리하십시오. 당신은 텍스트처럼 보이는 숫자에서 참된 숫자를 찾을 수 없습니다. 예 : 99 <> "99". empid은 영숫자가 아니고 실제 숫자가 아니어야한다고 가정하겠습니다.하지만 이전 변수 할당에 오류가 있으면 올바른 할당을 결정하는 것은 사용자의 몫입니다.

오류 제어 서브 프로 시저 (여기서는 샘플 데이터가 표시되지 않았 음)에서 가장 잘 추측합니다.

Option Explicit 

Sub Post_Attendance() 

'On Error Resume Next 

    Dim myvalueRow As Variant, mydateCol As Variant, dt As Long, empid As String, mypost As Variant 

    dt = Worksheets("DB").Range("C7").Value2 
    empid = Worksheets("DB").Range("C8").Value2 

    With Worksheets(Left(Worksheets("DB").Range("A7").Value2, 3)) 
     'locate the column for the date 
     mydateCol = Application.Match(dt, .Range("B1:Q1"), 0) 
     If IsError(mydateCol) Then _ 
      mydateCol = Application.Match(CStr(Worksheets("DB").Range("C7").Value2), .Range("B1:Q1"), 0) 
     If IsError(mydateCol) Then 
      Debug.Print "dt not found in row 1" 
      Exit Sub 
     End If 

     'locate the row for the value 
     myvalueRow = Application.Match(empid, .Columns("A"), 0) 
     If IsError(myvalueRow) Then 
      Debug.Print "empid not found in column A" 
      Exit Sub 
     End If 

     mypost = Application.Index(.Range("B:Q"), myvalueRow, mydateCol) 
    End With 

End Sub 
+0

'Range ("B1 : Q1")'은 .Range ("B1 : Q1")'이어야합니다. 위의 수정 및 고정. – Jeeped