2017-11-02 4 views
0

나는 아마추어 vba 코더입니다. 루프에서 세 번째 시간이 실행될 때 일치 함수가 "1004, 워크 시트 기능의 일치 속성을 가져올 수 없습니다."오류를 발생시키는 이유를 파악하려고합니다.Excel VBA - 일치 함수에서 루프 오류가 발생합니다.

내 코드는 다음과 같습니다

Sub com_emp() 
'Defining variables 
Application.Run "set_var" 
c_row_now = db_r_datastart 
row_now = ce_r_datastart 

Do While cy.Cells(c_row_now, db_c_ident) <> "" 
On Error GoTo skip_emp 'In case employee is not found in historical, error redirect 

    h_row_now = Application.WorksheetFunction.Match(cy.Cells(c_row_now, db_c_ident), hy.Columns(db_c_ident), 0) 

    If h_row_now > 0 And hy.Cells(h_row_now, db_c_englev) <> "" Then 'If person is found and also has engagement level 

     ce.Cells(row_now, ce_c_ident) = cy.Cells(c_row_now, db_c_ident) 
     ce.Cells(row_now, ce_c_his_englev) = hy.Cells(h_row_now, db_c_englev) 
     ce.Cells(row_now, ce_c_his_eng) = hy.Cells(h_row_now, db_c_eng) 
     ce.Cells(row_now, ce_c_cur_englev) = cy.Cells(c_row_now, db_c_englev) 
     ce.Cells(row_now, ce_c_cur_eng) = cy.Cells(c_row_now, db_c_eng) 
     ce.Cells(row_now, ce_c_lev1) = cy.Cells(c_row_now, db_c_lev1) 
     ce.Cells(row_now, ce_c_lev2) = cy.Cells(c_row_now, db_c_lev2) 
     ce.Cells(row_now, ce_c_lev3) = cy.Cells(c_row_now, db_c_lev3) 
     ce.Cells(row_now, ce_c_lev4) = cy.Cells(c_row_now, db_c_lev4) 
     ce.Cells(row_now, ce_c_lev5) = cy.Cells(c_row_now, db_c_lev5) 

     row_now = row_now + 1 
    End If 


skip_emp: 
c_row_now = c_row_now + 1 
Loop 

End Sub 

나는 세트를 다른 매크로에 의해 사용되는 몇 가지 전역 변수를 호출하고 함수입니다.

'''''DECLARATIONS''''' 
'Current and Historical Year Sheet 
Public db_c_ident As Integer 
Public db_c_say1 As Integer 
Public db_c_say2 As Integer 
Public db_c_stay1 As Integer 
Public db_c_stay2 As Integer 
Public db_c_strive1 As Integer 
Public db_c_strive2 As Integer 
Public db_c_lev1 As Integer 
Public db_c_lev2 As Integer 
Public db_c_lev3 As Integer 
Public db_c_lev4 As Integer 
Public db_c_lev5 As Integer 
Public db_c_avg As Integer 
Public db_c_englev As Integer 
Public db_c_eng As Integer 

'Common Employees 
Public ce_r_datastart As Integer 
Public ce_c_ident As Integer 
Public ce_c_his_englev As Integer 
Public ce_c_his_eng As Integer 
Public ce_c_cur_englev As Integer 
Public ce_c_cur_eng As Integer 
Public ce_c_lev1 As Integer 
Public ce_c_lev2 As Integer 
Public ce_c_lev3 As Integer 
Public ce_c_lev4 As Integer 
Public ce_c_lev5 As Integer 

'Workbook, Sheets and other stuff 
Public cy As Worksheet 
Public hy As Worksheet 
Public ce As Worksheet 
Public bck As Worksheet 



'Variables 
Public db_r_datastart As Long 
Public row_now As Long 
Public h_row_now As Long 
Public c_row_now As Long 

''''Global Value Pick''''' 
Private Sub set_var() 

'Workbook, Sheets and other stuff 
Set cy = ThisWorkbook.Worksheets("Current Year") 
Set hy = ThisWorkbook.Worksheets("Historical Year") 
Set ce = ThisWorkbook.Worksheets("Common") 
Set bck = ThisWorkbook.Worksheets("Backend") 

'Current and Historical Year Sheet 
db_r_datastart = bck.Cells(4, 3) 
db_c_ident = bck.Cells(5, 3) 
db_c_say1 = bck.Cells(6, 3) 
db_c_say2 = bck.Cells(7, 3) 
db_c_stay1 = bck.Cells(8, 3) 
db_c_stay2 = bck.Cells(9, 3) 
db_c_strive1 = bck.Cells(10, 3) 
db_c_strive2 = bck.Cells(11, 3) 
db_c_lev1 = bck.Cells(12, 3) 
db_c_lev2 = bck.Cells(13, 3) 
db_c_lev3 = bck.Cells(14, 3) 
db_c_lev4 = bck.Cells(15, 3) 
db_c_lev5 = bck.Cells(16, 3) 
db_c_avg = bck.Cells(17, 3) 
db_c_englev = bck.Cells(18, 3) 
db_c_eng = bck.Cells(19, 3) 

'Common Employees 
ce_r_datastart = bck.Cells(31, 3) 
ce_c_ident = bck.Cells(32, 3) 
ce_c_his_englev = bck.Cells(33, 3) 
ce_c_his_eng = bck.Cells(34, 3) 
ce_c_cur_englev = bck.Cells(35, 3) 
ce_c_cur_eng = bck.Cells(36, 3) 
ce_c_lev1 = bck.Cells(37, 3) 
ce_c_lev2 = bck.Cells(38, 3) 
ce_c_lev3 = bck.Cells(39, 3) 
ce_c_lev4 = bck.Cells(40, 3) 
ce_c_lev5 = bck.Cells(41, 3) 


End Sub 

나는 방금 배운만큼 코드가 효율적이지 않을 수 있으므로 어떤 권장 사항도 인정 될 것입니다.

+0

당신은'오류에 고토 skip_emp'을 가지고 있지만 : 당신이 할 때마다 오류를 직접 처리하기 위해 더 좋을 것이다, 그러나

Sub com_emp() '... Do While cy.Cells(c_row_now, db_c_ident) <> "" On Error GoTo myErrHandler 'In case employee is not found in historical, error redirect h_row_now = Application.WorksheetFunction.Match(cy.Cells(c_row_now, db_c_ident), hy.Columns(db_c_ident), 0) '... skip_emp: c_row_now = c_row_now + 1 Loop Exit Sub myErrHandler: Resume skip_emp ' Finish error handling mode, resume normal mode End Sub 

: 코드는 같은 모양 안 오류가 발생하면 'Resume'을 정상적으로 처리하므로 "오류 처리"모드가 계속됩니다. 따라서 첫 번째 또는 두 번째 반복에서 오류가 있었고 "오류 처리"모드에서 세 번째 반복에서 오류가 발생했기 때문에 루프를 통해 세 번째 오류가 발생했을 수 있습니다. – YowE3K

답변

1

On Error 문을 사용하려면 오류를 올바르게 처리해야합니다. 당신을 아무

Sub com_emp() 
    Dim h_row_now As Variant ' to allow it to accept an error value 
          ' Note: This declaration will "shadow" the public-scoped one 
          ' but it looks like you are just using it here as a 
          ' temporary variable anyway 
    'Defining variables 
    'Application.Run "set_var" ' Shouldn't need to "Run" the other sub. 
    set_var      ' Just invoke it. 
    c_row_now = db_r_datastart 
    row_now = ce_r_datastart 

    Do While cy.Cells(c_row_now, db_c_ident) <> "" 

     h_row_now = Application.Match(cy.Cells(c_row_now, db_c_ident), hy.Columns(db_c_ident), 0) 
     If Not IsError(h_row_now) Then ' only process if a match was found 

      If hy.Cells(h_row_now, db_c_englev) <> "" Then 'If person is found and also has engagement level 

       ce.Cells(row_now, ce_c_ident) = cy.Cells(c_row_now, db_c_ident) 
       ce.Cells(row_now, ce_c_his_englev) = hy.Cells(h_row_now, db_c_englev) 
       ce.Cells(row_now, ce_c_his_eng) = hy.Cells(h_row_now, db_c_eng) 
       ce.Cells(row_now, ce_c_cur_englev) = cy.Cells(c_row_now, db_c_englev) 
       ce.Cells(row_now, ce_c_cur_eng) = cy.Cells(c_row_now, db_c_eng) 
       ce.Cells(row_now, ce_c_lev1) = cy.Cells(c_row_now, db_c_lev1) 
       ce.Cells(row_now, ce_c_lev2) = cy.Cells(c_row_now, db_c_lev2) 
       ce.Cells(row_now, ce_c_lev3) = cy.Cells(c_row_now, db_c_lev3) 
       ce.Cells(row_now, ce_c_lev4) = cy.Cells(c_row_now, db_c_lev4) 
       ce.Cells(row_now, ce_c_lev5) = cy.Cells(c_row_now, db_c_lev5) 

       row_now = row_now + 1 
      End If 
     End If 
     c_row_now = c_row_now + 1 
    Loop 

End Sub 
+0

그것은 매력처럼 작동했습니다! 정말 고맙습니다. 그것은 훌륭한 정보입니다. 당신은 전설입니다. – someonecalledsukhjit